1
     win_shell: | 
     Get-disk
     Initialize-Disk -Number 2 -PartitionStyle MBR
     clear-disk -number 2 -removedata -Confirm:$false
     Initialize-Disk -Number 2 -PartitionStyle MBR
     new-partition -disknumber 2 -usemaximumsize | format-volume -filesystem NTFS - 
     newfilesystemlabel Data -Force
     get-partition -disknumber 2 | set-partition -newdriveletter G

在上面的代码中得到“Windows PowerShell 处于非交互模式。阅读并提示。” 我正在使用 ansible playbook 执行上述代码。手动它正在执行,但是当通过 ansible getting 错误执行时。请帮忙!

4

1 回答 1

0

该错误消息意味着您的 PowerShell 代码触发了交互式确认提示当 PowerShell 在非交互式模式(CLI参数-NonInteractive)下运行时,该提示会因设计而失败[1]

对于某些命令,您已经尝试使用and来抑制这些提示,但似乎至少您的一个命令仍在尝试提示。-Force-Confirm:$false

明确禁止给定脚本中的所有确认提示[2] ,您可以使用$PSDefaultParameterValues首选项变量,如下所示:

  • 警告:以下故意绕过所有确认提示并强制执行默认情况下会被拒绝的操作,立即尝试潜在的破坏性操作- 只有在您绝对确定命令将按预期工作时才使用此技术。此外,在某些 cmdlet-Force中具有与确认提示无关的语义,例如在与或一起使用时包含隐藏项。 在准备过程中,使用common参数预览命令将执行的操作总是一个好主意。Get-ChildItemGet-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它以避免确认提示 - 请参阅此答案

于 2022-02-14T15:26:56.790 回答