bugger
Goto Top

Powershell Befehl ausführen mit GUI u. Consolen Umleitung zu Textbox?

Hallo,

ich habe zwei Fragen:

1. Wenn ich auf den OK Button drücke passiert nichts, erst wenn die GUI geschlossen wird, wird der Befehl auch ausgeführt. Wie muss das aussehen, damit er die GUI offen lässt und den Befehl trotzdem ausführt?

2. Der Befehl der ausgeführt wird bzw. alles was normalerweise im Consolenfenster erscheint soll in einer Textbox in der GUI auftauchen, sodass das Consolen Fenster komplett ausgeblendet werden kann. Geht das?

Danke im Voraus

Add-Type -Name Window -Namespace Console -MemberDefinition '  
[DllImport("Kernel32.dll")]  
public static extern IntPtr GetConsoleWindow();
 
[DllImport("user32.dll")]  
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'   
#[void] [Console.Window]::ShowWindow([Console.Window]::GetConsoleWindow(), 0)

write-host "Loading..." -ForegroundColor Red  

$x = @()

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Data Entry Form"  
$objForm.Size = New-Object System.Drawing.Size(600,200) 
$objForm.StartPosition = "CenterScreen"  

$objForm.AutoSize = $True
$objForm.AutoSizeMode = "GrowAndShrink"  

$objForm.KeyPreview = $True

$objForm.Add_KeyDown({
    if ($_.KeyCode -eq "Enter") {  
        $script:x = $objListbox.SelectedItems
        $objForm.Close()
    }
})

$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")   
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,220)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"  

$OKButton.Add_Click(
   {
       $script:x = $objListbox.SelectedItems
	   $objForm.Close()
   })

$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(300,40) 
$objTextBox.Size = New-Object System.Drawing.Size(200,500)
$objTextbox.Multiline = $true
$objForm.Controls.Add($objTextBox)

$objForm.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,220)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"  
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Please make a selection from the list below:"  
$objForm.Controls.Add($objLabel) 

$objListbox = New-Object System.Windows.Forms.Listbox 
$objListbox.Location = New-Object System.Drawing.Size(10,40) 
$objListbox.Size = New-Object System.Drawing.Size(260,20) 

$objListbox.SelectionMode = "MultiExtended"  

$trennstriche = @('----------Test-Eintrag----------','','Test2')  

$objListBox.Items.AddRange(@(
"Item 1"  
"Item 2"  
"Item 3"  
$trennstriche
"Item 4"  
"Item 5"  
$trennstriche
"Item 6"  
$trennstriche[1]
"Item 7"  
$trennstriche
"Item 8"  
$trennstriche[2]
"Item 9"  
))

$objListbox.Height = 170

$objListbox.add_SelectedIndexChanged({
   $objListbox.SelectedIndices | ?{$objListbox.GetSelected($_) -and $objListbox.Items[$_] -in $trennstriche} | %{$objListbox.SetSelected($_,$false)}
})

$objForm.Controls.Add($objListbox) 

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

$x
write-Output "Fertig"  

Content-ID: 281377

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

Ausgedruckt am: 11.12.2024 um 21:12 Uhr

114757
114757 28.08.2015 aktualisiert um 11:46:43 Uhr
Goto Top
Moin,
Zitat von @Bugger:
1. Wenn ich auf den OK Button drücke passiert nichts, erst wenn die GUI geschlossen wird, wird der Befehl auch
ausgeführt.
Wenn der Befehl nach dem $objForm.ShowDialog() steht, ist das normal, da das eine Blocking-Function ist, bis die GUI geschlossen wurde.
Wie muss das aussehen, damit er die GUI offen lässt und den Befehl trotzdem ausführt?
Den Befehl einfach in einer deiner Functions ausführen ...
2. Der Befehl der ausgeführt wird bzw. alles was normalerweise im Consolenfenster erscheint soll in einer Textbox in der GUI
auftauchen, sodass das Consolen Fenster komplett ausgeblendet werden kann. Geht das?
SImples Beispiel mit einem Konsolen Ping ...
$output = &"ping.exe" '-n' '1' '8.8.8.8'  
$objTextBox.Text = $output
Du kannst aber auch den Output jeden anderen Befehls an die Textbox leiten, du musst nur am Ende die Ausgabe in einen String umwandeln wenn die Ausgabe noch ein Objekt ist:
$objTextBox.Text = Get-Process | out-string
Gruß jodel
Bugger
Bugger 28.08.2015 um 12:08:27 Uhr
Goto Top
Hi,

erst einmal danke, für deine erneute Hilfe. Vielleicht liegt es ja daran, dass heute Freitag ist, aber ich raffs nicht.^^

Wo soll der $objForm.ShowDialog() Befehl hin? Wenn der wo anders ist, geht ja gar kein Fenster mehr auf...

Und das was in der Textbox landen soll, soll alles umfassen auch die Write-Host Befehle etc. Kannst du das beides irgendwie mit dem Beispielscript veranschaulichen? face-smile
114757
114757 28.08.2015 aktualisiert um 12:13:47 Uhr
Goto Top
Zitat von @Bugger:
erst einmal danke, für deine erneute Hilfe. Vielleicht liegt es ja daran, dass heute Freitag ist, aber ich raffs nicht.^^
Jupp
Wo soll der $objForm.ShowDialog() Befehl hin? Wenn der wo anders ist, geht ja gar kein Fenster mehr auf...
Nirgendwo hin der bleibt wo er ist
Und das was in der Textbox landen soll, soll alles umfassen auch die Write-Host Befehle etc. Kannst du das beides irgendwie mit
dem Beispielscript veranschaulichen? face-smile
Oh man heut is echt Freitag ... Kopp anstrengen face-wink
Bugger
Bugger 28.08.2015 um 12:28:49 Uhr
Goto Top
Meinst du, ich soll den $x Befehl in die $OKButton function packen? Weil das funktioniert auch nicht.^^
114757
114757 28.08.2015 aktualisiert um 13:05:58 Uhr
Goto Top
Ich habe doch oben schon geschrieben das du alles was du in die Texbox ausgeben willst in einen STRING umwandeln musst, und $x ist kein String sondern ein Array. Das kannst du entweder mit dem CMDLet out-string machen.
$objTextBox.Text = $script:x | out-string
Das sind absolute Powershell Grundlagen die du dir erst mal reinpfeiffen solltest bevor du dich an eine GUI gibst.
Bugger
Bugger 28.08.2015 aktualisiert um 13:09:58 Uhr
Goto Top
Meine letzte Antwort bezog sich auf das offen lassen des GUI Fensterns, bevor das nicht funktioniert, brauche ich auch keine ausgaben in der Textbox. Ich bin eher so der Bastler was Powershell angeht.^^ Mein Script hat jetzt etwas über 900 Zeilen mit allen möglichen Funktionen und Knöpfen, zusammen gebastelt mit Try&Error und dem ListBox Beispiel von Micrsoft sowie kleineren Tweaks bei denen du oder andere hier mir geholfen haben. Und die beiden Sachen sind im Moment das letzte i-Tüpfelchen was mir noch fehlt.
Also ja, ich habe keinen Plan davon wie ich die GUI offen lassen kann oder ein Array oder andere Befehle in dem Script oben zu einem String machen kann, deswegen steht meine Frage ja hier face-wink Ich mache halt lieber erst den 5ten Schritt bevor ich den ersten mache, dass ist bei uns Firmenphilosophie xD
114757
Lösung 114757 28.08.2015, aktualisiert am 31.08.2015 um 09:09:29 Uhr
Goto Top
Na dann wünsch ich den Usern die das gebastel nutzen müssen viel Spaß ;-P oh hauahauahaaa....

Und tschüss ...
Add-Type -Name Window -Namespace Console -MemberDefinition '  
[DllImport("Kernel32.dll")]  
public static extern IntPtr GetConsoleWindow();
 
[DllImport("user32.dll")]  
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'   
#[void] [Console.Window]::ShowWindow([Console.Window]::GetConsoleWindow(), 0)

write-host "Loading..." -ForegroundColor Red  

$x = @()

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Data Entry Form"  
$objForm.Size = New-Object System.Drawing.Size(600,200) 
$objForm.StartPosition = "CenterScreen"  

$objForm.AutoSize = $True
$objForm.AutoSizeMode = "GrowAndShrink"  

$objForm.KeyPreview = $True

$objForm.Add_KeyDown({
    if ($_.KeyCode -eq "Enter") {  
        $script:x = $objListbox.SelectedItems
        $objForm.Close()
    }
})

$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")   
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,220)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"  

$OKButton.Add_Click(
   {
       $script:x = $objListbox.SelectedItems
       # Items ausgeben
       $objTextBox.Text = $script:x | out-string
       # Einfachen Text in der Box ergänzen
       $objTextBox.Text += "Blablablablabla"  
       $objTextBox.Text += "Blablablablabla 2"  
       $objTextBox.Text += "Blablablablabla 3"  
       # Ausgabe eines Befehls ausgeben
       $objTextBox.Text += gci | out-string
       # usw.
   })

$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(300,40) 
$objTextBox.Size = New-Object System.Drawing.Size(200,500)
$objTextbox.Multiline = $true
$objForm.Controls.Add($objTextBox)

$objForm.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,220)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"  
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Please make a selection from the list below:"  
$objForm.Controls.Add($objLabel) 

$objListbox = New-Object System.Windows.Forms.Listbox 
$objListbox.Location = New-Object System.Drawing.Size(10,40) 
$objListbox.Size = New-Object System.Drawing.Size(260,20) 

$objListbox.SelectionMode = "MultiExtended"  

$trennstriche = @('----------Test-Eintrag----------','','Test2')  

$objListBox.Items.AddRange(@(
"Item 1"  
"Item 2"  
"Item 3"  
$trennstriche
"Item 4"  
"Item 5"  
$trennstriche
"Item 6"  
$trennstriche[1]
"Item 7"  
$trennstriche
"Item 8"  
$trennstriche[2]
"Item 9"  
))

$objListbox.Height = 170

$objListbox.add_SelectedIndexChanged({
   $objListbox.SelectedIndices | ?{$objListbox.GetSelected($_) -and $objListbox.Items[$_] -in $trennstriche} | %{$objListbox.SetSelected($_,$false)}
})

$objForm.Controls.Add($objListbox) 

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
Bugger
Bugger 28.08.2015 um 14:28:18 Uhr
Goto Top
Danke, funktioniert jetzt. Und es ist zwar gebastelt, funktioniert aber super, also keinen Grund sich darüber lustig zu machen, jeder hat mal klein angefangen face-sad

Vielleicht magst du mir noch verraten, wie ich alle anderen Meldungen (2>&1 müsste das dann ja sein) in die Textbox bekomme, dann bist du mich auch erstmal los face-wink
122990
Lösung 122990 28.08.2015, aktualisiert am 31.08.2015 um 09:09:13 Uhr
Goto Top
Moin,
Schau dir mal die Common Parameters an die so gut wie jeder Befehl hat:
http://ss64.com/ps/common.html

Dann sollte's klick machen face-wink

Gruß grexit
Bugger
Bugger 28.08.2015 aktualisiert um 16:18:53 Uhr
Goto Top
OK hat klick gemacht, danke face-wink

Wenn ich allerdings $objTextBox.Text = "$Error" im Script habe, und ein weiterer Error auftritt, dann zählt er die vorherigen Fehler ebenfalls auf, kann man das irgendwie unterbinden?
122990
122990 28.08.2015 um 17:13:34 Uhr
Goto Top
$error.clear()
Bugger
Bugger 31.08.2015 um 09:09:06 Uhr
Goto Top
Funktioniert, vielen Dank!