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?
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.
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
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
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
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.
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
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)
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