2010-05-26 13 views
38

Estoy tratando de leer líneas de texto de un archivo, e incrementar un contador para poder eventualmente simular una matriz en DOS.¿Cómo puedo incrementar una variable de DOS en un ciclo FOR/F?

Me gustaría poder almacenar las líneas de texto en una matriz DOS para su posterior procesamiento.

Mi intento actual es:

set TEXT_T="myfile.txt" 

set /a c=1 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
set /a c=c+1 
echo %%i, %c% 
) 

Pero la variable c no está incrementando; se mantiene en 1.

Sugerencias bienvenidas.

Gracias, Mike

Respuesta

72

El problema con el fragmento de código es la forma en que las variables son expandidas. La expansión de variables generalmente se realiza cuando se lee por primera vez una declaración. En su caso, el ciclo entero FOR y su bloque se leen y todas las variables, excepto las variables de ciclo, se expanden a su valor actual.

Esto significa %c% en su echo %%i, %c% ampliado al instante y por lo tanto se usa como echo %%i, 1 en cada iteración de bucle.

Entonces, lo que necesita es la expansión de la variable demorada. Encuentre alguna buena explicación al respecto here.

Las variables que se deben demorar expandidas se referencian con !VARIABLE! en lugar de %VARIABLE%. Pero debe activar esta función con setlocal ENABLEDELAYEDEXPANSION y restablecerla con un endlocal correspondiente.

Su código modificado se vería algo así:

set TEXT_T="myfile.txt" 

set /a c=1 

setlocal ENABLEDELAYEDEXPANSION 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c=c+1 

    echo %%i, !c! 
) 

endlocal 
+0

Super Duper! Esto es justo lo que necesitaba. Modifiqué el script en consecuencia y ahora se ejecuta como esperaba. Gracias por la respuesta rápida. - Mike – Mike

+3

@Mike: ¡debe marcar esta respuesta como aceptada si resolvió su problema! – Sk8erPeter

+0

@Frank Bollack. Muchas gracias por esta explicación, aprendí algo nuevo. Utilicé esta técnica para responder a esta otra pregunta: http://serverfault.com/questions/664202/batch-file-that-kills-a-certain-process. Funciona, pero no estoy seguro de cómo debería hacer referencia a las variables _outside_ del ciclo FOR. ¿Hace una diferencia, usando! C! o% c%, en eso SI tengo después de FOR? – pgr

3

me gustaría añadir que en el caso de crear variables locales dentro del bucle, que es necesario ampliar el uso de la explosión notación que (!) bien. Extendiendo el ejemplo en https://stackoverflow.com/a/2919699 anterior, si queremos crear nombres de archivo de salida basados ​​en el contador

set TEXT_T="myfile.txt" 

set /a c=1 

setlocal ENABLEDELAYEDEXPANSION 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c=c+1 
    set OUTPUT_FILE_NAME=output_!c!.txt 
    echo Output file is !OUTPUT_FILE_NAME! 
    echo %%i, !c! 
) 

endlocal 
2

O puede hacer esto sin usar retardo.

set /a "counter=0" 

-> el bucle for aquí

do (
    statement1 
    statement2 
    call :increaseby1 
) 

:increaseby1 
set /a "counter+=1" 
0
set TEXT_T="myfile.txt" 
set /a c=1 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c+=1 
    set OUTPUT_FILE_NAME=output_%c%.txt 
    echo Output file is %OUTPUT_FILE_NAME% 
    echo %%i, %c% 
) 
0

Uso de Windows 7. No se puede obtener la EnableDelayedExpansion a hacer su cosa. Tengo dos archivos de prueba llamados Test1.tst y Test2.tst. Quiero hacer algo solo con el primero. ¡Los dos lugares donde estoy! no resuelve el valor El último echo imprime cero. Aquí está mi código:

set /a count1=0 

setlocal EnableDelayedExpansion 
for %%x in (*.tst) do (

    if !count1! GTR 0 goto :getout 

    call :addit 

    type %%x 

    ren %%x *.xxx 

) 
@echo Almost done... 
goto :alldone 

:addit 
set /a count1=%count1% + 1 
@echo %count1% 
goto :eof 

:getout 
@echo Getting out... 
@echo !count! 

:alldone 
endlocal 
-1

¿Qué pasa con este código simple, que funciona para mí y en Windows 7

set cntr=1 
:begin 
echo %cntr% 
set /a cntr=%cntr%+1 
if %cntr% EQU 1000 goto end 
goto begin 

:end 
Cuestiones relacionadas