Powershell & кнопка Отмена или ESC - PullRequest
1 голос
/ 12 марта 2012

У меня есть следующий сценарий 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>

Как я могу перехватить эти другие «опции», чтобы при выборе одного из них он выходил из сценария &не выдает ошибку выше?

1 Ответ

3 голосов
/ 23 января 2013

Что-то вроде этого должно делать то, что вы хотите:

try {
    $result = $Host.UI.PromptForChoice($Caption,$Message, $AllChoices, 1)
} catch [Management.Automation.Host.PromptingException] {
    exit
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...