У меня есть следующий сценарий powershell, который я пытаюсь адаптировать для использования в более крупном сценарии.
function New-Choice {
<# .SYNOPSIS
The New-Choice function is used to provide extended control to a script author who writing code
that will prompt a user for information.
.PARAMETER Choices
An Array of Choices, ie Yes, No and Maybe
.PARAMETER Caption
Caption to present to end user
.EXAMPLE
PS C:\> New-Choice -Choices 'Yes','No' -Caption "PowerShell makes choices easy"
.NOTES
Author: Andy Schneider
Date: 5/6/2011
#>
[CmdletBinding()]
param(
[Parameter(Position=0, Mandatory=$True, ValueFromPipeline=$True)]
$Choices,
[Parameter(Position=1)]
$Caption,
[Parameter(Position=2)]
$Message
)
process {
$resulthash += @{}
for ($i = 0; $i -lt $choices.count; $i++)
{
$ChoiceDescriptions += @(New-Object System.Management.Automation.Host.ChoiceDescription ("&" + $choices[$i]))
$resulthash.$i = $choices[$i]
}
$AllChoices = [System.Management.Automation.Host.ChoiceDescription[]]($ChoiceDescriptions)
$result = $Host.UI.PromptForChoice($Caption,$Message, $AllChoices, 1)
$resulthash.$result -replace "&", ""
}
}
#new-choice -Choices "yes","no","maybe"
new-choice -Choices "Yes","No","Copy ALL","Cancel (Abort Script)" -Caption "Continue the Copy Process?"
Я хочу сделать так, чтобы при выборе «Да», «Нет» или «Копировать ВСЕ» выполнялось соответствующее действие, а при выборе «Отмена» сценарий завершался.Однако я также хотел бы, чтобы выбор кнопки «Отмена», нажатие клавиши «ESC» или закрытие окна также делали одно и то же (завершайте сценарий).
На приведенном выше примере, он работает нормально, если один из этих четырех выбран, и вы нажимаете кнопку ОК (он возвращает значение того, что было выбрано).Однако, если окно закрыто, кнопка «Отмена» выбрана или введена клавиша ESC, генерируется следующая ошибка:
Исключение вызывает «PromptForChoice» с аргументом (ами) «4»: «Произошла ошибка типа «System.Management.Automation.Host.Promptin gException».В C: \ Documents and Settings \ myPC \ Мои документы \ test ui prompt.ps1: 34 char: 43 + $ result = $ Host.UI.PromptForChoice <<<< ($ Caption, $ Message, $ AllChoices, 1) +CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: DotNetMethodException </p>
Как я могу перехватить эти другие «опции», чтобы при выборе одного из них он выходил из сценария &не выдает ошибку выше?