2010-12-02 17 views
16

Los siguientes anidado bucle for me vuelve loca (en Windows 7):lotes bucles for anidados

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

He intentado varias soluciones que implican la desactivación DelayedExpansion, call-declaraciones y todo eso, pero nunca consiguió el bucle interno trabajando. Sé que podría reemplazar el ciclo interno por una llamada de subrutina, pero debe haber una forma de hacerlo funcionar con bucles anidados.

Respuesta

8

¿Qué pasa si usaste pushd !CTD! y popd, y dejaste que FOR /R use por defecto el directorio actual?

+2

+1 para una solución buena y simple – jeb

+0

¡De hecho, es una buena solución! Pero probablemente no siempre sea aplicable ... –

+0

Aceptaré esta solución ya que resuelve la pregunta en el contexto de mi ejemplo. Y es realmente inteligente :-) –

4

¡No es obvio! ¡Es el análisis especial de FOR!
A El comando se analiza directamente después de la fase de escape/carácter especial (para detectar el paréntesis), pero como resultado no se puede usar la expansión retardada o %% var como parámetros.

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

Y también esto no puede funcionar:

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

no establece un , b y c como delims, pero !, c, h, un y r su lugar.

EDIT: Dentro de los paréntesis, la expansión retardada funciona como se espera, sin embargo:

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

yo esperaría que usted tiene que utilizar una función para resolver su problema.

+1

Lo siento, pero no veo cómo su respuesta me ayuda con mi pregunta, ya que solo me dice lo que no funciona. Además, ya mencioné en mi pregunta que soy consciente de la posibilidad de reemplazar el bucle interno con una subrutina, pero mi pregunta era cómo hacer que funcione el bucle anidado. –

+1

Lo siento, pero supongo que solo puedes usar la solución PUSHD de Ben Voigt.Con la expansión parece ser imposible, porque la ruta para el ciclo interno se expande solo una, al comienzo del primer paréntesis, – jeb

18

Sólo para dar un ejemplo de un bucle anidado que funciona:

@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 salida (al menos en Windows 7) es

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

Esto apoya la observación de jeb que la expansión variable en bucles obras si ocurren dentro de paréntesis (incluso sin expansión retardada).

+1

hola utilicé su ejemplo, pero imprimirá %% b en lugar de %% a en la última pendiente, lo resolví con solo FOR %% a in (% A%) en el ciclo interno –

+0

@JuanAntonioOrozco Es posible que haya observado el comportamiento previsto. Edité mi respuesta para aclarar qué debería imprimir el ciclo. –

8

Como nadie lo ha mencionado, esta es la solución que utiliza subrutinas de proceso por lotes y el comando CALL.

@echo off 

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

for %%d in (%TESTDIRS%) do call :process_testdir %%d 
goto :eof 

:process_testdir 
set CTD=%TD%\%1 
echo CTD: %CTD% 
    REM Echos the expected path 

for /R %CTD% %%f in (*.fs) do (echo %%f) 
    REM Echos as expected 

goto :eof 

Sé que GOTO no es muy popular, pero los archivos por lotes fueron diseñados originalmente para usar etiquetas para el flujo de control. La sintaxis de estructura de control entre paréntesis se agregó más tarde, y esta pregunta es un ejemplo de dónde se descompone. El problema se presta bien a las subrutinas de lotes.

+0

Esto era lo que estaba buscando ... gracias – Edoctoor

Cuestiones relacionadas