Как использовать -confirm в PowerShell
Я пытаюсь взять пользовательский ввод, и перед продолжением я хотел бы получить сообщение на экране и подтверждение, независимо от того, хочет ли пользователь продолжить или нет. Я использую следующий код, но его не работает:
write-host "Are you Sure You Want To Proceed:" -Confirm
Ответы
Ответ 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, ответ был не