【问题标题】:How to find windows process by process id on commandline如何在命令行上通过进程 ID 查找 Windows 进程
【发布时间】:2013-12-16 14:54:53
【问题描述】:

我有两个进程正在运行(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 上)?

【问题讨论】:

  • 你能解释一下这些批次是如何知道彼此的 pids 的吗,你在脚本前面是否 grep WMIC PROCESS ?我们必须在 WMI 观察程序中复制它才能像您想要的那样工作。还是您在寻求帮助,我应该解释一下?
  • 感谢您的回答。我像这里 [serverfault.com/questions/126502] 一样获得每个进程的 PID,并将它们写入文件(foo.dat 和 bar.dat)。现在他们可以从文件中读取并将内容保存到变量%FPID% 中,例如set /p FPID=<"C:\tmp\foo.dat"。这非常有效,通常我可以每分钟通过此 ID 识别其他正在运行的进程。每隔约 250 次我就找不到其他进程 - 为什么它对命令 tasklist /FI "PID eq %FPID%" /N 不可见
  • 原因可能是 PID 错误或进程未运行。也许您的看门狗进程重新启动了它,这就是它被发现的原因。我们会在没有看到您的代码的情况下猜测。
  • 或者它可能无法在 foo.dat 文件中设置新的 pid。这显示了来自 powershell 的正确 pid,但可以为 WMIC 重写它。 (get-process | where {$_.mainwindowtitle -match "Foo"}|select ID).ID

标签: command-line process cmd pid tasklist


【解决方案1】:

在我的脑海中,我正在查看用于 WMI 事件观察器的 __InstanceDeletionEvent 类。如果您选择该路线,此片段将引导您走向正确的方向,感谢 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2012-02-25
    • 2015-01-28
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多