在编写 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