2011-06-27 13 views
11

Estoy intentando imprimir un número aleatorio varias veces pero en el ciclo for utilizado, no restablece la variable. Aquí está mi código.Variable aleatoria que no cambia en el ciclo "for" en el archivo de proceso por lotes de Windows

@echo off 


for %%i in (*.txt) do (

set checker=%Random% 
echo %checker% 
echo %%i% >> backupF 

) 


echo Complete 

Hay 5 archivos de texto y así lo quiero para imprimir 5 números aleatorios diferentes, pero simplemente imprime el mismo número aleatorio 5 veces. Cualquier ayuda sería muy apreciada. ¡Gracias!

+0

El script anterior sentido doesnt make. La variable "Aleatorio" no está configurada por nada, por lo que el comprobador siempre es nulo. Además, el %% i% tampoco tiene sentido ... debe ser %% i. Creo que esto podría funcionar sin usar la expansión retrasada si tu descripción del problema fue un poco mejor. – djangofan

Respuesta

15

No estoy seguro de cómo ha podido imprimir un solo número al azar. En su caso, %checker% debe evaluar a una cadena vacía, a menos que ejecute su secuencia de comandos más de una vez desde la misma sesión cmd.

Básicamente, la razón por la que su script no funciona como se esperaba es porque las variables en el cuerpo del bucle se analizan y se evalúan antes de que se ejecute el bucle. Cuando el cuerpo se ejecuta, los valores ya se han evaluado y se utilizan los mismos valores en todas las iteraciones.

Lo que necesita, por lo tanto, es una evaluación diferida, de lo contrario se llama dilatación retrasada. Primero debe habilitarlo, luego use una sintaxis especial para él.

Aquí está el script modificado con el fin de utilizar la expansión retardada:

@echo off 

setlocal EnableDelayedExpansion 

for %%i in (*.txt) do (

set checker=!Random! 
echo !checker! 
echo %%i% >> backupF 

) 

endlocal 

echo Complete 

Como se puede ver, setlocal EnableDelayedExpansion permite un procesamiento especial para la sintaxis de expansión retardada, que es ! s alrededor de los nombres de las variables en lugar de % s .

Aún puede usar la expansión inmediata (usando %) donde puede funcionar correctamente (básicamente, fuera de los bloques de comando entre corchetes).

+0

Muchas gracias. Escribí un intérprete de comandos de Linux y estoy tratando de transferirlo al lote de Windows, así que estoy un poco atrasado en la sintaxis. Realmente lo aprecio sin embargo. ¡Gracias de nuevo! – mike

0

en mi sistema tengo que escribir

set checker=Random 

en lugar de

set checker=!Random! 
Cuestiones relacionadas