【问题标题】:Continuously check if a process is running持续检查进程是否正在运行
【发布时间】:2020-05-03 15:52:46
【问题描述】:

我编写了一个小代码,用于检查 Outlook 是否正在运行,如果没有,则打开 Outlook。问题是我的工作 PC 倾向于闲置大约 7% 的使用率,但在脚本运行时会飙升到 30 秒以上。如果它检测到 Outlook 不再处于活动状态,则在打开 Outlook 时 CPU 使用率可能会飙升至近 100%。脚本运行时增加约 33% 可能会在我工作时导致问题。 还有其他方法可以在使用较少处理能力的同时完成我的代码功能吗?

do{
    $running = Get-Process outlook -ErrorAction SilentlyContinue
    if (!$running)
    {
        Start-Process outlook
    }
} while (1 -eq 1)

【问题讨论】:

    标签: performance powershell powershell-4.0 powershell-5.0 processing-efficiency


    【解决方案1】:

    解决此问题的另一种方法是在批处理文件下运行(预定)

    @echo off
    
    SET outlookpath=C:\Program Files\Microsoft Office 15\root\office15\outlook.exe
    
    for /f "usebackq" %%f in (`tasklist /FI "IMAGENAME eq outlook.exe"`) do set a=%%f
    REM echo A:%a%
    
    if not "%a%"=="outlook.exe" start "" "%outlookpath%"
    

    如果您安排它每 5 分钟运行一次,而不是在关闭 Outlook 后 5 分钟内,它将重新启动。如果您认为 5 分钟太长,请更频繁地安排。 ?

    【讨论】:

    • 感谢您的回答!虽然我确实将 Windows 任务计划程序用于我的一些 PS 脚本(通过批处理脚本调用),但任务计划程序并不是超级可靠,因此我将坚持我的 PowerShell 实现。现在可以将 do-while 循环添加到您的脚本中,但我只是喜欢 PowerShell。再次感谢!
    • 请记住,您仍然可以从任务计划程序运行 PowerShell 脚本,只需确保将可执行文件设置为 powershell.exe 并将参数设置为 -File C:\path\to\script -Any -Additional -Arguments -You -Need。如果脚本位于网络上的受信任位置,则脚本路径也可以是 UNC 路径。如果只是单行powershell命令,可以使用-c "powershell-code here"作为参数。
    【解决方案2】:

    您需要在其中添加Start-Sleep,以防止脚本持续占用 CPU 时间。否则它会不停地循环,确保 Outlook 正在运行。在您的do-block 末尾:

    Start-Sleep -s 60
    

    您可以调整秒数,甚至可以使用您需要的-m 参数指定毫秒数。

    【讨论】:

    • 奇怪的是,使用“Start-Sleep -s 1”足以让 CPU 使用率在脚本运行时保持在 7-10%。当然我不需要它每秒检查一次,但仍然很有趣。感谢您的帮助!
    • 没问题!如果这对您有用,请考虑将答案标记为“已接受”,以帮助可能遇到此问题的其他人。
    • 是的,我只需要等待一个新问题的冷却时间才能标记它。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多