批处理:每秒检查一次 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 秒
我需要检查哪个是 "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