找出一个批处理文件 运行 下有多少个父进程
Find out how many parent processes a batch-file is running under
我有一个在多个 CMD
会话中调用自身的批处理文件,例如:
@echo off
if "%var%"=="set" goto :begin
set var=set
call cmd /c %0
:begin
echo Inside CMD session! Executed under x processes
pause
我想要完成的是获取从中调用批处理文件的进程数。
普通批处理文件:
| Batch-file
| Batch script
会 return 1
,因为正在从根进程调用批处理文件
多进程批处理文件:
| Batch-file
| CMD
| Batch-file
| Batch script
会 return 2
,因为正在从另一个批处理文件调用批处理文件。
一个可能的解决方案是获取根进程标识符号 (PID),然后分析该进程的等待链,我可以在任务管理器中轻松完成:
总结:
我如何 return 在有或没有任何第三方实用程序的情况下执行批处理文件的进程数?
@echo off
setlocal
if "%var%"=="3" goto :begin
set /A var+=1
cmd /C "%~F0"
goto :EOF
:begin
echo Inside CMD session!
wmic process where "name='cmd.exe'" get ExecutablePath,ParentProcessId,ProcessId > wmic.txt
for /F "skip=1 tokens=1-3" %%a in ('type wmic.txt') do (
ECHO %%a - Parent: %%b - PID: %%c
set "Parent[%%c]=%%b"
set "This=%%c"
)
set X=0
:nextParent
set /A X+=1
call set "This=%%Parent[%This%]%%"
if defined Parent[%This%] goto nextParent
echo Executed under %X% processes
输出示例:
Inside CMD session!
C:\Windows\system32\cmd.exe - Parent: 3792 - PID: 4416
C:\Windows\system32\cmd.exe - Parent: 4416 - PID: 3220
C:\Windows\system32\cmd.exe - Parent: 3220 - PID: 1728
C:\Windows\system32\cmd.exe - Parent: 1728 - PID: 3560
Executed under 4 processes
我尝试了 Aacini 的代码,使树更加直观
Inside CMD session
C:\WINDOWS\system32\cmd.exe - 1004:12424
C:\WINDOWS\system32\cmd.exe - 12424:12016
C:\WINDOWS\system32\cmd.exe - 12016:10592
C:\WINDOWS\system32\cmd.exe - 10592:11392
C:\WINDOWS\system32\cmd.exe - 11392:5616
Executed under 5 processes
改变了中间部分
Set "Space="
wmic process get ExecutablePath,ParentProcessId,ProcessId > wmic.txt
for /F "tokens=1-3" %%a in ('type wmic.txt') do (
if /I "%%a" equ "%ComSpec%" (
Call ECHO %%a - %%Space%%%%b:%%c
CAll Set "Space=%%Space%% "
set "Parent[%%c]=%%b"
set "This=%%c"
)
)
@echo off
setlocal
if "%var%"=="3" goto :begin
set /A var+=1
cmd /C "%~F0"
goto :EOF
:begin
echo Inside CMD session!
set /p Space=
wmic process get ExecutablePath,ParentProcessId,ProcessId > wmic.txt
for /F "tokens=1-3" %%a in ('type wmic.txt') do (
if /I "%%a" equ "%ComSpec%" (
Call ECHO %%a - %%Space%%%%b:%%c
CAll Set "Space=%%Space%% "
set "Parent[%%c]=%%b"
set "This=%%c"
)
)
set X=0
:nextParent
set /A X+=1
call set "This=%%Parent[%This%]%%"
if defined Parent[%This%] goto nextParent
echo Executed under %X% processes
pause
我有一个在多个 CMD
会话中调用自身的批处理文件,例如:
@echo off
if "%var%"=="set" goto :begin
set var=set
call cmd /c %0
:begin
echo Inside CMD session! Executed under x processes
pause
我想要完成的是获取从中调用批处理文件的进程数。
普通批处理文件:
| Batch-file
| Batch script
会 return 1
,因为正在从根进程调用批处理文件
多进程批处理文件:
| Batch-file
| CMD
| Batch-file
| Batch script
会 return 2
,因为正在从另一个批处理文件调用批处理文件。
一个可能的解决方案是获取根进程标识符号 (PID),然后分析该进程的等待链,我可以在任务管理器中轻松完成:
总结: 我如何 return 在有或没有任何第三方实用程序的情况下执行批处理文件的进程数?
@echo off
setlocal
if "%var%"=="3" goto :begin
set /A var+=1
cmd /C "%~F0"
goto :EOF
:begin
echo Inside CMD session!
wmic process where "name='cmd.exe'" get ExecutablePath,ParentProcessId,ProcessId > wmic.txt
for /F "skip=1 tokens=1-3" %%a in ('type wmic.txt') do (
ECHO %%a - Parent: %%b - PID: %%c
set "Parent[%%c]=%%b"
set "This=%%c"
)
set X=0
:nextParent
set /A X+=1
call set "This=%%Parent[%This%]%%"
if defined Parent[%This%] goto nextParent
echo Executed under %X% processes
输出示例:
Inside CMD session!
C:\Windows\system32\cmd.exe - Parent: 3792 - PID: 4416
C:\Windows\system32\cmd.exe - Parent: 4416 - PID: 3220
C:\Windows\system32\cmd.exe - Parent: 3220 - PID: 1728
C:\Windows\system32\cmd.exe - Parent: 1728 - PID: 3560
Executed under 4 processes
我尝试了 Aacini 的代码,使树更加直观
Inside CMD session
C:\WINDOWS\system32\cmd.exe - 1004:12424
C:\WINDOWS\system32\cmd.exe - 12424:12016
C:\WINDOWS\system32\cmd.exe - 12016:10592
C:\WINDOWS\system32\cmd.exe - 10592:11392
C:\WINDOWS\system32\cmd.exe - 11392:5616
Executed under 5 processes
改变了中间部分
Set "Space="
wmic process get ExecutablePath,ParentProcessId,ProcessId > wmic.txt
for /F "tokens=1-3" %%a in ('type wmic.txt') do (
if /I "%%a" equ "%ComSpec%" (
Call ECHO %%a - %%Space%%%%b:%%c
CAll Set "Space=%%Space%% "
set "Parent[%%c]=%%b"
set "This=%%c"
)
)
@echo off
setlocal
if "%var%"=="3" goto :begin
set /A var+=1
cmd /C "%~F0"
goto :EOF
:begin
echo Inside CMD session!
set /p Space=
wmic process get ExecutablePath,ParentProcessId,ProcessId > wmic.txt
for /F "tokens=1-3" %%a in ('type wmic.txt') do (
if /I "%%a" equ "%ComSpec%" (
Call ECHO %%a - %%Space%%%%b:%%c
CAll Set "Space=%%Space%% "
set "Parent[%%c]=%%b"
set "This=%%c"
)
)
set X=0
:nextParent
set /A X+=1
call set "This=%%Parent[%This%]%%"
if defined Parent[%This%] goto nextParent
echo Executed under %X% processes
pause