Проверка выбора списка формы Windows Powershell - PullRequest
0 голосов
/ 24 августа 2018

Я создал скрипт powershell, использующий формы Windows, содержащие списки, для запуска команды cmd (помогает устранить пользовательские ошибки и немного ускоряет процесс).Единственная проблема, с которой я сталкиваюсь, - это то, что команда все равно будет пытаться запускаться, даже если элемент не выбран ни в одной из заполненных форм.Это может привести к тому, что скрипт просто не запустится, или к загрузке большого количества данных (скрипт извлекает файлы журнала с сервера, список помогает сузить данные, которые нужно извлечь).Есть ли способ создать проверку ошибок для списка, который по существу скажет: «Эй, вы ничего не выбрали!»прежде чем продолжить?Спасибо!

Редактировать (пример первого списка):

$form = New-Object System.Windows.Forms.Form 
$form.Text = "Select a production environment"
$form.Size = New-Object System.Drawing.Size(190,250) 
$form.StartPosition = "CenterScreen"

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(10,180)
$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(85,180)
$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 production environment:"
$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(150,20) 
$listBox.Height = 140

[void] $listBox.Items.Add("server1")
[void] $listBox.Items.Add("server2")
[void] $listBox.Items.Add("server3")


$form.Controls.Add($listBox) 

$form.Topmost = $True

$result = $form.ShowDialog()

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

1 Ответ

0 голосов
/ 25 августа 2018

Может быть способ выполнить проверку такого типа с помощью методов Windows Forms, но для этого используется PowerShell.


Выполните $result = $form.ShowDialog() в цикле Do..Until или Do..While и продолжайте показывать диалоговое окно, пока пользователь не выберет хотя бы один элемент и не нажмет OK - или пользователь не закроет диалоговое окно - в противном случае отобразите предупреждение и покажите диалог снова.
Вот соответствующий код PowerShell:

do
{
    $result = $form.ShowDialog()

    if ($ListBox.SelectedIndices.Count -lt 1 -and $result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        Write-Warning 'Nothing was selected, please select a server.'
    }
}
until (($result -eq [System.Windows.Forms.DialogResult]::OK -and $listBox.SelectedIndices.Count -ge 1) -or $result -ne [System.Windows.Forms.DialogResult]::OK)

Конечно, вы можете заменить Write-Warning на что угодно, например, на окно сообщения.


PS: Вы можете использовать метод AddRange, чтобы добавить массив элементов в коллекцию $listBox, например: [void] $listBox.Items.AddRange(@("server1", "server2", "server3"))

...