【问题标题】:Find out how many parent processes a batch-file is running under找出批处理文件在多少父进程下运行
【发布时间】:2017-07-24 17:56:32
【问题描述】:

我有一个在多个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

将返回 1,因为正在从根进程调用批处理文件

多进程批处理文件:

| Batch-file
   | CMD
      | Batch-file
         | Batch script

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

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

总结: 如何返回批处理文件在使用或不使用任何第三方实用程序的情况下执行的进程数?

【问题讨论】:

    标签: windows batch-file cmd process pid


    【解决方案1】:
    @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
    

    【讨论】:

      【解决方案2】:

      我尝试了 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"
         )
      )
      

      【讨论】:

        【解决方案3】:
        @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
        

        【讨论】:

          猜你喜欢
          • 2020-03-04
          • 1970-01-01
          • 2010-09-25
          • 2012-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-21
          相关资源
          最近更新 更多