该错误消息意味着您的 PowerShell 代码触发了交互式确认提示,当 PowerShell 在非交互式模式(CLI参数-NonInteractive
)下运行时,该提示会因设计而失败。[1]
对于某些命令,您已经尝试使用and来抑制这些提示,但似乎至少您的一个命令仍在尝试提示。-Force
-Confirm:$false
要明确禁止给定脚本中的所有确认提示[2] ,您可以使用$PSDefaultParameterValues
首选项变量,如下所示:
- 警告:以下故意绕过所有确认提示并强制执行默认情况下会被拒绝的操作,立即尝试潜在的破坏性操作- 只有在您绝对确定命令将按预期工作时才使用此技术。此外,在某些 cmdlet
-Force
中具有与确认提示无关的语义,例如在与或一起使用时包含隐藏项。
在准备过程中,使用common参数来预览命令将执行的操作总是一个好主意。Get-ChildItem
Get-Item
-WhatIf
# !! SEE WARNING ABOVE.
$PSDefaultParameterValues = @{ '*:Force' = $true; '*:Confirm' = $false }
# ... Commands that normally prompt for confirmation.
笔记:
上面故意将一个新的 哈希表(@{ ... }
)分配给一个隐式的局部 $PSDefaultParameterValues
变量,以便将设置限制在当前范围(及其后代)。虽然简单地添加/修改$PSDefaultParameterValues
定义在全局范围(例如)中的预先存在的字典在技术上是可行的,但更改将在全局$PSDefaultParameterValues['*:Force'] = $true
范围内生效,并可能影响稍后在同一会话中运行的不相关脚本。(也就是说,在 Ansible 等部署工具的上下文中,给定的 PowerShell 进程只运行一段特定的代码,不会出现这个问题)。
在极少数情况下,您希望保留全局字典中的现有值,您可以先创建它的本地克隆,然后添加/修改它:$PSDefaultParameterValues = $PSDefaultParameterValues.Clone() $PSDefaultParameterValues['*:Force'] = $true $PSDefaultParameterValues['*:Confirm'] = $false
[1]powershell -NonInteractive -Command 'Read-Host'
例如,尝试引发错误。
[2] 至少对于那些仅使用两种标准机制来允许抑制提示的命令,-Confirm:$false
以及-Force
. 一个值得注意的例外是Remove-ChildItem
,当以非空目录为目标时,需要-Recurse
它以避免确认提示 - 请参阅此答案。