script run how example create commands batch bat batch-file dos
sed para FREEDOS

batch file - run - ¿Cómo incrementar la variable en DOS?



create batch file (9)

Construí mi respuesta gracias a colaboradores anteriores.

No teniendo tiempo para un counter.exe personalizado, descargué sed para FREEDOS .

Y luego el código del lote podría ser, emulando "wc -l" con la utilidad sed, algo así de acuerdo con tu ciclo (solo lo uso para incrementar las ejecuciones comenzando desde "1" a n + 1):

Solo recuerda crear manualmente un archivo "test.txt" con escrito en la primera fila

0

sed -n ''$='' test.txt > counter.txt set /P Var=< counter.txt echo 0 >> test.txt

Me he pasado las últimas 3 horas tratando de resolver esto, pero no pude encontrar una solución. Aquí está mi script por lotes:

if NOT Exist Counter.txt GOTO START Type c:/counter.txt if %COUNTER% EQU %Cycles% goto Pass if NOT %COUNTER% EQU %Cycles% goto Cycle :START Set COUNTER=0 set CYCLES=250 :Cycle set /A COUNTER=%COUNTER%+1 <----------- PROBLEM echo Iteration %COUNTER% of %CYCLES% echo Delay 3 seconds to reboot choice /cy /n /t:y,3 warmboot.com :Pass pause

Lo que hace es ejecutar el archivo "warmboot.com" (que reinicia mi PC) y se ejecuta durante 250 ciclos. Una vez que los ciclos se han ejecutado 250 veces (es decir, cuando el contador es igual a los ciclos), entonces se detiene.

En Windows, esto funciona. Sin embargo, esto no funciona en el entorno de DOS. He probado versiones desde v4 hasta v6.22 e incluso v7 y todas fallan cuando alcanza la línea "PROBLEMA".

Si hago esto:

set /A COUNTER=%COUNTER%+1 echo %Counter%

O esto:

set /A COUNTER+=1 echo %Counter%

ambos devolverán una línea en blanco, es decir, no muestra nada como la salida.

Si escribo:

set /?

entonces muestra esto:

Muestra, establece o elimina variables de entorno cmd.exe.

SET [variable = [cadena]]

variable Especifica el nombre de la variable de entorno.
cadena Especifica una serie de caracteres para asignar a la variable.

pero escribir el mismo comando bajo CMD en Windows muestra muchas más cosas. Estoy pensando que la función SET en DOS no admite funciones aritméticas, pero para fines de trabajo tengo que ejecutar mis scripts solo en DOS.

¿Algunas ideas?


De hecho, set en DOS no tiene ninguna opción para permitir la aritmética. Sin embargo, podrías hacer una tabla de búsqueda gigante:

if %COUNTER%==249 set COUNTER=250 ... if %COUNTER%==3 set COUNTER=4 if %COUNTER%==2 set COUNTER=3 if %COUNTER%==1 set COUNTER=2 if %COUNTER%==0 set COUNTER=1


Directamente desde la línea de comando:

for /L %n in (1,1,100) do @echo %n

Usando un archivo por lotes:

@echo off for /L %%n in (1,1,100) do echo %%n

Muestra:

1 2 3 ... 100


Encontré mi propia solución.

Descargue FreeDOS desde aquí: http://chtaube.eu/computers/freedos/bootable-usb/

Luego, utilizando mi archivo Counter.exe (que básicamente genera un archivo Counter.txt e incrementa el número dentro de cada vez que se lo llama), puedo asignar el valor del número a una variable usando:

Set /P Variable =< Counter.txt

Entonces, puedo verificar si ha ejecutado 250 ciclos haciendo:

if %variable%==250 echo PASS

Por cierto, todavía no puedo usar Set / A porque FreeDOS no es compatible con este comando, pero al menos admite el comando Set / P.


Me doy cuenta de que ha encontrado otra respuesta, pero el hecho es que su código original era casi correcto, pero para un error de sintaxis.

Tu código contenía la línea

set /A COUNTER=%COUNTER%+1

y la sintaxis que funcionaría es simplemente ...

set /A COUNTER=COUNTER+1

Consulte http://ss64.com/nt/set.html para obtener todos los detalles sobre el comando SET. Solo pensé en agregar esta aclaración para cualquier otra persona que no tenga la opción de usar FreeDOS.


No usé DOS para - puh - se siente como décadas, pero basado en una vieja respuesta y mis recuerdos, lo siguiente debería funcionar (aunque no recibí comentarios, la respuesta fue aceptada, por lo que parece funcionar):

@echo off REM init.txt should already exist REM to create it: REM COPY CON INIT.TXT REM SET VARIABLE=^Z REM ( press Ctrl-Z to generate ^Z ) REM REM also the file "temp.txt" should exist. REM add another "x" to a file: echo x>>count.txt REM count the lines in the file and put it in a tempfile: type count.txt|find /v /c "" >temp.txt REM join init.txt and temp.txt to varset.bat: copy init.txt+temp.txt varset.bat REM execute it to set %variable%: call varset.bat for %%i in (%variable%) do set numb=%%i echo Count is: %numb% REM just because I''m curious, does the following work? : set numb2=%variable% echo numb2 is now %var2% if %numb%==250 goto :finished echo another boot... warmboot.exe :finished echo that was the last one.

En DOS, ni set /a ni set /p existen, así que tenemos que trabajar en eso. Creo que tanto for %%i in (%variable%) do set numb=%%i y set numb2=%variable% funcionará, pero no puedo verificar.

ADVERTENCIA: como no hay comparación ">" o "<" en DOS, debe eliminar el archivo por lotes en la etiqueta :finished (porque continúa incrementándose y 251 ya no es igual a 250)

(PD: la idea básica es de here . Gracias foxidrive. Lo sabía, lo sabía de pero me costaba encontrarlo de nuevo)


Un poco tarde para la fiesta, pero es una pregunta interesante.

Puedes escribir tu propio inc.bat para incrementar un número.
Puede incrementar los números de 0 a 9998.

@echo off if "%1"==":inc" goto :increment call %0 :inc %counter0% set counter0=%_cnt% if %_overflow%==0 goto :exit call %0 :inc %counter1% set counter1=%_cnt% if %_overflow%==0 goto :exit call %0 :inc %counter2% set counter2=%_cnt% if %_overflow%==0 goto :exit call %0 :inc %counter3% set counter3=%_cnt% goto :exit :increment set _overflow=0 set _cnt=%2 if "%_cnt%"=="" set _cnt=0 if %_cnt%==9 goto :overflow if %_cnt%==8 set _cnt=9 if %_cnt%==7 set _cnt=8 if %_cnt%==6 set _cnt=7 if %_cnt%==5 set _cnt=6 if %_cnt%==4 set _cnt=5 if %_cnt%==3 set _cnt=4 if %_cnt%==2 set _cnt=3 if %_cnt%==1 set _cnt=2 if %_cnt%==0 set _cnt=1 goto :exit :overflow set _cnt=0 set _overflow=1 goto :exit :exit set count=%counter3%%counter2%%counter1%%counter0%

Una muestra para usarlo está aquí

@echo off set counter0=0 set counter1= set counter2= set counter3= :loop call inc.bat echo %count% if not %count%==250 goto :loop


Vengo a la fiesta muy tarde, pero de mi antiguo recuerdo de los archivos por lotes de DOS, puedes seguir agregando un caracter a la cadena en cada ciclo y luego buscar una cadena de muchos de esos caracteres. para 250 iteraciones, tiene una cadena de "ciclos" muy larga, o tiene un bucle dentro usando un conjunto de variables que cuenta hasta 10, luego otro bucle externo que usa otro conjunto de conteo variable hasta 25.

Aquí está el bucle básico de 30:

@echo off rem put how many dots you want to loop set cycles=.............................. set cntr= :LOOP set cntr=%cntr%. echo around we go again if "%cycles%"=="%cntr%" goto done goto loop :DONE echo around we went


set / A count = 1 + count

Esto funcionó para mí usando Microsoft Windows [Version 6.1.7601]