在Powershell中使用-Confirm



我试图了解$?$lastexitcode变量与Powershell cmdlet中的-Confirm标志之间的关系。

假设您使用-confirm运行命令,它将提示您相应的操作:

PS C:temp> rm .foo.txt -confirm
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove Directory" on target "C:tempfoo.txt".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):n
PS C:temp> $?
True

我知道技术上命令运行成功,但如果用户选择no,则命令不运行。

我的问题是如何获得用户对-Confirm标志的回答?

$?$LastExitCode-Confirm是完全不相关的。

$?是一个自动变量,带有一个布尔值,表示上一次(PowerShell)操作是否执行成功。

$LastExitCode是一个自动变量,包含上次执行的外部命令的退出代码(一个整数值)。

-Confirm是一个常用参数,用于控制cmdlet是否提示用户确认其操作。

据我所知,PowerShell不会在任何地方存储给-Confirm提示的答案,所以如果你需要其他东西的响应,你必须自己提示用户,例如:

function Read-Confirmation {
  Param(
    [Parameter(Mandatory=$false)]
    [string]$Prompt,
    [Parameter(Mandatory=$false)]
    [string]$Message
  )
  $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'))
  -not [bool]$Host.UI.PromptForChoice($Message, $Prompt, $choices, 1)
}
$doRemove = if ($PSBoundParameters['Confirm'].IsPresent) {
  Read-Confirmation -Prompt 'Really delete'
} else {
  $true
}
if ($doRemove) {
  Remove-Item .foo.txt -Force
}

当然,不可能捕获用户对确认提示的响应;它不是PowerShell命令历史的一部分,虽然您可能能够以某种方式从缓冲区获取信息,但只有默认的PowerShell主机才支持这些信息,因为其他主机将使用不同的缓冲区。在这种情况下,最好在脚本中使用if语句进行单独的确认。

$userAnswer = Read-Host "Are you sure you wish to proceed?"
if($userAnswer -eq "yes"){
    rm .foo.txt
}    

然后使用$userAnswer变量来了解用户响应的内容。或者,您可以通过检查操作是否完成来确定他们的答案。这将是我的首选方法,因为这样你可以确定文件已被删除,而不是假设这样,因为cmdlet成功执行,用户确认(可靠性可能没有任何不同,考虑到remove-item经过了非常好的测试,但如果你正在使用某种第三方库,它可能会有所不同),看起来像下面这样。

rm .foo.txt -Confirm
if(Test-Path .foo.txt){
    $success = $false
} else {
    $success = $true
}

如果你真的需要知道它删除失败是由于错误还是用户说没有你可以这样做

rm .foo.txt -Confirm

if(Test-Path .foo.txt){
    $success = $false
} else {
    $success = $true
}
if(!($success) -and (!($?))){
    $status = "Previous command failed"
} elseif (!($success) -and $?){
    $status = "User cancelled operation"
} 

希望对你有帮助。

相关内容

  • 没有找到相关文章

最新更新