2010-12-02 12 views
16

Les éléments suivants imbriquée boucle for me rend fou (sous Windows 7):lot Nested pour les boucles

@echo off 
SetLocal EnableDelayedExpansion 

set TESTDIRS=fast mid slow 
set TD=src\test\resources\testsuite 

for %%d in (%TESTDIRS%) do (
    set CTD=%TD%\%%d 
    echo CTD: !CTD! 
     REM Echos the expected path 
    echo CTD: %CTD% 
     REM Echos nothing -- understandable 

    for /R !CTD! %%f in (*.fs) do (echo %%f) 
     REM Echos nothing -- why? 
    for /R src\test\resources\testsuite\fast %%f in (*.fs) do (echo %%f) 
     REM Echos expected files 
) 

J'ai essayé diverses solutions impliquant la désactivation DelayedExpansion, appelez-déclarations et ainsi de suite, mais je jamais eu la boucle intérieure travail. Je sais que je pourrais remplacer la boucle interne par un appel de sous-programme, mais il doit y avoir un moyen de le faire fonctionner avec des boucles imbriquées.

Répondre

8

si vous avez utilisé pushd !CTD! et popd, et laissez-FOR /R par défaut d'utiliser le répertoire en cours?

+2

+1 pour une solution de contournement bonne et simple – jeb

+0

C'est en effet une bonne solution de contournement! Mais probablement pas toujours applicable ... –

+0

J'accepte cette solution car elle résout la question dans le contexte de mon exemple. Et c'est vraiment intelligent :-) –

4

Ce n'est pas évident! C'est l'analyse spéciale de POUR!
A FOR La commande est analysée directement après la phase d'échappement/caractère spécial (pour détecter la parenthèse), mais par conséquent vous ne pouvez pas utiliser l'expansion retardée ou %% var en tant que paramètres.

FOR %%a in (%%%%B) do (
    FOR %%a in (1) DO (<<< this %%a will not replaced with %%B 
     echo %%a - shows 1, because %%a is the name of the inner variable 
     echo %%B - doesn't work 
) 
) 

Et cela ne peut pas fonctionner:

set chars=abc 
FOR /F "delims=!chars!" %%N in (bla) DO .... 

ne définit pas un, b et c comme delims, mais !, c, h, un et r place.

EDIT: Dans les parenthèses l'expansion retardée ne fonctionne pas comme prévu cependant:

set var=C:\temp 
For %%a in (!var!) DO echo %%a 

j'attendre à ce que vous devez utiliser une fonction pour résoudre votre problème.

+1

Désolé, mais je ne vois pas comment votre réponse m'aide avec ma question, car elle ne me dit que ce qui ne fonctionne pas. En outre, j'ai déjà mentionné dans ma question que je suis conscient de la possibilité de remplacer la boucle interne par un sous-programme mais ma question était de savoir comment faire fonctionner la boucle imbriquée. –

+1

Désolé, mais je suppose que vous ne pouvez utiliser la solution PUSHD de Ben Voigt.Avec l'expansion, il semble être impossible, car le chemin de la boucle interne est développé seulement un, au début de la première parenthèse, – jeb

18

Pour donner un exemple d'une boucle imbriquée qui fonctionne:

@echo off 
SetLocal 

set B=alpha beta gamma 
set A=eins zwo 

FOR %%b in (%B%) do (
    FOR %%a in (%A% %%b) DO (
    echo %%b -^> %%a 
) 
) 

La sortie (au moins sur Windows 7) est

alpha -> eins 
alpha -> zwo 
alpha -> alpha 
beta -> eins 
beta -> zwo 
beta -> beta 
gamma -> eins 
gamma -> zwo 
gamma -> gamma 

Cela confirme l'observation de jeb que l'expansion variable dans les boucles travaux si elles se produisent entre parenthèses (même sans expansion retardée).

+1

salut j'ai utilisé votre exemple mais il va imprimer %% b au lieu de %% a dans le dernier raide, je l'ai résolu en utilisant juste pour %% a dans (% A%) dans la boucle interne –

+0

@JuanAntonioOrozco Vous avez peut-être observé le comportement souhaité. J'ai édité ma réponse pour clarifier ce que la boucle devrait imprimer. –

8

Parce que personne ne l'a mentionné, voici la solution utilisant des sous-programmes batch et la commande CALL. Je sais que GOTO n'est pas très populaire, mais les fichiers batch ont été conçus à l'origine pour utiliser des étiquettes pour le flux de contrôle. La syntaxe de structure de contrôle parenthetized a été ajoutée plus tard, et cette question est un exemple d'où il se décompose. Le problème se prête bien aux sous-programmes par lots.

+0

C'était ce que je cherchais ... merci – Edoctoor