Powershell忽略错误
如何使powershell忽略旧命令的故障 所有powershell模块都支持Powershell忽略错误,powershell,Powershell,如何使powershell忽略旧命令的故障 所有powershell模块都支持-ErrorAction,但这不适用于NET STOP NET STOP WUAUSERV echo $? true 我想尝试停止该服务,如果该服务已停止,请继续。重现这种情况的一种简单方法是尝试并停止服务两次 我尝试过的事情 $ErrorActionPreference = "SilentlyContinue" NET STOP WUAUSERV NET STOP WUAUSERV echo $LASTEXITCO
-ErrorAction
,但这不适用于NET STOP
NET STOP WUAUSERV
echo $?
true
我想尝试停止该服务,如果该服务已停止,请继续。重现这种情况的一种简单方法是尝试并停止服务两次
我尝试过的事情
$ErrorActionPreference = "SilentlyContinue"
NET STOP WUAUSERV
NET STOP WUAUSERV
echo $LASTEXITCODE
尝试使用AND和OR运算符
及
或
我还尝试重定向错误
NET STOP WUAUSERV 2>nul
NET STOP WUAUSERV 2>nul
echo $LASTEXITCODE
根据a中的建议,我也尝试过
cmd.exe /C "NET STOP WUAUSERV"
如何使这个遗留命令幂等 对于许多常见任务,正确的答案是使用已经存在的本机PowerShell命令 对于此特定示例,正确的路径是使用
Stop-Service
cmdlet,它将优雅地处理您的条件
如果必须使用传统工具,请参阅以下答案:
.exe没有在PowerShell输出管道上放置传统值供您计算,因此尝试比较$true
没有任何用处。另见:
此外,$ErrorActionPreference
对遗留.EXE没有影响。(并且-ErrorAction
特定于PowerShell命令。)- 要在PowerShell中静音错误/stderr输出,请使用
,而不是2>$null
2>NUL
的值不应对调用外部实用程序(控制台应用程序)产生任何影响,例如$ErrorActionPreference
,但是-从Windows PowerShell v5.1/PowerShell Core v6.0.0-beta.9开始-如果该值为net.exe
,'Stop'
(事实上,任何流2>$null
,即错误流的重定向)当前都会触发PowerShell错误2
- 不幸的是,自Windows PowerShell v5.1/PowerShell Core v6.0-beta.9起,PowerShell中不支持控制运算符
和&&
和|
或$true
),即使它们是,这里也不需要它们$false
- 不过,我们正在考虑支持他们;你可以
无论stderr输出是否静音:
包含最近执行的外部实用程序的退出代码$LASTEXITCODE
- 执行外部实用程序后,如果
为$LASTEXITCODE
,则0
为$?
,否则为$True
$False
- 建议使用PowerShell,它应该是幂等的:如果服务正在运行,它将停止服务;如果服务已经处于停止状态,则它将是no op
- 停止是同步的,除非您使用
开关(PSv5+),如我的示例所示-NoWait
- 停止是同步的,除非您使用
- 如果您认为
确实存在问题(我不知道有任何问题),您可以使用Stop Service
cmdlet补充Get Service
的使用,以确保服务停止,同时仍能检测到错误情况:net.exe
建议使用PowerShell cmdlet是个好主意。Re“不要在PowerShell输出管道上放置传统值供您评估”:控制台应用程序通过管道发送其标准输出。
|
目前在PowerShell中根本不受支持(生成语法错误),它肯定会作用于控制台应用程序的退出代码(以及PowerShell本机命令的成功状态).-ErrorAction
甚至不能应用于可执行文件的调用。停止服务的工作方式给我带来了一些问题,我在另一个问题@mklement0中解释了这一点,是的。我正在讨论是否要讨论输出中的标准输出结果主题,以及e问题,但到此为止。我最近添加的几项内容可能令人困惑,因此我对答案进行了一些调整,以符合您的观点。@斯普德我不得不想知道,在您尝试更新时,为什么您要停止更新服务wauserv
。。我在另一篇帖子上评论说,您可能希望确保服务完全停止,即使当使用<代码>停止服务< /代码>如果您真的需要它停止……再次,我会提醒您认真考虑是否停止该服务确实是您想要做的。@ MathWeWiMo这个脚本用于自动化,使用PACKER构建黄金图像。如果Windows更新服务正在运行,它可以在打包机H之前过早地重启机器。完成了。
NET STOP WUAUSERV 2>nul
NET STOP WUAUSERV 2>nul
echo $LASTEXITCODE
cmd.exe /C "NET STOP WUAUSERV"
$svc = 'wuauserv'
if ((Get-Service $svc).Status -ne 'Stopped') {
net stop $svc
if ($LASTEXITCODE) { Throw "Failed to stop service $svc."}
} else {
Write-Verbose -Verbose "(Service $svc is already stopped.)"
}