wake-up-neo.net

Wie kann man Variablen unter DOS erhöhen?

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?

33
shadowz1337

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. 

58
Furr

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

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
3
jeb

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
2
Niente0

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.

1
shadowz1337

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
1
Inatna

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

1
Stephan

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
0
GadgetGuy