Powershell Cmdlet.ShouldProcess 方法默认答案

Powershell Cmdlet.ShouldProcess Method default answer

我有一个 powershell 脚本,我在其中实现了具有高 ConfirmImpact 的 should process 方法以确保出现提示。

提示按预期工作,但未输入任何内容时的默认响应是 "Y"

[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

有没有办法将默认响应更改为 "N"?如果用户想要应用脚本,我希望他们必须明确输入 Y。我写了一个非常繁琐的脚本,我最不想看到的是脚本用户只需按回车键,而无需验证他们将其应用于什么。

我已经阅读了其中的 documentation,但没有任何地方提到这一点。

不,不幸的是没有

根据 ShouldProcess() 的当前实施,default option is always the first choice


是否ShouldProcess()提示用户确认操作取决于$ConfirmPreference自动变量的值是否高于被调用的cmdlet的ConfirmImpact属性。

$ConfirmPreference 默认为 High,可用的最高严重性影响级别。

要始终取消 ShouldProcess() 的确认提示,请将 $ConfirmPreference 设置为 None:

# Define a function with ConfirmImpact Medium or higher
function f {
  [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='Medium')]
  param()

  if($PSCmdlet.ShouldProcess("Dangerous operation")) {
    Write-Host 'Welcome to the Danger Zone' -ForegroundColor Red
  }
}

# Set $ConfirmPreference to `Medium` to prompt for confirmation
$ConfirmPreference = 'Medium'

# Call our function - you'll be prompted for confirmation
f

# Set $ConfirmPreference to `None` to suppress confirmation prompts
$ConfirmPreference = 'None'

# Call our function - you won't be prompted for confirmation
f

经过进一步研究,我找到了一种方法来做到这一点。为了将默认响应设置为 NO,应该使用 ShouldContinue 方法而不是 ShouldProcess。

阅读 documentation 的 ShouldContinue 有一个格式为

的部分
ShouldContinue(String, String, Boolean, Boolean, Boolean)

第一个布尔值是引用安全影响。如果确认的操作具有安全影响,则为真。如果指定,则在选择菜单中选择的默认选项为 'No'.