Powershell 在while循环中监视两个进程时,如何知道哪个进程死亡

Powershell 在while循环中监视两个进程时,如何知道哪个进程死亡,powershell,Powershell,我正在监视服务器上的两个进程。当其中一个死了,我需要知道是哪一个 有没有比我目前掌握的更好的检查方法?到目前为止,如果没有if/elseif,有没有办法做到这一点 while ((ps proc1 -ov websrv).Responding -and (ps proc2 -ov connec).Responding) { sleep -m 100 } $pmsname = if (!$websrv.Responding -and !$connec.Responding) { "beide"

我正在监视服务器上的两个进程。当其中一个死了,我需要知道是哪一个

有没有比我目前掌握的更好的检查方法?到目前为止,如果没有if/elseif,有没有办法做到这一点

while ((ps proc1 -ov websrv).Responding -and (ps proc2 -ov connec).Responding) 
{ sleep -m 100 }

$pmsname = if (!$websrv.Responding -and !$connec.Responding) { "beide" }
            elseif (!$websrv.Responding -and $connec.Responding) { "websrv" }
            elseif ($websrv.Responding -and !$connec.Responding) { "connec" }

你可以这样做:

$status = [int]$websrv.Responding + [int]$connec.Responding * 2

$pmsname = switch ($status) {
  0 { 'keiner' }
  1 { 'websrv' }
  2 { 'connec' }
  3 { 'beide' }
  default { throw "unrecognized status: $status" }
}

如果进程正在响应,将Responding属性的值强制转换为整数,则会得到值1,如果进程没有响应,则会得到值0。对于第二个进程,通过将该数字乘以2,可以使两个进程的响应状态相互区分,这样就可以添加值并使用语句来确定总体状态。

您可以执行以下操作:

$status = [int]$websrv.Responding + [int]$connec.Responding * 2

$pmsname = switch ($status) {
  0 { 'keiner' }
  1 { 'websrv' }
  2 { 'connec' }
  3 { 'beide' }
  default { throw "unrecognized status: $status" }
}

如果进程正在响应,将Responding属性的值强制转换为整数,则会得到值1,如果进程没有响应,则会得到值0。对于第二个进程,通过将该数字乘以2,可以使两个进程的响应状态相互区分,这样就可以添加值并使用语句来确定总体状态。

Ansgar的答案应该可以很好地工作,但在我看来,对于生产脚本来说有点深奥

类似这样的方法只需依次检查每个进程,以确保它们正在运行,这样更具可读性,还允许您更轻松地调整进程的数量

$Processes = ("dwm","explorer","fakeproc")

while ($true){
    foreach ($ProcName in $Processes){
        $Proc = Get-Process $ProcName -ea SilentlyContinue
        if ($Proc -eq $null -or !$Proc.Responding){
            Write-Host "Process '$($ProcName)' Not Responding" -Fore Red
        }
    }
    Sleep 1
}

Ansgar的答案应该很好,但在我看来,对于生产脚本来说有点深奥

类似这样的方法只需依次检查每个进程,以确保它们正在运行,这样更具可读性,还允许您更轻松地调整进程的数量

$Processes = ("dwm","explorer","fakeproc")

while ($true){
    foreach ($ProcName in $Processes){
        $Proc = Get-Process $ProcName -ea SilentlyContinue
        if ($Proc -eq $null -or !$Proc.Responding){
            Write-Host "Process '$($ProcName)' Not Responding" -Fore Red
        }
    }
    Sleep 1
}