WMIC ProcessID 未在同一个命令实例中进行解析

WMIC ProcessID 未在同一个命令实例中进行解析

我有一个批处理脚本,我想捕获它的进程 ID,但是 PID 并未在同一个命令实例中被解析。

例如,使用以下代码运行批处理脚本将显示“无可用实例”。但如果我打开新的命令提示符并运行相同的 WMIC 命令,我实际上可以获取 PID。

@ECHO OFF

SETLOCAL enabledelayedexpansion
SET "ProcessID="
FOR /F "usebackq skip=1 delims=" %%I IN (`wmic Path win32_process Where "CommandLine Like '%NetworkTroubleshooter%' AND Caption Like 'cmd.exe'" GET ProcessID ^| findstr /r /v "ProcessId" 2^>nul`) DO SET "ProcessID=%%I"
IF "%ProcessID%" == "" (
    ECHO PID could not be determined.
) ELSE (
    ECHO PID is: %ProcessID%
)
ENDLOCAL

在批处理脚本中

No Instance(s) Available.
PID could not be determined.
Press any key to continue . . .

新的命令窗口包含以下命令...

Microsoft Windows [Version 10.0.19045.2728]
(c) Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>wmic Path win32_process Where "CommandLine Like '%NetworkTroubleshooter%' AND Caption Like 'cmd.exe'" GET ProcessID | findstr /r /v "ProcessId"
22860


C:\WINDOWS\system32>

答案1

.bat在这篇文章中可以找到多种文件查找其自身进程 ID 的方法
如何从 Windows 中的命令提示符获取自己的进程 pid

这可能是最简单的一个:

for /F %%a in ('PowerShell -ex bypass "(gwmi Win32_Process -f ProcessID=$((gwmi Win32_Process -f ProcessId=$PID).ParentProcessID)).ParentProcessID"') do set my_pid=%%a
echo %my_pid%

它使用 PowerShell 获取祖父进程的 PID,因为for引入了一个额外的cmd.exe

您将在链接的帖子中找到更多不同类型的方法。

答案2

@echo off

if not "_%~2" == "_processID" =;(
     call "%~f0" networktroubleshooter processID & exit /b 
    );=

set "_%~2=" & for /f useback^tokens^=4^delims^=^<^> %%G in =;(`
     wmic.exe Process where "Name like '%%cmd.exe%%' and CommandLine like '%%^<%~1^>%%'" get %~2 /format:xml ^| find "VALUE"
   `);= do set "_%~2=%%~G"

if not defined _%~2 =;( 
     echo\pid could not be determined. 
    );= else echo\pid is: %_processID%

1.调用你的批次;
2.检查是否传递了任何参数;
3.若否,则再次呼叫并结束第一次通话;
4.如果传递了任何内容,则使用它们来获取 PID;
5.用第二支球棒继续执行。

相关内容