Подтвердить что ты не робот

Как использовать -confirm в PowerShell

Я пытаюсь взять пользовательский ввод, и перед продолжением я хотел бы получить сообщение на экране и подтверждение, независимо от того, хочет ли пользователь продолжить или нет. Я использую следующий код, но его не работает:

write-host "Are you Sure You Want To Proceed:"  -Confirm
4b9b3361

Ответ 1

-Confirm - это переключатель в большинстве командлетов PowerShell, который вынуждает командлет запрашивать подтверждение пользователя. На самом деле вы ищете командлет Read-Host:

$confirmation = Read-Host "Are you Sure You Want To Proceed:"
if ($confirmation -eq 'y') {
    # proceed
}

или метод PromptForChoice() пользовательского интерфейса хоста:

$message  = 'something'
$question = 'Are you sure you want to proceed?'

$choices = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Yes'))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&No'))

$decision = $Host.UI.PromptForChoice($message, $question, $choices, 1)
if ($decision -eq 0) {
    Write-Host 'confirmed'
} else {
    Write-Host 'cancelled'
}

Редактировать:

Как отметил М-пиксель в комментариях, код можно было бы еще больше упростить, поскольку варианты можно передать в виде простого строкового массива.

$message  = 'something'
$question = 'Are you sure you want to proceed?'
$choices  = '&Yes', '&No'

$decision = $Host.UI.PromptForChoice($message, $question, $choices, 1)
if ($decision -eq 0) {
    Write-Host 'confirmed'
} else {
    Write-Host 'cancelled'
}

Ответ 2

Это простой цикл, который продолжает запрашивать, если пользователь не выбирает "y" или "n"

$confirmation = Read-Host "Ready? [y/n]"
while($confirmation -ne "y")
{
    if ($confirmation -eq 'n') {exit}
    $confirmation = Read-Host "Ready? [y/n]"
}

Ответ 3

Read-Host - один из примеров командлета, на который -Confirm не влияет. -Confirm - это один из общих параметров PowerShell, в частности параметр снижения рисков, который используется, когда командлет собирается внести изменения в систему, которая находится за пределами среды Windows PowerShell. Многие, но не все командлеты поддерживают параметр уменьшения риска -Confirm.

В качестве альтернативы ниже приводится пример использования командлета Read-Host и теста регулярного выражения для получения подтверждения от пользователя:

$reply = Read-Host -Prompt "Continue?[y/n]"
if ( $reply -match "[yY]" ) { 
    # Highway to the danger zone 
}

Командлет Remove-Variable является одним примером, который иллюстрирует использование переключателя -Confirm.

Remove-Variable 'reply' -Confirm

Дополнительные ссылки: CommonParameters, Write-Host, Read-Host, Операторы сравнения, Регулярные выражения, Remove-Variable

Ответ 4

write-host не имеет параметра -confirm.

Вместо этого вы можете сделать что-то вроде этого:

    $caption = "Please Confirm"    
    $message = "Are you Sure You Want To Proceed:"
    [int]$defaultChoice = 0
    $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Do the job."
    $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Do not do the job."
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)
    $choiceRTN = $host.ui.PromptForChoice($caption,$message, $options,$defaultChoice)

if ( $choiceRTN -ne 1 )
{
   "Your Choice was Yes"
}
else
{
   "Your Choice was NO"
}

Ответ 5

Здесь решение, которое я использовал, похоже на решение Ansgar Wiechers;

$title = "Lorem"
$message = "Ipsum"

$yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "This means Yes"
$no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "This means No"

$options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)

$result = $host.ui.PromptForChoice($title, $message, $Options, 0)

Switch ($result)
     {
          0 { "You just said Yes" }
          1 { "You just said No" }
     }

Ответ 6

Немного более красивая функция, основанная на ответе Ансгара Вичера. Действительно ли это более полезно, это вопрос дебатов.

function Read-Choice(
   [Parameter(Mandatory)][string]$Message,
   [Parameter(Mandatory)][string[]]$Choices,
   [Parameter(Mandatory)][string]$DefaultChoice,
   [Parameter()][string]$Question='Are you sure you want to proceed?'
) {
    $defaultIndex = $Choices.IndexOf($DefaultChoice)
    if ($defaultIndex -lt 0) {
        throw "$DefaultChoice not found in choices"
    }

    $choiceObj = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]

    foreach($c in $Choices) {
        $choiceObj.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList $c))
    }

    $decision = $Host.UI.PromptForChoice($Message, $Question, $choiceObj, $defaultIndex)
    return $Choices[$decision]
}

Пример использования:

PS> $r = Read-Choice 'DANGER!!!!!!' '&apple','&blah','&car' '&blah'

DANGER!!!!!!
Are you sure you want to proceed?
[A] apple  [B] blah  [C] car  [?] Help (default is "B"): c
PS> switch($r) { '&car' { Write-host 'caaaaars!!!!' } '&blah' { Write-Host "It a blah day" } '&apple' { Write-Host "I'd like to eat some apples!" } }
caaaaars!!!!

Ответ 7

Когда вы хотите 1-лайнер

while( -not ( ($choice= (Read-Host "May I continue?")) -match "y|n")){ "Y or N ?"}

Ответ 8

Вот документация от Microsoft о том, как запросить подтверждения в командлете. Примеры в С#, но вы можете делать все, что показано в PowerShell.

Сначала добавьте атрибут CmdletBinding в свою функцию и установите для параметра SupportsShouldProcess значение true. Затем вы можете ссылаться на ShouldProcess и ShouldContinue переменной $PSCmdlet.

Вот пример:

function Start-Work {
    <#
    .SYNOPSIS Does some work
    .PARAMETER Force
        Perform the operation without prompting for confirmation
    #>
    [CmdletBinding(SupportsShouldProcess=$true)]
    param(
        # This switch allows the user to override the prompt for confirmation
        [switch]$Force
    )
    begin { }
    process {
        if ($PSCmdlet.ShouldProcess('Target')) {
            if (-not ($Force -or $PSCmdlet.ShouldContinue('Do you want to continue?', 'Caption'))) {
                return # user replied no
            }

            # Do work
        }

    }
    end { }
}

Ответ 9

Я предпочитаю всплывающее окно.

$shell = new-object -comobject "WScript.Shell"
$choice = $shell.popup("Insert question here",0,"Popup window title",4+32)

Если $выбор равен 6, ответ был Да Если $выбор равен 7, ответ был не