在Powershell中使用-Confirm

在Powershell中使用-Confirm,powershell,Powershell,我正在试图了解$?和$lastexitcode变量与Powershell cmdlet中的-Confirm标志之间的关系 例如,假设您使用-confirm运行命令,它将相应地提示您执行操作: PS C:\temp>rm.\foo.txt-确认 证实 是否确实要执行此操作? 在目标“C:\temp\foo.txt”上执行“删除目录”操作。 [Y] 是[A]对所有人都是[N]否[L]对所有人都是[S]暂停[?]帮助 (默认值为“Y”):n PS C:\temp>$? 真的 我知道从技术上讲,该命令

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

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

PS C:\temp>rm.\foo.txt-确认
证实
是否确实要执行此操作?
在目标“C:\temp\foo.txt”上执行“删除目录”操作。
[Y] 是[A]对所有人都是[N]否[L]对所有人都是[S]暂停[?]帮助
(默认值为“Y”):n
PS C:\temp>$?
真的
我知道从技术上讲,该命令运行成功,但如果用户选择“否”,则该命令不会运行


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

好的,不可能捕获用户对确认提示的响应;它不是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"
} 

希望能有所帮助。

$?
$lastextcode
-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
}

问题标题要求如何使用-确认,而实际问题是如何从确认中获得用户的输入。对于像我一样略读的如何使用确认的人,考虑使用<代码> [CMDLITBIAN(SupStSuffDeCurrdPosial])<代码>与IF块<代码>($pSCMtLe.BueDeLead(”项)、“更改”)。{围绕相关逻辑。这是一种巧妙的内置方式,可以在不需要获得用户答案的情况下添加确认。有关参考信息,请参阅