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
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"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 281377
Url: https://administrator.de/contentid/281377
Ausgedruckt am: 11.12.2024 um 21:12 Uhr
12 Kommentare
Neuester Kommentar
Moin,
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:
Gruß jodel
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.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?
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 ...auftauchen, sodass das Consolen Fenster komplett ausgeblendet werden kann. Geht das?
$output = &"ping.exe" '-n' '1' '8.8.8.8'
$objTextBox.Text = $output
$objTextBox.Text = Get-Process | out-string
Zitat von @Bugger:
erst einmal danke, für deine erneute Hilfe. Vielleicht liegt es ja daran, dass heute Freitag ist, aber ich raffs nicht.^^
Jupperst 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...
Nirgendwo hin der bleibt wo er istUnd 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?
Oh man heut is echt Freitag ... Kopp anstrengen dem Beispielscript veranschaulichen?
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.
Das sind absolute Powershell Grundlagen die du dir erst mal reinpfeiffen solltest bevor du dich an eine GUI gibst.
$objTextBox.Text = $script:x | out-string
Na dann wünsch ich den Usern die das gebastel nutzen müssen viel Spaß ;-P oh hauahauahaaa....
Und tschüss ...
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()
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
Gruß grexit
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
Gruß grexit
$error.clear()