有没有办法可以抑制 PowerShell 脚本中的任何交互式提示?

有没有办法可以抑制 PowerShell 脚本中的任何交互式提示?

在编写 PowerShell 脚本时,我注意到当某些 cmdlet 遇到问题时,它们会弹出一个交互式提示,例如非空目录上的 Remove-Item。这在尝试自动执行任务时是致命的,我宁愿操作失败并抛出异常或返回错误的返回代码,这样整个脚本就不会被锁定以等待响应。

有什么方法可以强制 PowerShell 自动失败,而不是在操作时寻求用户输入?

答案1

Eris 提出的解决方案有效地启动了另一个 PowerShell 实例。另一种使用更简单语法的方法是将 shell 转至另一个 powershell.exe 实例。

powershell.exe -NonInteractive -Command "Remove-Item 'D:\Temp\t'"

答案2

Get-Help about_Preference_Variables

$确认偏好
------------------
    确定 Windows PowerShell 是否自动提示您
    运行 cmdlet 或函数之前进行确认。

...

无:Windows PowerShell 不会自动提示。
                         要请求确认特定命令,请使用
                         cmdlet 或函数的 Confirm 参数。

所以:

> $ConfirmPreference = 'None'

答案3

好吧,这确实很丑,但天哪,它“起​​作用了”。

问题:

  • 我还没弄清楚第一个错误之后如何继续
  • 在这种情况下,它会删除普通文件,然后停在第一个文件夹
  • 我还不知道如果添加 UseTransaction 参数,该如何让这个 cmdlet 工作
  • 这只适用于简单情况(不会对当前环境执行很多操作的命令)。我还没有测试过任何复杂的情况

    $MyPS = [Powershell]::Create()
    $MyPS.Commands.AddCommand("Remove-Item")
    $MyPS.Commands.AddParameter("Path", "D:\Temp\t")
    $MyPS.Invoke()

输出:

Commands                                                                                                                 
--------                                                                                                                 
{Remove-Item}                                                                                                            
{Remove-Item}                                                                                                            
Exception calling "Invoke" with "0" argument(s): "A command that prompts the user failed because the host program or the 
command type does not support user interaction. The host was attempting to request confirmation with the following 
message: The item at D:\Temp\t has children and the Recurse parameter was not specified. If you continue, all children 
will be removed with the item. Are you sure you want to continue?"
At line:19 char:1
+ $MyPS.Invoke()
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CmdletInvocationException

答案4

当我创建目录时,上述所有解决方案都失败了,这意味着我被提示确认我的脚本创建的每个目录 - 数量非常多。对我有用的是应用 | Out-null 以便将结果传送到 Out-Null

New-Item -ItemType Directory -Path $directory -Force:$doForce | Out-Null

请注意,$Directory 是一个字符串,其中包含您要创建的目录的完整路径。希望这能节省一些时间 :P

相关内容