分批检查过程是否正在回答

问题描述 投票:1回答:1
:loop
>nul timeout /t 600 /nobreak
powershell -ExecutionPolicy Unrestricted -c "Get-Process -Name programm | Where-Object -FilterScript {$_.Responding -eq $false}"
if not errorlevel 1 goto loop

这不起作用,我认为错误级别是问题,但我无法解决。我想检查过程是否正在回答。如果不是,我想在超时后再次检查该过程。

我先感谢您的帮助。

batch-file batch-processing
1个回答
0
投票

读取Errorlevel and Exit codes

几乎所有应用程序和实用程序都将设置退出代码他们完成/终止。设置的退出代码确实有所不同,通常,代码0(假)将指示成功完成。…当外部命令由CMD.EXE运行时,它将检测到可执行文件的ReturnExit Code并将ERRORLEVEL设置为比赛。在大多数情况下,ERRORLEVELExit代码,但在某些情况下它们可能会有所不同。

它是PowerShell退出代码,如以下示例所示:

  • 未成功完成([errorlevel 1):
==> powershell -noprofile -c "Get-Process -Name invalid_programm"
Get-Process : Cannot find a process with the name "invalid_programm". Verify the process name and call the cmdlet again.
At line:1 char:1
+ Get-Process -Name invalid_programm
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (invalid_programm:String) [Get-Process],ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

==> echo errorlevel=%errorlevel%
errorlevel=1
  • 成功完成errorlevel 0]
==> powershell -noprofile -c "return 1"
1

==> echo errorlevel=%errorlevel%
errorlevel=0
  • 成功完成(使用errorlevel明确设置的exit keyword
exit

因此,您可以使用以下代码段(应该总是成功完成):

==> powershell -noprofile -c "exit 2"

==> echo errorlevel=%errorlevel%
errorlevel=2

将以上内容重写为单行(使用别名),您可能会遇到以下情况:

  1. 具有指定名称的进程未找到
try { 
    $x = @(Get-Process -Name programm -ErrorAction Stop | 
             Where-Object -FilterScript {-not $_.Responding})
    exit $x.Count
} catch { 
    exit 5000          # or other `absurd` value
}
  1. 具有指定名称的进程找到并响应
==> powershell -noprofile -c "try{$x=@(gps programm -EA Stop|? {-not $_.Responding});exit $x.Count} catch {exit 5000}"

==> echo errorlevel=%errorlevel%
errorlevel=5000
  1. 具有指定名称的一个进程发现且未响应
==> powershell -noprofile -c "try{$x=@(gps cmd -EA Stop|? {-not $_.Responding});exit $x.Count} catch {exit 5000}"

==> echo errorlevel=%errorlevel%
errorlevel=0
  1. 具有指定名称的更多进程发现并没有响应
==> powershell -noprofile -c "try{$x=@(gps HxOutlook -EA Stop|? {-not $_.Responding});exit $x.Count} catch {exit 5000}"

==> echo errorlevel=%errorlevel%
errorlevel=1

请注意上述枚举的不完整性:我们可以想象场景,其中运行更多具有指定名称的进程,其中一些响应,而其他不响应。 (换句话说,发现并作出回应 不是暗示不存在其他发现并作出回应 ...]

© www.soinside.com 2019 - 2024. All rights reserved.