2012-03-22 4 views
0

Je sais que cette question aurait déjà été discutée des milliers de fois, mais je ne sais pas ce que je fais mal!imbriqué pour boucle avec if déclaration dans le fichier batch

J'ai le script de fichier bat suivant qui essaie d'effectuer un vidage mémoire basé sur PID de tous les processus en cours correspondant à la variable %PROCNAME%. Il semble effectuer ce dont j'ai besoin jusqu'à ce que je fasse écho au %DUMFILENAME%. Ici, il imprime le PID de la variable PID de l'itération précédente ...

E.g. Si j'ai 3 instances de bloc-notes (avec les PID 1, 2, 3) en cours d'exécution et que je cours la chauve-souris suivante. Je reçois suivant la sortie sur l'invite de commande:

"Current PID is 1" 

C:\Documents and Settings\userme\Local Settings\Application Data\notepad\notepad.exe_Thu 03222012204843.02.dmp 

"Current PID is 2" 

C:\Documents and Settings\userme\Local Settings\Application Data\notepad\notepad.exe_1_Thu 03222012204843.02.dmp 

"Current PID is 3" 

C:\Documents and Settings\userme\Local Settings\Application Data\notepad\notepad.exe_2_Thu 03222012204843.02.dmp 

Mon script de chauve-souris:

@echo off 
SETLOCAL EnableDelayedExpansion 
SET PROCNAME=notepad.exe 
FOR /F "tokens=1 delims=," %%A in ('tasklist /FI "IMAGENAME eq %PROCNAME%" /FO LIST') DO (
     set "maintoken=%%A" 
     Call:InnerToken !maintoken!) 
pause 
goto :end 
:InnerToken 
set innertoken=%1 
IF "%innertoken%"=="PID:" (
     FOR /F "tokens=1,2 delims=:" %%B in ("%innertoken%") DO (
     set "res=%~n2" 
     echo "Current PID is !res!" 
     SET "DUMPFILENAME=%USERPROFILE%\Local Settings\Application Data\Notepad\%PROCNAME%_!res!_%date:/=%%time::=%.dmp" 
     echo %DUMPFILENAME% 
     ) 
    ) 
:end 

Toute aide serait grandement appréciée ...

Répondre

2

Utilisez

echo !DUMPFILENAME! 

place .

Ce qui me surprend cependant, car vous savez déjà que vous avez besoin d'une expansion retardée lors de la définition et de l'utilisation de variables dans les blocs.

+0

Cela signifie-t-il que lorsque j'utilise une variable étendue retardée comme '! Res!' Pour créer une autre variable locale telle que 'DUMPFILENAME', je suis supposé traiter' DUMPFILENAME' aussi comme variable d'expansion différée? Je ne savais vraiment pas ça. –

+1

'cmd' n'est pas une feuille de calcul et ne suivra pas l'endroit où vos variables ont leurs valeurs. L'expansion différée est nécessaire car les variables sont développées quand * parsing * une instruction (qui, si elle est ou inclut un bloc, compte comme une seule instruction). – Joey