web-dev-qa-db-fra.com

Comment incrémenter variable sous DOS?

J'ai passé les trois dernières heures à essayer de résoudre ce problème, mais je ne trouvais pas de solution. Voici mon script batch:

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

Ce qu'il fait est qu'il exécute le fichier "warmboot.com" (qui redémarre mon PC) et fonctionne pendant 250 cycles. Une fois que les cycles ont été exécutés 250 fois (c'est-à-dire lorsque le compteur est égal à cycles), ils s'arrêtent.

Sous Windows, cela fonctionne. Cependant, cela ne fonctionne pas sous l'environnement DOS. J'ai essayé des versions de la v4 jusqu'à la v6.22 et même la v7 et elles échouent toutes lorsqu'elles atteignent la ligne "PROBLEM".

Si je fais ça:

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

Ou ca:

set /A COUNTER+=1
echo %Counter%

les deux renverront une ligne vide, c'est-à-dire qu'elle ne montre rien en sortie. 

Si je tape:

set /?

alors cela montre ceci:

Affiche, définit ou supprime les variables d'environnement cmd.exe.

SET [variable = [chaîne]]

variable Spécifie le nom de la variable d'environnement.
chaîne Spécifie une série de caractères à affecter à la variable.

mais taper la même commande sous CMD dans Windows montre beaucoup plus de choses. Je pense que la fonction SET sous DOS ne prend pas en charge les fonctions arithmétiques, mais pour des raisons professionnelles, je dois exécuter mes scripts uniquement sous DOS.

Des idées?

33
shadowz1337

Je me rends compte que vous avez trouvé une autre réponse - mais le fait est que votre code d'origine était presque correct, sauf pour une erreur de syntaxe.

Votre code contenait la ligne

set /A COUNTER=%COUNTER%+1

et la syntaxe qui fonctionnerait est simplement ...

set /A COUNTER=COUNTER+1

Voir http://ss64.com/nt/set.html pour tous les détails sur la commande SET. Je pensais juste que j'ajouterais cette clarification à quiconque n'ayant pas la possibilité d'utiliser FreeDOS. 

58
Furr

En effet, set sous DOS n’a aucune option permettant l’arithmétique. Vous pouvez faire une table de recherche géante, cependant:

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
4
Joey

Un peu tard pour la fête, mais c’est une question intéressante.

Vous pouvez écrire votre propre inc.bat pour incrémenter un nombre.
Il peut incrémenter des nombres de 0 à 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%

Un échantillon pour l'utiliser est ici

@echo off
set counter0=0
set counter1=
set counter2=
set counter3=

:loop
call inc.bat
echo %count%
if not %count%==250 goto :loop
3
jeb

Directement depuis la ligne de commande:

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

Utiliser un fichier de commandes:

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

Affiche:

 1
 2
 3
 ...
 100
2
Niente0

J'ai trouvé ma propre solution.

Téléchargez FreeDOS à partir d’ici: http://chtaube.eu/computers/freedos/bootable-usb/

Puis, en utilisant mon fichier Counter.exe (qui génère un fichier Counter.txt et incrémente le numéro à chaque appel), je peux affecter la valeur du nombre à une variable à l'aide de:

Set /P Variable =< Counter.txt

Ensuite, je peux vérifier s'il a exécuté 250 cycles en faisant:

if %variable%==250 echo PASS

En passant, je ne peux toujours pas utiliser Set/A car FreeDOS ne prend pas en charge cette commande, mais au moins, elle prend en charge la commande Set/P.

1
shadowz1337

J'ai construit ma réponse grâce aux contributeurs précédents.

N'ayant pas le temps de créer un compteur personnalisé, j'ai téléchargé sed pour FREEDOS .

Et puis le code de lot pourrait être, en émulant "wc -l" avec l'utilitaire sed, quelque chose comme ceci en fonction de votre boucle (je l'utilise simplement pour incrémenter des exécutions commençant de "1" à n + 1):

Rappelez-vous simplement de créer manuellement un fichier "test.txt" avec écrit sur la première ligne


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

Je n'ai pas utilisé DOS pour - puh - cela fait des décennies, mais d'après une vieille réponse et mes souvenirs, cela devrait fonctionner (même si je n'ai pas eu de retour, la réponse a été acceptée, donc cela semble fonctionner) :

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

Sous DOS, ni set /a ni set /p n'existent, nous devons donc contourner ce problème . Je pense que for %%i in (%variable%) do set numb=%%i et set numb2=%variable% fonctionneront, mais je ne peux pas vérifier.

ATTENTION: comme il n’existe pas de comparaison ">" ou "<" sous DOS, vous devez supprimer le fichier batch situé sur l’étiquette :finished (car il continue à s’incrémenter et 251 n’est plus égal à 250)

(PS: l’idée de base vient de ici . Merci foxidrive. Je le savais, je le savais de StackOverflow mais j’ai eu du mal à le retrouver)

1
Stephan

J'arrive très tard, mais de mon ancienne mémoire de fichiers de commandes DOS, vous pouvez continuer à ajouter un caractère à la chaîne à chaque boucle, puis rechercher une chaîne contenant autant de caractères de ce caractère. pour 250 itérations, vous avez soit une très longue chaîne "cycles", soit une boucle interne utilisant un ensemble de variables comptant jusqu'à 10, puis une autre boucle externe utilisant un autre ensemble de variables comptant jusqu'à 25.

Voici la boucle de base à 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
0
GadgetGuy