我有一个批处理脚本,我想捕获它的进程 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.用第二支球棒继续执行。