Я пытаюсь использовать списки с множественным выбором. Это моя первая попытка. Я нашел эту документацию в Microsoft. https://learn.microsoft.com/en-us/powershell/scripting/samples/multiple-selection-list-boxes?source=recommendations&view=powershell-7.3
Я хочу, чтобы форма отображала список из четырех различных параметров, каждый из которых является именем сценария, который будет выполнен, если вы его выберете. Как бы я добавил это. Я не уверен, как начать работу над этим. Возможен ли этот функционал? Некоторая помощь в правильном направлении будет оценена по достоинству.
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$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 make a selection from the list below:'
$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.SelectionMode = 'MultiExtended'
[void] $listBox.Items.Add('Item 1')
[void] $listBox.Items.Add('Item 2')
[void] $listBox.Items.Add('Item 3')
[void] $listBox.Items.Add('Item 4')
[void] $listBox.Items.Add('Item 5')
$listBox.Height = 70
$form.Controls.Add($listBox)
$form.Topmost = $true
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $listBox.SelectedItems
$x
}
Если я правильно понимаю, вы можете использовать хеш-таблицу перед своим условием, где ключи хэш-таблицы — это элементы, добавленные в $listBox
, а значения хэш-таблицы — это пути к сценариям .ps1
, которые вы хотите запустить. Затем вы можете использовать оператор вызова &
для запуска выбранного скрипта:
$options = @{
'Item 1' = 'path\to\script1.ps1'
'Item 2' = 'path\to\script2.ps1'
'Item 3' = 'path\to\script3.ps1'
# and so on here
}
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
# need a loop here in case multiple items are selected
$options[$listBox.SelectedItems] | ForEach-Object {
# then for each path, use `&` to invoke the `ps1` script
& $_
}
}
Что бы я поставил после «$_»?
@movement, если ваши сценарии не принимают никаких аргументов, то ничего
Хорошо, а зачем нам петля над ним? Как бы вы его структурировали?
Вы имеете в виду, почему вам нужно $options[$listBox.SelectedItems] | ForEach-Object {
? Потому что ваш список позволяет выбрать несколько элементов. Если вы не зациклите выбранные элементы, произойдет ошибка
Теперь вижу, спасибо за помощь. Все работает
Ваш код выглядит нормально, я понимаю, в какой части кода вам нужна помощь.