2017-03-04 1 views
1

j'ai un lot fichier qui est lui-même appelle à plusieurs CMD sessions, par exemple:Découvrez combien de parent traite un fichier de commandes est en cours d'exécution sous

@echo off 
if "%var%"=="set" goto :begin 
set var=set 
call cmd /c %0 

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

Ce que je suis en train d'accomplir est d'obtenir le nombre de processus à partir duquel un fichier batch est appelé.

fichier batch normal:

| Batch-file 
    | Batch script 

reviendriez 1, comme le fichier de commandes est appelé par le processus racine

plusieurs lots fichier de processus:

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

Renvoie 2, comme le batc h-file est appelé depuis un autre fichier batch.

Une solution possible serait d'obtenir le numéro d'identification de processus racine (PID), puis d'analyser la chaîne d'attente pour ce processus, que je suis en mesure d'accomplir facilement dans le Gestionnaire des tâches:

Wait chain, Task Manager

Résumé: Comment puis-je retourner le nombre de processus sous lesquels un fichier batch est exécuté, avec ou sans utilitaires tiers?

Répondre

3
@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 

Exemple de sortie:

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 
1

Je tâté avec le code de Aacini d'avoir l'arbre plus visuel

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 

Changé la partie centrale

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" 
    ) 
)