Windows PowerShell 处于非交互模式。阅读并提示

Windows PowerShell is in NonInteractive mode. Read and Prompt

     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 剧本执行上面的代码。手动它正在执行但是当通过 ansible 获取错误执行时。请帮忙!

错误消息暗示您的 PowerShell 代码触发了交互式确认提示当 PowerShell 是 运行在 non-interactive 模式下(CLI 参数 -NonInteractive)在设计上失败 .[ 1]

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

断然抑制所有确认提示[2]在给定的脚本中,您可以使用$PSDefaultParameterValues preference variable如下:

  • 警告:以下故意绕过所有确认提示并强制执行默认情况下会被拒绝的操作,潜在的破坏性操作是立即 已尝试 - 仅在您绝对确定命令将按预期工作时才使用此技术。此外,在某些 cmdlet 中,-Force 具有与确认提示无关的语义,例如 包括隐藏项 Get-ChildItemGet-Item 一起使用时。
    在准备过程中,最好使用 common -WhatIf parameter 预览 否则命令会执行的操作。
# !! SEE WARNING ABOVE.
$PSDefaultParameterValues = @{ '*:Force' = $true; '*:Confirm' = $false }

# ... Commands that normally prompt for confirmation.

注:

  • 上面故意将 new hashtable (@{ ... }) 隐式分配给 local $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 以避免确认提示 - 请参阅 this answer.