dispatcher
Goto Top

Powershell: Output Skript nach Textbox

Guten Morgen Zusammen,

ich habe eine Powershell Gui gebaut, mit mehreren Comboboxen (im Code unten jetzt nur eine) und einer Textbox. In diesen Comboboxen gibt es mehrere Skripte zur Auswahl. Die Skripte liegen als separate .ps1 Skripte auf einem Server.
Wählt man jetzt ein Skript aus und klickt auf Ausführen startet das Skript in einem separaten Fenster...ist ja normal.
Jetzt habe ich ein 2 Fragen.
  • Wie müsste ich meine GUI jetzt anpassen, damit das ausgewählte Skript nicht in einem separaten Fenster läuft sondern in der Textbox?
  • Einige Skripte erwarten eine Eingabe vom User bspw. IP Adresse etc. Ist das mit Eingabe in der Textbox möglich?

Vielen Dank im Voraus.

$objForm                 = New-Object System.Windows.Forms.Form
$objForm.Size            = New-Object System.Drawing.Size(950,680)
$objForm.BackColor       = "Black"  
$objForm.StartPosition   = "CenterScreen"  
$objForm.FormBorderStyle = 'Fixed3D'  
$objForm.MaximizeBox     = $false
$objForm.KeyPreview      = $True
$objForm.Topmost         = $false

$objTextbox         = New-Object System.Windows.Forms.TextBox
$objTextbox.Location = New-Object System.Drawing.Size(350,10)
$objTextbox.Size     = New-Object System.Drawing.Size(550,400)
$objTextbox.Multiline = $true
$objTextbox.TabIndex = 1
$objForm.Controls.Add($objTextbox)

$OKButton              = New-Object System.Windows.Forms.Button
$OKButton.Location     = New-Object System.Drawing.Size(10,370)
$OKButton.Size         = New-Object System.Drawing.Size(50,23)
$OKButton.Text         = "AUSFÜHREN"  
$OKbutton.Cursor       = [System.Windows.Forms.Cursors]::Hand
$OKbutton.Font         = "Arial,8,style=bold"  
$OKbutton.AutoSize     = $true
$OKbutton.ForeColor    = "White"  
$OKbutton.backColor    = "Green"  
$OKbutton.Width        = 320
$OKbutton.Height       = 40

$OKButton.Add_Click({ 
     $selected = $objCombobox.SelectedItem
     $script:x += $objCombobox.SelectedItem
     if (![string]::IsNullOrWhiteSpace($selected)) {
        #$objLabel.Text = "Performing action $($selected)"  
        switch ($selected) {   
            "Skript 1"                                     {start-process "\\server1\folder1\skript1.ps1"}   
            "Skript 2"                                     {start-process "\\server1\folder2\skript2.ps1"}   
            
        }
        $objLabel.Text = "INSTALLATIONEN"  
        $objCombobox.SelectedIndex = -1   
    }
})
$objForm.Controls.Add($OKButton)

$objLabel           = New-Object System.Windows.Forms.Label
$objLabel.Location  = New-Object System.Drawing.Size(10,120)
$objLabel.Size      = New-Object System.Drawing.Size(280,20)
$objLabel.Text      = "INSTALLATIONEN"  
$objLabel.Forecolor = "White"   
$objLabel.Backcolor = "Transparent"  
$objLabel.Font      = "Arial,8,style=bold"  
$objForm.Controls.Add($objLabel) 

$objCombobox          = New-Object System.Windows.Forms.Combobox
$objCombobox.Text     = "Bitte auswählen...."  
$objCombobox.Location = New-Object System.Drawing.Size(10,140)
$objCombobox.Size     = New-Object System.Drawing.Size(320,20)
$objCombobox.Height   = 500

[void] $objCombobox.Items.Add("Skript 1")  
[void] $objCombobox.Items.Add("Skript 2")  

$objForm.Controls.Add($objCombobox) 

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

Content-ID: 1464489959

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

Ausgedruckt am: 08.11.2024 um 21:11 Uhr

149569
149569 04.11.2021 aktualisiert um 11:24:17 Uhr
Goto Top
$result = Start-Job -FilePath "C:\test.ps1" -ArgumentList 'Blablub' | Receive-Job -Wait | out-string  
$result

C:\test.ps1
write-host "Parameter übergeben: $($args)"  
1..10 | %{
    write-host "Test $_"  
    sleep -Milliseconds 200
}

https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell. ...
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
dispatcher
dispatcher 04.11.2021 um 11:00:38 Uhr
Goto Top
@149569 danke für deine nachricht. Ich muss gestehen das ich dir nicht ganz folgen kann
149569
149569 04.11.2021 aktualisiert um 11:05:40 Uhr
Goto Top
Dann lies mal die Links (in Ruhe) dann kommst du dahinter.
dispatcher
dispatcher 04.11.2021 um 11:19:14 Uhr
Goto Top
mir ist bewusst was dort beschrieben wird, mir geht's wie gesagt nur darum die Ausgabe in meine GUI umzuleiten.
149569
149569 04.11.2021 aktualisiert um 11:38:21 Uhr
Goto Top
Zitat von @dispatcher:
mir ist bewusst was dort beschrieben wird,
Anscheinend nicht so ganz denn sonst hätte es längst geschnackelt face-smile...
mir geht's wie gesagt nur darum die Ausgabe in meine GUI umzuleiten.
Ja und? Was hindert dich daran die Variable von oben in die Textbox zu schreiben??
$result = Start-Job -FilePath "C:\test.ps1" | Receive-Job -Wait | out-string  
$objTextbox.Text = $result
Fertig. Sehe das Problem ehrlich gesagt nicht.

Wie du Parameter an ein Skript übergibst siehst du oben mit dem -Argumentlist Parameter und darunter die Nutzung des Parameters in den Skripten.

Wohl mal wieder ein Copy n paster am Werk, na denn viel Spaß ..

Add-Type -A System.Windows.Forms
$objForm                 = New-Object System.Windows.Forms.Form
$objForm.Size            = New-Object System.Drawing.Size(950,680)
$objForm.BackColor       = "Black"  
$objForm.StartPosition   = "CenterScreen"  
$objForm.FormBorderStyle = 'Fixed3D'  
$objForm.MaximizeBox     = $false
$objForm.KeyPreview      = $True
$objForm.Topmost         = $false

$objTextbox         = New-Object System.Windows.Forms.TextBox
$objTextbox.Location = New-Object System.Drawing.Size(350,10)
$objTextbox.Size     = New-Object System.Drawing.Size(550,400)
$objTextbox.Multiline = $true
$objTextbox.TabIndex = 1
$objForm.Controls.Add($objTextbox)

$OKButton              = New-Object System.Windows.Forms.Button
$OKButton.Location     = New-Object System.Drawing.Size(10,370)
$OKButton.Size         = New-Object System.Drawing.Size(50,23)
$OKButton.Text         = "AUSFÜHREN"  
$OKbutton.Cursor       = [System.Windows.Forms.Cursors]::Hand
$OKbutton.Font         = "Arial,8,style=bold"  
$OKbutton.AutoSize     = $true
$OKbutton.ForeColor    = "White"  
$OKbutton.backColor    = "Green"  
$OKbutton.Width        = 320
$OKbutton.Height       = 40

$OKButton.Add_Click({ 
     $selected = $objCombobox.SelectedItem
     $script:x += $objCombobox.SelectedItem
     if (![string]::IsNullOrWhiteSpace($selected)) {
        #$objLabel.Text = "Performing action $($selected)"  
        switch ($selected) {   
            "Skript 1" {  
                $OKButton.Text = "Skript läuft ..."  
                $OKButton.Enabled = $false
                $result = Start-Job -FilePath "\\server1\folder1\skript1.ps1" -ArgumentList 'Blablub' | Receive-Job -wait | out-string  
                $objTextbox.Text = $result
                $OKButton.Text = "AUSFÜHREN"  
                $OKButton.Enabled = $true
            } 
        }
        $objLabel.Text = "INSTALLATIONEN"  
        $objCombobox.SelectedIndex = -1   
    }
})
$objForm.Controls.Add($OKButton)

$objLabel           = New-Object System.Windows.Forms.Label
$objLabel.Location  = New-Object System.Drawing.Size(10,120)
$objLabel.Size      = New-Object System.Drawing.Size(280,20)
$objLabel.Text      = "INSTALLATIONEN"  
$objLabel.Forecolor = "White"   
$objLabel.Backcolor = "Transparent"  
$objLabel.Font      = "Arial,8,style=bold"  
$objForm.Controls.Add($objLabel) 

$objCombobox          = New-Object System.Windows.Forms.Combobox
$objCombobox.Text     = "Bitte auswählen...."  
$objCombobox.Location = New-Object System.Drawing.Size(10,140)
$objCombobox.Size     = New-Object System.Drawing.Size(320,20)
$objCombobox.Height   = 500

[void] $objCombobox.Items.Add("Skript 1")  
[void] $objCombobox.Items.Add("Skript 2")  

$objForm.Controls.Add($objCombobox) 

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

Oder mit Live-Output

Add-Type -A System.Windows.Forms
$objForm                 = New-Object System.Windows.Forms.Form
$objForm.Size            = New-Object System.Drawing.Size(950,680)
$objForm.BackColor       = "Black"  
$objForm.StartPosition   = "CenterScreen"  
$objForm.FormBorderStyle = 'Fixed3D'  
$objForm.MaximizeBox     = $false
$objForm.KeyPreview      = $True
$objForm.Topmost         = $false

$objTextbox         = New-Object System.Windows.Forms.TextBox
$objTextbox.Location = New-Object System.Drawing.Size(350,10)
$objTextbox.Size     = New-Object System.Drawing.Size(550,400)
$objTextbox.Multiline = $true
$objTextbox.TabIndex = 1
$objForm.Controls.Add($objTextbox)

$OKButton              = New-Object System.Windows.Forms.Button
$OKButton.Location     = New-Object System.Drawing.Size(10,370)
$OKButton.Size         = New-Object System.Drawing.Size(50,23)
$OKButton.Text         = "AUSFÜHREN"  
$OKbutton.Cursor       = [System.Windows.Forms.Cursors]::Hand
$OKbutton.Font         = "Arial,8,style=bold"  
$OKbutton.AutoSize     = $true
$OKbutton.ForeColor    = "White"  
$OKbutton.backColor    = "Green"  
$OKbutton.Width        = 320
$OKbutton.Height       = 40

$OKButton.Add_Click({ 
     $selected = $objCombobox.SelectedItem
     $script:x += $objCombobox.SelectedItem
     if (![string]::IsNullOrWhiteSpace($selected)) {
        #$objLabel.Text = "Performing action $($selected)"  
        switch ($selected) {   
            "Skript 1" {  
                $pinfo = New-Object System.Diagnostics.ProcessStartInfo
                $pinfo.FileName = "powershell.exe"  
                $pinfo.Arguments = "-EP Bypass -File `"\\server1\folder1\skript1.ps1`""  
                $pinfo.UseShellExecute = $false
                $pinfo.CreateNoWindow = $true
                $pinfo.RedirectStandardOutput = $true
                $pinfo.RedirectStandardError = $true

                $process = New-Object System.Diagnostics.Process
                $process.StartInfo = $pinfo
                $process.Start() | out-null

                while(!$process.HasExited){
                    $line = $process.StandardOutput.ReadLine()
                    $objTextBox.Text += $line + "`r`n"  
                    $objTextBox.Update()
                }
            } 
        }
        $objLabel.Text = "INSTALLATIONEN"  
        $objCombobox.SelectedIndex = -1   
    }
})
$objForm.Controls.Add($OKButton)

$objLabel           = New-Object System.Windows.Forms.Label
$objLabel.Location  = New-Object System.Drawing.Size(10,120)
$objLabel.Size      = New-Object System.Drawing.Size(280,20)
$objLabel.Text      = "INSTALLATIONEN"  
$objLabel.Forecolor = "White"   
$objLabel.Backcolor = "Transparent"  
$objLabel.Font      = "Arial,8,style=bold"  
$objForm.Controls.Add($objLabel) 

$objCombobox          = New-Object System.Windows.Forms.Combobox
$objCombobox.Text     = "Bitte auswählen...."  
$objCombobox.Location = New-Object System.Drawing.Size(10,140)
$objCombobox.Size     = New-Object System.Drawing.Size(320,20)
$objCombobox.Height   = 500

[void] $objCombobox.Items.Add("Skript 1")  
[void] $objCombobox.Items.Add("Skript 2")  

$objForm.Controls.Add($objCombobox) 

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
dispatcher
dispatcher 04.11.2021 um 11:54:45 Uhr
Goto Top
nee nee... nix copy n paster am werk. zieh bitte nicht so voreilige schlüsse.
ich sehe, egal welches skript ich benutze keine ausgabe in der textbox. klar weißt du nicht welche skripte ich da starten möchte. daher ja auch meine frage ob es möglich ist eine ausgabe in der textbox zu haben auch wenn das zu startende skript eine eingabe verlangt. das ist nämlich bei einigen der fall.
149569
149569 04.11.2021 aktualisiert um 12:48:28 Uhr
Goto Top
Zitat von @dispatcher:
ich sehe, egal welches skript ich benutze keine ausgabe in der textbox. klar weißt du nicht welche skripte ich da starten möchte. daher ja auch meine frage ob es möglich ist eine ausgabe in der textbox zu haben auch wenn das zu startende skript eine eingabe verlangt. das ist nämlich bei einigen der fall.
Dann musst du die Skripte so anpassen das sie wie oben schon ganz zu beginn per Code beschrieben habe Übergabeparameter akzeptieren und diese dann als Eingabe nutzen und du diese dann dem Skript per -Argumentlist als Parameter übergibst. Ein Beispiel wie das geht steht im ersten Post.