Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell忽略错误_Powershell - Fatal编程技术网

Powershell忽略错误

Powershell忽略错误,powershell,Powershell,如何使powershell忽略旧命令的故障 所有powershell模块都支持-ErrorAction,但这不适用于NET STOP NET STOP WUAUSERV echo $? true 我想尝试停止该服务,如果该服务已停止,请继续。重现这种情况的一种简单方法是尝试并停止服务两次 我尝试过的事情 $ErrorActionPreference = "SilentlyContinue" NET STOP WUAUSERV NET STOP WUAUSERV echo $LASTEXITCO

如何使powershell忽略旧命令的故障

所有powershell模块都支持
-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
      的值不应对调用外部实用程序(控制台应用程序)产生任何影响,例如
      net.exe
      ,但是-从Windows PowerShell v5.1/PowerShell Core v6.0.0-beta.9开始-如果该值为
      'Stop'
      2>$null
      (事实上,任何流
      2
      ,即错误流的重定向)当前都会触发PowerShell错误
  • 不幸的是,自Windows PowerShell v5.1/PowerShell Core v6.0-beta.9起,PowerShell中不支持控制运算符
    &&
    |
    $true
    $false
    ),即使它们是,这里也不需要它们

    • 不过,我们正在考虑支持他们;你可以

无论stderr输出是否静音:

  • $LASTEXITCODE
    包含最近执行的外部实用程序的退出代码

  • 执行外部实用程序后,如果
    $LASTEXITCODE
    0
    ,则
    $?
    $True
    ,否则为
    $False

有关PowerShell本机命令和外部实用程序的PowerShell错误处理的全面讨论。

一般讨论如何处理外部可执行文件中的stderr输出/退出代码

关于停止服务的幂等方法(确保服务处于停止状态):

  • 建议使用PowerShell,它应该是幂等的:如果服务正在运行,它将停止服务;如果服务已经处于停止状态,则它将是no op

    • 停止是同步的,除非您使用
      -NoWait
      开关(PSv5+),如我的示例所示
  • 如果您认为
    Stop Service
    确实存在问题(我不知道有任何问题),您可以使用
    Get Service
    cmdlet补充
    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.)"
}