首页 > 解决方案 > 如果在 Windows Powershell 中失败,如何重新启动特定命令?

问题描述

在一个 ps1 文件中,我启动 2 个单独的进程,如下所示: 如您所见,唯一的区别是 CPU 亲和性。

$Process1 = Start-Process -FilePath 'C:\Windows\system32\notepad.exe' -PassThru
$Process1.ProcessorAffinity = 65535
$Process1.PriorityClass = 'RealTime'

$Process2 = Start-Process -FilePath 'C:\Windows\system32\notepad.exe' -PassThru
$Process2.ProcessorAffinity = 4294901760
$Process2.PriorityClass = 'RealTime'

有时,随机地,2 个进程之一失败: 问题事件名称:BEX64

当发生此类故障时,必须立即重新启动该过程。所以我面临这个问题。

我可以在 PS1 文件中监视 2 个进程,如果一个进程无法重新启动它吗?监控进程必须能够区分 2 个进程中的哪一个失败,以便使用正确的亲缘关系重新启动它。

如果您有涉及 Windows 批处理脚本的解决方案,请访问如何在 Windows 批处理文件中失败时重新启动特定命令?

谢谢

标签: powershellscripting

解决方案


$Process1 = Start-Process -FilePath 'C:\Windows\system32\notepad.exe' -PassThru
$Process1.ProcessorAffinity = 1
$Process1.PriorityClass = 'RealTime'
Write-Host Process ID $process1.Id started with CPU affinity $Process1.ProcessorAffinity

$Process2 = Start-Process -FilePath 'C:\Windows\system32\notepad.exe' -PassThru
$Process2.ProcessorAffinity = 2
$Process2.PriorityClass = 'RealTime'
Write-Host Process ID $process2.Id started with CPU affinity $Process2.ProcessorAffinity

while($true){
    foreach($process in $Process1,$Process2){
        if($process.hasexited){

            Write-Host "Process ID $($process.id) has exited, restarting."
            $priority = $process.PriorityClass
            $affinity = $process.ProcessorAffinity
            if($newprocess = $process.Start()){
                Write-Host Successfully restarted process ID $process.Id with CPU affinity $process.ProcessorAffinity
                $process.PriorityClass = $priority
                $process.ProcessorAffinity = $affinity
                Write-Host Priority Class set back to $process.PriorityClass
                Write-Host Process affinity set back to $process.ProcessorAffinity
            }
        }
    }
    Start-Sleep -Milliseconds 500
}

推荐阅读