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-Key: 281377

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

Printed on: April 24, 2024 at 06:04 o'clock

Mitglied: 114757
114757 Aug 28, 2015 updated at 09:46:43 (UTC)
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
Member: Bugger
Bugger Aug 28, 2015 at 10:08:27 (UTC)
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
Mitglied: 114757
114757 Aug 28, 2015 updated at 10:13:47 (UTC)
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
Member: Bugger
Bugger Aug 28, 2015 at 10:28:49 (UTC)
Goto Top
Meinst du, ich soll den $x Befehl in die $OKButton function packen? Weil das funktioniert auch nicht.^^
Mitglied: 114757
114757 Aug 28, 2015 updated at 11:05:58 (UTC)
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.
Member: Bugger
Bugger Aug 28, 2015 updated at 11:09:58 (UTC)
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
Mitglied: 114757
Solution 114757 Aug 28, 2015, updated at Aug 31, 2015 at 07:09:29 (UTC)
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()
Member: Bugger
Bugger Aug 28, 2015 at 12:28:18 (UTC)
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
Mitglied: 122990
Solution 122990 Aug 28, 2015, updated at Aug 31, 2015 at 07:09:13 (UTC)
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
Member: Bugger
Bugger Aug 28, 2015 updated at 14:18:53 (UTC)
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?
Mitglied: 122990
122990 Aug 28, 2015 at 15:13:34 (UTC)
Goto Top
$error.clear()
Member: Bugger
Bugger Aug 31, 2015 at 07:09:06 (UTC)
Goto Top
Funktioniert, vielen Dank!