批处理:每秒检查一次 PID

Batch: check for the PID each second

我需要检查哪个是 "notebook.exe" 的 PID,如果这个进程在任务列表中是 运行,所以我需要每秒检查一次:

如果我 运行 在程序为 运行 时运行:

echo off
cls
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion


    for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='notebook.exe'" get ProcessID ^| findstr [0-9]') do set MyPID=%%a   
        @echo %USERNAME%-%COMPUTERNAME%-%MyPID%

但我需要每秒检查一次。相同但进入循环,但不起作用(MyPID变量为空)

echo off
cls
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion

for /L %%n in (1,0,10) do (
    for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='notebook.exe'" get ProcessID ^| findstr [0-9]') do set MyPID=%%a   
        @echo %USERNAME%-%COMPUTERNAME%-%MyPID%
)

可能吗?

最好在 PowerShell 中完成:

while ($true) {
    Start-Sleep -Seconds 1
    "{0}-{1}-{2}" -f $env:UserName,$env.ComputerName,(Get-Process -Name "Notebook.exe").id
}

您正在尝试使用在 for 循环中设置的变量。由于 batch 是逐行执行的,并且代码块(例如循环)被算作一行,因此这将不起作用,因为 batch 会先将 %MyPID% 扩展为它的值,然后执行整个 for 循环。

您已接近解决此问题的方法。使用 Enable DelayedExpansion 是技巧的一部分。但是您还需要在循环内的变量周围使用 ! 来将它们标记为延迟。

总之,这应该有效:

@echo off
cls
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion

for /L %%n in (1,0,10) do (
    for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='notebook.exe'" get ProcessID ^| findstr [0-9]') do set MyPID=%%a   
        echo %USERNAME%-%COMPUTERNAME%-!MyPID!
)

但是,请注意,使用标签可以更轻松地批量循环,因此这也行得通,无需延迟扩展:

@echo off
cls
SETLOCAL EnableExtensions

:loop

for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='notebook.exe'" get ProcessID ^| findstr [0-9]') do set MyPID=%%a   
echo %USERNAME%-%COMPUTERNAME%-%MyPID%
timeout /t 1 /nobreak >nul

goto :loop

timeout /t 1 还确保它在返回 :loop

之前等待 1 秒