首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出一个批处理文件在多少个父进程下运行。

找出一个批处理文件在多少个父进程下运行。
EN

Stack Overflow用户
提问于 2017-03-04 17:21:09
回答 3查看 629关注 0票数 1

我有一个批处理文件,它在多个CMD会话中调用自己,例如:

代码语言:javascript
复制
@echo off
if "%var%"=="set" goto :begin
set var=set
call cmd /c %0

:begin
echo Inside CMD session! Executed under x processes
pause

我想要完成的是获得一个批处理文件被调用的进程数。

普通批处理文件:

代码语言:javascript
复制
| Batch-file
   | Batch script

将返回1,因为批处理文件是从根进程调用的。

多进程批处理-文件:

代码语言:javascript
复制
| Batch-file
   | CMD
      | Batch-file
         | Batch script

将返回2,因为正在从另一个批处理文件调用批处理文件。

一个可能的解决方案是获取根进程标识符号(PID),然后分析该进程的等待链,我可以在任务管理器中轻松完成这个任务:

摘要:如何返回批处理文件在任何第三方实用程序下执行的进程数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-04 18:24:22

代码语言:javascript
复制
@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

输出示例:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2017-03-04 18:54:27

我仔细研究了Aacini的代码,使树更直观

代码语言:javascript
复制
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

改变中间部分

代码语言:javascript
复制
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"
   )
)
票数 1
EN

Stack Overflow用户

发布于 2020-09-12 05:05:27

代码语言:javascript
复制
@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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42598938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档