如何保持每30分钟检查一次进程?

How to keep checking the process after every 30 minutes?

如果开始时间是 less than 2 hours.,我需要 kill the process 如果开始时间是 more than 2 hours.,我需要 add sleep for 30 mins 我需要 keep repeating 它直到进程不再 运行.

到目前为止,我已经编写了以下脚本来执行上述操作。

$procName = 'myprocess'
$process = Get-Process | Where-Object Name -EQ $procName
if(-not $process) {
    Write-Warning "$procName not found!"
}
else {
    $process | ForEach-Object {
        if($_.StartTime -lt [datetime]::Now.AddHours(-2)) {
                Stop-Process $_ -Force
            }
        else {
               sleep(1800)
           }   
        }
    }
}

如何在do-while或另一个循环中加入上述程序,以便一直检查直到进程不再运行? 另外,如何实现最长 4 小时的计时器?

我建议您使用 windows 计划任务,每 30 分钟左右启动一次 powershell 脚本,而不是使用正在等待的 powershell 阻塞资源。

您可以启动 powershell 并传递脚本。 PowerShell.exe - 文件“C:\script.ps1”

如果我没理解错的话,你的 else 条件可能看起来像这样使用 do-while 循环:

else {
    do {
        "$procName is still running, sleeping for 1800 sec"
        Start-Sleep -Seconds 1800
    } while(Get-Process | Where-Object Name -EQ $procName)
}

但是请注意,如果进程永不停止或您实施了最大计时器等,这可能会导致无限循环。


根据您关于实现最大计时器的评论,您可以通过多种方式实现,我个人的偏好是使用 StopWatch:

else {
    $timer = [System.Diagnostics.Stopwatch]::StartNew()
    do {
        # Do this while the process is still running AND
        # the timer hasn't yet reached 4 hours
        "$procName is still running, sleeping for 1800 sec"
        Start-Sleep -Seconds 1800
        $stillRunning = Get-Process | Where-Object Name -EQ $procName
    } while($stillRunning -and $timer.Elapsed.Hours -lt 4)
    $timer.Stop()
}