批处理:每秒检查一次PID

时间:2017-04-28 14:43:52

标签: loops batch-file pid

我需要检查哪个是PID,例如" notebook.exe"如果这个过程在任务列表中运行,那么我需要每秒检查一次:

如果我在程序运行时运行它,则可以运行:

hclust

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

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%

有可能吗?

2 个答案:

答案 0 :(得分:1)

您正在尝试使用在for循环中设置的变量。由于批处理是逐行执行的,而代码块(例如循环)被计为一行,因此批处理将首先将%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也确保等待1秒才返回:loop

答案 1 :(得分:0)

在PowerShell中做得最好:

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