Ich habe die letzten 3 Stunden damit verbracht, das herauszufinden, konnte aber keine Lösung finden. Hier ist mein Batch-Skript:
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
Sie führt die Datei "warmboot.com" (die meinen PC neu startet) und 250 Zyklen lang aus. Sobald die Zyklen 250 Mal gelaufen sind (d. H. Wenn der Zähler den Zyklen entspricht), stoppt er.
Unter Windows funktioniert das. Dies funktioniert jedoch nicht in einer DOS-Umgebung. Ich habe Versionen von v4 bis v6.22 und sogar v7 ausprobiert und alle versagen, wenn sie die "PROBLEM" -Zeile erreichen.
Wenn ich das mache:
set /A COUNTER=%COUNTER%+1
echo %Counter%
Oder dieses:
set /A COUNTER+=1
echo %Counter%
beide geben eine leere Zeile zurück, d. h. sie zeigen nichts als Ausgabe an.
Wenn ich tippe:
set /?
dann zeigt es das:
Zeigt, setzt oder entfernt cmd.exe-Umgebungsvariablen.
SET [Variable = [Zeichenfolge]]
variable Gibt den Namen der Umgebungsvariablen an.
Zeichenfolge Gibt eine Reihe von Zeichen an, die der Variablen zugewiesen werden sollen.
wenn Sie jedoch unter CMD denselben Befehl in Windows eingeben, wird noch viel mehr angezeigt. Ich denke, dass die SET-Funktion unter DOS keine arithmetischen Funktionen unterstützt, aber für Arbeitszwecke muss ich meine Skripts nur unter DOS ausführen.
Irgendwelche Ideen?
Ich weiß, dass Sie eine andere Antwort gefunden haben - aber Tatsache ist, dass Ihr ursprünglicher Code fast korrekt war, außer für einen Syntaxfehler.
Ihr Code enthielt die Zeile
set /A COUNTER=%COUNTER%+1
und die Syntax, die funktionieren würde, ist einfach ...
set /A COUNTER=COUNTER+1
Siehe http://ss64.com/nt/set.html für alle Details zum SET-Befehl. Ich dachte nur, ich würde diese Klarstellung für alle anderen hinzufügen, die keine Option für FreeDOS haben.
Tatsächlich hat set
in DOS keine Option, Arithmetik zuzulassen. Sie könnten jedoch eine riesige Nachschlagetabelle erstellen:
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
Ein bisschen zu spät für die Party, aber es ist eine interessante Frage.
Sie können Ihre eigene inc.bat schreiben, um eine Nummer zu erhöhen.
Er kann Zahlen von 0 bis 9998 erhöhen.
@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%
Ein Beispiel für die Verwendung ist hier
@echo off
set counter0=0
set counter1=
set counter2=
set counter3=
:loop
call inc.bat
echo %count%
if not %count%==250 goto :loop
Direkt von der Kommandozeile:
for /L %n in (1,1,100) do @echo %n
Verwenden einer Batchdatei:
@echo off
for /L %%n in (1,1,100) do echo %%n
Zeigt:
1
2
3
...
100
Ich habe meine eigene Lösung gefunden.
Laden Sie FreeDOS hier herunter: http://chtaube.eu/computers/freedos/bootable-usb/
Wenn ich dann meine Counter.exe-Datei verwende (die im Grunde eine Counter.txt-Datei erzeugt und die Nummer bei jedem Aufruf erhöht), kann ich den Wert der Nummer einer Variablen zuweisen:
Set /P Variable =< Counter.txt
Dann kann ich überprüfen, ob 250 Zyklen gelaufen sind.
if %variable%==250 echo PASS
Übrigens, ich kann Set/A immer noch nicht verwenden, da FreeDOS diesen Befehl nicht unterstützt, aber zumindest den Befehl Set/P unterstützt.
Ich habe meine Antwort dank früherer Mitwirkenden aufgebaut.
Da ich keine Zeit für eine benutzerdefinierte counter.exe hatte, lud ich sed für FREEDOS herunter.
Und dann könnte der Batch-Code lauten, indem er "wc -l" mit dem Dienstprogramm sed emuliert, so etwas entsprechend Ihrer Schleife (ich verwende es nur, um die Ausführung von "1" bis n + 1 zu erhöhen):
Denken Sie daran, manuell eine Datei "test.txt" mit der ersten Zeile zu erstellen
sed -n '$=' test.txt > counter.txt
set /P Var=< counter.txt
echo 0 >> test.txt
Ich habe DOS nicht verwendet - puh - fühlt sich nach Jahrzehnten an, aber basierend auf einer alten Antwort und meinen Erinnerungen sollte Folgendes funktionieren (obwohl ich kein Feedback erhalten habe, wurde die Antwort akzeptiert, also scheint es zu funktionieren) :
@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.
In DOS gibt es weder set /a
noch set /p
, also müssen wir das umgehen Ich denke, dass for %%i in (%variable%) do set numb=%%i
und set numb2=%variable%
funktionieren werden, aber ich kann das nicht überprüfen.
WARNUNG: Da es in DOS keinen Vergleich ">" oder "<" gibt, sollten Sie die Batchdatei unter dem Label :finished
löschen (da sie weiterhin inkrementiert und 251 nicht mehr gleich 250 ist).
(PS: Die Grundidee ist von hier . Danke an foxidrive. Ich wusste, ich wusste es von StackOverflow, hatte aber Schwierigkeiten es wieder zu finden.)
Einfache Lösung mit set /a
@CLS
@break on
@echo off
@Echo Begin PING/TraceRT Test - Version 1.0 8/16/2019
@Echo.
@echo.
@Echo If %%1=-1, then unlimited runs, otherwise run only '%1' times and end.
@Echo If unlimited, use ctrl-break/Ctrl-C to stop
@echo.
@echo.
if "%1"=="" goto end
set /A COUNTER=0
set /a START=COUNTER+1
ECHO The total Runs so far is : "- %START% -"
@Echo Logging Started >> ping-cap.txt
:Loop-Unlimited
IF "%COUNTER%"=="%1" GOTO END
set /A COUNTER=COUNTER+1
@time /T >> ping-cap.txt
@date /T >> ping-cap.txt
@ping charter.com >> ping-cap.txt
@tracert charter.com >> ping-cap.txt
@echo Loop Count is: %COUNTER% >> ping-cap.txt
ECHO The total Runs so far is : "- %COUNTER% -"
GOTO Loop-Unlimited
goto end
:end
echo ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Ending test ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
Ich komme sehr spät zur Party, aber aus meiner alten Erinnerung an DOS-Batchdateien können Sie der Schleife immer einen Buchstaben hinzufügen und dann nach einer Zeichenfolge dieser vielen Zeichen suchen. Bei 250 Iterationen haben Sie entweder eine sehr lange Zeichenfolge "Zyklen", oder Sie haben eine Schleife innerhalb einer Gruppe von Variablen, die bis 10 zählt, und eine andere Schleife außerhalb, die eine andere Menge von Variablenzählung bis 25 verwendet.
Hier ist die grundlegende Schleife bis 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