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]