135531
Goto Top

PowerShell GUI "Start" Knopf, Befehl richtig zuweisen

Hi @all,

ich bin momentan dabei eine PowerShell GUI zu bauen um den Standardrucker zu ändern (Die Idee ist aus langeweile entstanden face-big-smile ). Ich habe mich einfach mal dran gesetzt, ohne jegliche Grundkenntnisse übers "Skripten" mit der PowerShell. Das Skript läuft auch genau so wie es sollte. Mit Außnahme des Befehls den Drucker zu ändern....

Das Ziel ist den Drucker in der ComboBox auszuwählen und mit dem betätigen des "Start"-Knopfes den ausgewählten Drucker als Standarddrucker festzulegen.

Nachdem ich das Skript ausgeführt habe, gibt es Keine Fehlermeldung, allerdings ist der Standarddrucker immernoch derselbe.. Es hat sich also nichts getan..

Nach langem hin und her, und gefühlt 1000 versuchten Variationen gehen mir die Ideen aus. Worin liegt mein Fehler, bzw. was mache ich Falsch?

Der "Start"-Knopf :

$StartButton = New-Object System.Windows.Forms.Button
$StartButton.Location = New-Object System.Drawing.Size(400,100)
$StartButton.Size = New-Object System.Drawing.Size (75,25)
$StartButton.Text = "Start"  
$StartButton.Add_Click(
{
    $printer = $objComboBoxD.SelectedItem
    $printers = Get-Printer | ?{$_.FriendlyName -eq $printer}
    If($printers)
    {
        (Get-WmiObject -Query "Select * from Win32_Printer Where Name = '$printers'").setDefaultPrinter()  

        Write-Host "Der Standarddrucker wurde erfolgreich geändert."  
    }
    Else
    {
        Write-Warning "Der Drucker kann nicht gefunden werden"  
    }
})

$objForm.Controls.Add($StartButton)

Der komplette Code sieht derzeit so aus :

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
$objForm = New-Object System.Windows.Forms.Form
$objForm.BackColor = "White"  
$objForm.BackgroundImageLayout = 1
$objForm.BackgroundImage = [System.Drawing.Image]::FromFile('C:\Users\jannikr\Pictures\Microsoft-Logo.jpg')  
$objForm.StartPosition = "CenterScreen"  
$objForm.Size = New-Object System.Drawing.Size(600,600)
$objForm.Text = "Standardrucker Festlegen"  

# Drucker Auswählen

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(50,50)
$objLabel.Size = New-Object System.Drawing.Size(200,50)
$objLabel.Text = "Bitte wählen sie einen Drucker aus:"  
$objForm.Controls.Add($objLabel)

$objComboBoxD = New-Object System.Windows.Forms.ComboBox
$objComboBoxD.Location = New-Object System.Drawing.Size(50,100)
$objComboBoxD.Size = New-Object System.Drawing.Size(200,50)
$objComboBoxD.Height = 70 
$objForm.Controls.Add($objComboBoxD)
$objForm.TopMost = $true

#Drucker-Auflisten

$objForm.Add_Load({
    $objComboBoxD.Items.AddRange((Get-Printer | select -Expand Name))
})
$objComboBoxD.Add_SelectedIndexChanged({
    [System.Windows.Forms.MessageBox]::Show((Get-Printer -Name $objComboBoxD.SelectedItem | fl * | out-string))
})

# Start-Knopf --> Drucker festlegen

$StartButton = New-Object System.Windows.Forms.Button
$StartButton.Location = New-Object System.Drawing.Size(400,100)
$StartButton.Size = New-Object System.Drawing.Size (75,25)
$StartButton.Text = "Start"  
$StartButton.Add_Click(
{
    $printer = $objComboBoxD.SelectedItem
    $printers = Get-Printer | ?{$_.FriendlyName -eq $printer}
    If($printers)
    {
        (Get-WmiObject -Query "Select * from Win32_Printer Where Name = '$printers'").setDefaultPrinter()  

        Write-Host "Der Standarddrucker wurde erfolgreich geändert."  
    }
    Else
    {
        Write-Warning "Der Drucker kann nicht gefunden werden"  
    }
})

$objForm.Controls.Add($StartButton)

# Abbrechen-Knopf --> Vorgang beenden

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(400,150)
$CancelButton.Size = New-Object System.Drawing.Size(75,25)
$CancelButton.Text = "Abbrechen"  
$CancelButton.Name = "Abbrechen"  
$CancelButton.DialogResult = "Cancel"  
$CancelButton.Add_Click(
{
$objForm.Close()
    [System.Windows.Forms.MessageBox]::Show(("Der Vorgang wurde abgebrochen"))  
})
$objForm.Controls.Add($CancelButton)

# KeyDown Event (Enter and Escape)

$objForm.KeyPreview = $true
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$objForm.DialogResult = "OK";$objForm.Close()} })  
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")  
{
$objForm.DialogResult = "Cancel";$objForm.Close()}   
    [System.Windows.Forms.MessageBox]::Show(("Der Vorgang wurde abgebrochen"))  
})

[void] $objForm.ShowDialog($objForm.Dialog.Result)

Content-Key: 367921

Url: https://administrator.de/contentid/367921

Printed on: April 23, 2024 at 22:04 o'clock

Member: AndreasHoster
Solution AndreasHoster Mar 13, 2018 at 16:30:21 (UTC)
Goto Top
Ich weiß ja nicht wie Du einen Test Deines Programms machst, ich kriege zuerst mal die Warnung, das er den Drucker nicht findet.
Das kommt aus Zeile 44, es gibt kein Attribut FriendlyName bei den Objekten von Get-Printer (zumindestens nicht bei Win 8.1)
Also Zeile 44 so:
$printers = Get-Printer | ?{$_.Name -eq $printer} 
Dann spuckt er mir folgenden Fehler aus:
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In Zeile:45 Zeichen:9
+         (Get-WmiObject -Query "Select * from Win32_Printer Where Name = '$printe ...  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
Wenn man jetzt nach oder vor Deinem SetDefaultPrinter noch eine write-host $printer setzt, dann weiß man auch warum:
write-host $printer liefert nämlich als Ergebnis:
MSFT_Printer (Name = "Fax", ComputerName = "", Type = 0)

=> $printer ist ein Objekt und kein String, deswegen klappt auch der Select nicht.
Also den Namen aus dem Objekt holen und dann das Select mit dem Namen machen.

Dann sollte es gehen.
Mitglied: 135531
135531 Mar 14, 2018 at 08:18:29 (UTC)
Goto Top
Zitat von @AndreasHoster:

Ich weiß ja nicht wie Du einen Test Deines Programms machst, ich kriege zuerst mal die Warnung, das er den Drucker nicht findet.
Das kommt aus Zeile 44, es gibt kein Attribut FriendlyName bei den Objekten von Get-Printer (zumindestens nicht bei Win 8.1)

=> $printer ist ein Objekt und kein String, deswegen klappt auch der Select nicht.
Also den Namen aus dem Objekt holen und dann das Select mit dem Namen machen.

Dann sollte es gehen.

Ersteinmal Danke für den Hinweis, dass es das Attribut Friendly Name unter Win8.1 Get-Printer Objekten nicht gibt.

Aber wie genau hole ich nun den Namen aus dem Objekt, und mache dann das select mit dem Namen? Wie gesagt, ich habe leider kaum Grundkenntnisse in diesem Thema...

lg Jannik
Member: AndreasHoster
Solution AndreasHoster Mar 14, 2018 at 08:51:14 (UTC)
Goto Top
$printername = $Printers.Name
(Get-WmiObject -Query "Select * from Win32_Printer Where Name = '$printername'").setDefaultPrinter()   

Ginge auch in einer Zeile:
(Get-WmiObject -Query "Select * from Win32_Printer Where Name = '$($Printers.Name)'").setDefaultPrinter()   

Und was es für Attribute und Methoden gibt, da hilft Get-Member bzw. die IntelliSense Funktion der Powershell ISE.
Die zeigt bei einem Objekt, wenn man den Punkt setzt und ein paar Millisekunden wartet, alle Attribute und Methoden an.