jannik2018
Goto Top

Powershell Listbox

Hallo zussammen,

ist es möglich weitere Powershell Skripte über die folgende Listbox auszuführen und wenn ja hat jemand einen Tipp für mich wie?
Beispielsweise für atl-dc-001

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Select a Computer'  
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'  

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'  
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'  
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please select a computer:'  
$form.Controls.Add($label)

$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,40)
$listBox.Size = New-Object System.Drawing.Size(260,20)
$listBox.Height = 80

[void] $listBox.Items.Add('atl-dc-001')  
[void] $listBox.Items.Add('atl-dc-002')  
[void] $listBox.Items.Add('atl-dc-003')  
[void] $listBox.Items.Add('atl-dc-004')  
[void] $listBox.Items.Add('atl-dc-005')  
[void] $listBox.Items.Add('atl-dc-006')  
[void] $listBox.Items.Add('atl-dc-007')  

$form.Controls.Add($listBox)

$form.Topmost = $true

$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $x = $listBox.SelectedItem
    $x
}

Grüße

Jannik

Content-ID: 1813265769

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

Printed on: October 9, 2024 at 17:10 o'clock

colinardo
colinardo Feb 02, 2022 updated at 17:06:54 (UTC)
Goto Top
Servus Jannik.
ginge z.B. auch per Doppelklick-Event der Listbox
# .....
$listbox.add_DoubleClick({
    if ($listbox.SelectedIndex -ne -1){
        [System.Windows.Forms.MessageBox]::Show("Starting skript for computer '$($listbox.SelectedItem)'.")  
        # change script path and uncomment following line
        # &"C:\another_script.ps1" 
    }
})
# .....
Oder eben am Ende mit
&"C:\another_script.ps1" -meinParameter $listBox.SelectedItem  
mit der Übergabe des Namen mittels Parameter an ein anderes Skript. Du kannst natürlich auch mit dem Namen aus der Listbox den Namen eines Skripts bilden, aber das kannst du ja handhaben wie du möchtest, wir kennen ja deinen gewünschten Workflow nicht.

Grüße Uwe
Jannik2018
Jannik2018 Feb 08, 2022 at 12:09:58 (UTC)
Goto Top
Zitat von @colinardo:

Servus Jannik.
ginge z.B. auch per Doppelklick-Event der Listbox
# .....
$listbox.add_DoubleClick({
    if ($listbox.SelectedIndex -ne -1){
        [System.Windows.Forms.MessageBox]::Show("Starting skript for computer '$($listbox.SelectedItem)'.")  
        # change script path and uncomment following line
        # &"C:\another_script.ps1" 
    }
})
# .....
Oder eben am Ende mit
&"C:\another_script.ps1" -meinParameter $listBox.SelectedItem  
mit der Übergabe des Namen mittels Parameter an ein anderes Skript. Du kannst natürlich auch mit dem Namen aus der Listbox den Namen eines Skripts bilden, aber das kannst du ja handhaben wie du möchtest, wir kennen ja deinen gewünschten Workflow nicht.

Grüße Uwe

Besten dank schonmal allerdings möchte ich Pro Listbox Item ein Skript ausführen wenn ich das entsprechend dort plaziere funktioniert es aber nicht wie muss es dann aussehen?
colinardo
Solution colinardo Feb 08, 2022 updated at 15:08:18 (UTC)
Goto Top
Zitat von @Jannik2018:
Besten dank schonmal allerdings möchte ich Pro Listbox Item ein Skript ausführen wenn ich das entsprechend dort plaziere funktioniert es aber nicht wie muss es dann aussehen?
Auch kein Problem da bietet sich bswp. eine Hashtable für die Zuordnung an. Du kannst diese Zuordnung natürlich bei Bedarf auch aus einer externen Datei lesen falls benötigt.
# Forms-Assembly laden
Add-Type -AssemblyName System.Windows.Forms

# Hashtable mit Listbox <> Skriptzuordnung
$scripts = [ordered]@{
    'atl-dc-001' = 'D:\test\script1.ps1'  
    'atl-dc-002' = 'D:\test\script2.ps1'  
    'atl-dc-003' = 'D:\test\script3.ps1'  
    'atl-dc-004' = 'D:\test\script4.ps1'  
    'atl-dc-005' = 'D:\test\script5.ps1'  
    'atl-dc-006' = 'D:\test\script6.ps1'  
}
# Controls erstellen ===========================
$form = New-Object System.Windows.Forms.Form -P @{
    Text = 'Select a Computer'  
    Size ='300,200'  
    StartPosition = 'CenterScreen'  
    Topmost = $true
}
$okButton  = New-Object System.Windows.Forms.Button -P @{
    Location = '75,120'  
    Size = '75,23'  
    DialogResult = [System.Windows.Forms.DialogResult]::OK
    Enabled = $false
    Text = 'OK'  
}
$cancelButton  = New-Object System.Windows.Forms.Button -P @{
    Location = '150,120'  
    Size = '75,23'  
    DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    Text = 'Cancel'  
}
$label  = New-Object System.Windows.Forms.Label -P @{
    Location = '10,20'  
    Size = '280,20'  
    Text = 'Please select a computer:'  
}
$listBox = New-Object System.Windows.Forms.ListBox -P @{
    Location = '10,40'  
    Size = '260,80'  
    add_SelectedIndexChanged = {
        $okButton.Enabled = $listbox.SelectedIndex -ne -1
    }
    add_DoubleClick = {
        if ($listbox.SelectedIndex -ne -1){
            $form.DialogResult = 'OK'  
            $form.Close()
        }
    }
}
# ====================
# Listbox Items aus der Hashtable hinzufügen
[void]$listBox.Items.AddRange($scripts.Keys)
# Accept und cancel Buttons zuweisen
$form.AcceptButton = $okButton
$form.CancelButton = $cancelButton
# Alle Controls der form hinzufügen
$form.Controls.AddRange(@($okButton,$cancelButton,$label,$listbox))
# Form anzeigen
$result = $form.ShowDialog()

# Ergebnis der Form ermitteln
if ($result -eq 'OK'){  
    # Skriptpfad aus Hashtable anhand sektiertem Eintrag der Listbox ermitteln
    $script = $scripts[$listBox.SelectedItem]
    # prüfe ob Skriptpfad tatsächlich exisitiert
    if (Test-Path $script){
        # Führe das Skript aus
        write-host "Starte Skript '$script' ... " -F Green  
        &$script   
    }else{
        Write-Warning "Script-Pfad '$script' nicht gefunden !"  
    }
    Read-Host "Skript beendet, Enter drücken zum beenden"  
}
Jannik2018
Jannik2018 Feb 08, 2022 at 15:38:54 (UTC)
Goto Top
Das ist genau das was ich Brauche vielen Lieben Dank