BATCH/CMD Variable z1-z100 mit echo ausgeben?
Hallo, ich bekomms nicht auf die Reihe mit einer Schleife die Variablen z1 bis zXXX anzuzeigen?
Also ich möchte nur über eine Schleife eine Reihe von Vairbalen ausgeben lassen.
Kann mir jemand helfen? Danke
LG
2 Antworten
Zunächst mal kurz die Antwort auf deine Frage: >>DelayedExpansions<< ;P
mithilfe von
setlocal enableDelayedExpansion
kannst du Variablen auch mit !var! verzögert auslesen:
@echo off & setlocal enableDelayedExpansion
set "var[0]=test"
set "index=0"
echo !var[%index%]!
:: alternativ ::
call echo %%var[%index%]%%
pause>nul
Jetzt noch kurz zur for-Schleife, mit der du leicht über dein Array iterieren kannst:
:: folgende Zeile ersetzt deinen ganzen vorherigen Code ::
for /L %%i in (0,1,100) do set z%%i=!random!
Hier also ein komplettes Beispiel zum setzten und auslesen deines Arrays: (sinnvoll ist es auch noch, wenn du dir die Länge des Arrays in einer Variablen speicherst)
setlocal enableDelayedExpansion
for /L %%i in (0,1,100) do set z%%i=!random!
for /L %%i in (0,1,100) do echo !z%%i!
pause
(Die delayedExpansion bei random brauchst du, da random sonst direkt durch einen Wert ersetzt wird und nicht bei jedem Schleifendurchlauf neu)
~Tim
Da du anscheinend einen Sortieralgorithmus programmieren willst, dacht ich mir ich probier des auch mal eben aus:
@echo off & setlocal enableDelayedExpansion & title BUBBLESORT & goto main
:: BUBBLESORT [by Tim Greller]
:bubblesort Array<Number>
set /a "%~1.length_m_1=!%~1.length!-1"
for /L %%C in (0,1,!%~1.length!) do (
for /L %%i in (0,1,!%~1.length_m_1!) do (
call :_bubblesort %1 %%i
)
)
exit /B
:_bubblesort
set /a "i_p_1=%2+1"
if !%~1[%2]! GTR !%~1[%i_p_1%]! (
set "temp=!%~1[%2]!"
set "%~1[%2]=!%~1[%i_p_1%]!"
set "%~1[%i_p_1%]=!temp!"
)
exit /B
:print Array<>
for /L %%i in (0 1 !%~1.length!) do echo:%~1[%%i] = !%~1[%%i]!
exit /B
:main
set "list.length=8"
for /L %%i in (0 1 %list.length%) do set "list[%%i]=!random:~0,2!"
call:print list
echo:__________
echo:
echo:SORTING...
echo:__________
call:bubblesort list
call:print list
pause:nul
exit
leider muss man die zweite for-schleife auslagern, da man in Batch nicht direkt rechnen kann und deswegen %%i+1 als neue Variable definieren muss (diese müsste man in der for-Schleife verzögert auslesen, wodurch sich der Array-Inhalt nicht mehr auslesen lassen könnte).
Beschreib mal ganz genau was du ausführen willst, mit mehr Infos könnte man dehn Code ändern aber das deine Batch Datei immer noch deine Bedingung erfüllt wird
Folgendes:
Ich habe mit einer Schleife die Variable z1 bis z100 gesetzt.
Also:
set z1=%random%
set z2=%random%
...
set z100=%random%
Das Ganze in einer Schleife dass ich nicht jede Variable selbst sezen muss:
set c=0
:a
set c=%c%+1
set z%c%=%random%
if "%c%"=="100" goto next
goto a
Ich hoffe das hast du verstanden...
Jetzt möchte ich den ganzen Kram von den Einzelnen Variablen wieder ausgeben lassen:
echo %z1%
echo %z2%
allerdings "echo %z%c%%" funktioniert nicht und da ist auch das Problem: Wie bekomme ich per Schleife die Ganzen Variablen wieder ausgegeben????
Ich hoffe das jetzt nicht von dir kommt "da kann ich dir nicht weiterhelfen"...
Aber danke für deine Antwort wäre nice wenn du ne lösung hättest :D
Ich mach zwar f´nur C++ und kein CMD aber um die zahlen zu erhöhen würde ich das Vermuten
SET VARIABLE=1
:B
echo %VARIABLE%
SET /A VARIABLE=VARIABLE+1
echo %VARIABLE%
goto B
rly? Hast du überhaupt meine Frage verstanden?
Also nochmal: Ich bin dabei einen Algorithmus zu schreiben, der mir beliebige Viele Zahlen nach der Größe Sortiert. Dabei schaut das Script sich die einzelnen Zahlen an und vergleicht sie mit der nächsten Zahl. Wenn die erste Zahl größer ist als die 2. Werden die 2 Zahlen vertauscht usw.... so läuft das 20x durch eine Schleife und zum Schluss sind die Zahlen nach Größe sortiert.
Problem ist jetzt das ich innerhalb einer schleife mit *einem Befehl (ein Echo)* alle Zahlen ausgeben.
Die Zahlen sind in z(Nummer) gespeichert. Z.B.
- Zahl1 hat die Variable z1
- Zahl100 hat die Variable z100
- usw die Variablen wurden durch Folgende Schleife generiert:
set c=0
:rndgen
set randm=%random% %%9
set /a z%c%=%randm%+1
set /a c=%c%+1
if "%c%"=="%count%" set c=0 && goto calc
goto rndgen
Wie Verarbeite ich diese Variablen weiter? <- Das ist die Frage
if "%z%c%%"=="..." goto ... ->Fu- Das ist die Fragenktioniert nicht
echo %z%c%% ->geht auch nicht
Also sozusagen habe ich das Problem das ich keine Variable in einer Variable einfügen kann.
Wie man in Batch Rechnet weiß ich selbst... ;)
sorry das ich nicht helfen konnte, wenn es C++ wär hätte ich dir helfen können :/
Hey Herzliches Danke für diese geile Antwort. Hab die ganze Zeit gewartet das mir mal wieder der gute alte Timlg den Hintern rettet!
hab mit bereits gedacht das das mit
gehen muss, hab aber nie damit Programmiert und habe auch keine Ahnung davon. Danke auch für das Script was du direkt geschrieben hast ist echt nett dass du dir so ne mühe machst xP
Danke, hast nen Stern!