Command line 如何在命令行上按进程id查找windows进程

Command line 如何在命令行上按进程id查找windows进程,command-line,process,cmd,pid,tasklist,Command Line,Process,Cmd,Pid,Tasklist,我有两个进程在Windows7 prof上运行foo.cmd和bar.cmd,这两个进程都经常检查另一个进程是否仍在运行。 因为每个进程都知道变量%FPID%中另一个进程的PID,所以我经常检查另一个进程是否仍像这样运行 FOR /F "tokens=1,*" %%a in ('tasklist /FI "PID eq %FPID%" /NH ^| find /C "%FPID%"') do set COUNTP=%%a 如果%COUNTP%现在大于0,则另一个进程仍在运行 但有时%COUNT

我有两个进程在Windows7 prof上运行foo.cmd和bar.cmd,这两个进程都经常检查另一个进程是否仍在运行。 因为每个进程都知道变量%FPID%中另一个进程的PID,所以我经常检查另一个进程是否仍像这样运行

FOR /F "tokens=1,*" %%a in ('tasklist /FI "PID eq %FPID%" /NH ^| find /C "%FPID%"') do set COUNTP=%%a
如果%COUNTP%现在大于0,则另一个进程仍在运行

但有时%COUNTP%等于0,即使另一个进程实际上仍在运行,它仍会写入日志文件。 一秒钟后,它又被发现了

哪些情况会导致无法通过ID找到正在运行的进程,就像我对上述语句所做的那样? 是否有更好/更好/更快的方法来检查特定PID的进程是否仍处于活动状态并在windows上运行?
在我脑海中,我看到了WMI事件监视程序的_instanceDeleteEvent类。如果您选择了该路径,此剪报将引导您进入正确的方向,由WMI代码创建者提供

基本上,WMI将等待并检测$pid何时关闭,并在关闭后1秒内执行命令

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance.ProcessId = 1900")

Wscript.Echo "Waiting for events ..."
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent

    'report an event
    Wscript.Echo "__InstanceDeletionEvent event has occurred."

Loop

您能否解释一下这些批处理是如何知道彼此的PID的,您是否在脚本前面grep了WMIC流程?我们必须在WMI watcher中复制它,以使其按照您的意愿工作。或者你是在寻求如何做的帮助,我应该解释一下吗?谢谢你的回答。我得到了每个过程的PID,如下所示[并将它们写入文件foo.dat和bar.dat。现在,它们可以从文件中读取内容并将内容保存到变量%FPID%中,如set/p FPID=原因可能是PID错误或进程未运行。可能是您的看门狗进程重新启动了它,这就是找到它的原因。我们会在没有看到您的代码的情况下进行猜测。或者可能无法在foo.dat文件中设置新的pid。这显示了powershell动态显示的正确pid,但是否可以为WMIC.get进程|其中{$\ mainwindowtitle-match foo}|选择ID.ID