我需要检查哪个是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%
有可能吗?
答案 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
}