Batch: Array-Wert in einer Schleife ausgeben - Wie?
@ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
set chars[0]=a
set chars[1]=b
set chars[2]=c
FOR /L %%i IN (0,1,7) DO (
set /a rand=!RANDOM! %%3
echo !rand! //Funktioniert
set x=%chars[!rand!]% //Hier liegt das Problem. Wieee??
echo !x!
)
Es geht um die Zeile
set x=%chars[!rand!]%
wie bekomme ich den Wert von chars an der Stelle rand??
Versuche seit ner halben Stunde alle möglichen Kombinationen..
Mein Ziel ist es, 8 zufällige Buchstaben in eine Variable zu schreiben. z.B. acaabcab. Habe den Teil mit der Variable hier rausgekürzt um es übersichtlich zu halten. Kernproblem ist, überhaupt erstmal einen zufälligen Buchstaben in einer Schleife zu bekommen. Bitte behaltet die Schleife, das rand und das 'array' bei.
2 Antworten
so wie du es machst kann es nicht gehen...
% werden vor ! aufgelöst, somit ist !rand! noch nicht aufgelöst wenn %chars[nummer]% benötigt wird...
die schnellste variante ist, !rand! in eine Laufvariable umzuwandeln...
@echo off
setlocal enableDelayedExpansion
set "chars[0]=a"
set "chars[1]=b"
set "chars[2]=c"
for /l %%i in (0,1,7) do (
set /a "rand=!RANDOM! %%3"
rem einer Laufvariable zuweisen
for %%a in (!rand!) do (
set "x=!chars[%%a]!"
)
echo !x!
set "string=!string!!x!"
)
echo %string%
pause
...oder indem mit call set die Auflösung in eine Neue Instanz von cmd verschoben wird (also nach !rand!)
@echo off
setlocal enableDelayedExpansion
set chars[0]=a
set chars[1]=b
set chars[2]=c
FOR /L %%i IN (0,1,7) DO (
set /a rand=!RANDOM! %%3
call set x=%%chars[!rand!]%%
echo !x!
)
pause
...oder auslagern der verarbeitung in eine Subroutine...
@echo off
setlocal enableDelayedExpansion
set chars[0]=a
set chars[1]=b
set chars[2]=c
FOR /L %%i IN (0,1,7) DO (
call :calc
)
echo %string%
pause
exit /b
:calc
set /a "rand=%RANDOM% %%3"
set "x=!chars[%rand%]!"
echo %x%
set "string=%string%%x%"
Wie macht man es bei 3 Abstraktionsebenen? ... chars[number[rand]] ?
genau wie mit 2, man braucht nur 2...
Einen VariablenNamen in Batch musst Du erstmal als ganz normalen String ansehen:
- Basisname+kein oder irgendein Trennzeichen+DimmensionsArugument+kein oder irgendein Trennzeichen...usw ( myVar.2[3]_6{99abc} ...pupsegal🤗 )
nun musst du nur den passenden String zusammenpfriemeln um die Variable aufrufen zu können.
@echo off
setlocal enableDelayedExpansion
set "chars.1[0]=a"
set "chars.1[1]=b"
set "chars.1[2]=c"
set "chars.2[0]=d"
set "chars.2[1]=e"
set "chars.2[2]=f"
for /l %%i in (0,1,20) do (
set /a "rand=!RANDOM! %% 3"
set /a "rand2=!RANDOM! %% 2 + 1"
for /f "tokens=1,2" %%a in ("!rand! !rand2!" ) do (
set "x=!chars.%%b[%%a]!"
)
echo !x!
set "string=!string!!x!"
)
echo %string%
echo:
echo demo2:
for %%a in (2 1) do (
for /l %%d in (0,1,2) do (
echo !chars.%%a[%%d]!
)
)
pause
natürlich kann man Ausrufezeichen auch maskieren und kann damit wunderbar macros bauen...
@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
set "pointer[0]=A"
set "pointer[1]=B"
set "pointer[2]=C"
set "varA=blubb_a"
set "varB=blubb_b"
set "varC=blubb_c"
for /l %%i in (0,1,20) do (
set /a "rand=!RANDOM! %% 3"
for %%a in (!rand! ) do (
set "x=^!var!pointer[%%a]!^!"
)
set "macro_string=!macro_string!!x! "
)
echo so sieht unser String jetzt aus: (guckmal da sind lauter Variablen Drinne...;))
set macro_string
echo:
echo und so sieht es aus, wenn er voll aufgelöst wird
echo %macro_string%
pause
...brennt schon die Birne?...🤣
...jetzt kommen echte Macros:
@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
rem als estes wird der else-Zweig aufgelöst beim aufruf des Macros folgen die Argumente dem set argv=
rem im zweiten Schritt wird argv aufgelöst
set #__macrodemo=for %%. in (1 2) do^
if %%.==2 (^
for %%a in (^^!argv^^!) do (^
echo argument=%%a^&^
echo hallo %%a blubb^
)^
) else set argv=
::end _macrodemo
rem entfernt überflüssige Leerzeichen aus einem Macrostring (mit vordicht zu geniesen)
set #__condensSpaces=for %%. in (1 2) do^
if %%.==2 (^
for %%a in (^^!argv^^!) do (^
for /l %%i in (1,1,14) do set "%%a=^!%%a: = ^!"^
)^
) else set argv=
::end #__condensSpaces
echo macro mit durch die hübschen Einrückungen im Quellcode entstandenen Spaces...
set #__
echo:
echo entferne mehrfache Spaces aus den Variablen #__condensSpaces und #__macrodemo...
%#__condensSpaces% #__condensSpaces #__macrodemo
set #__
echo.
echo ... zeige wie das Macro #__macrodemo aufgelöst mit übergebnen Argumenten aussieht...
echo %#__macrodemo% "blub" "flapp" schmuh "x,x," "test space"
echo:
echo ...und das komt dabei heraus , wenn man das Macro #__macrodemo ausführt...
%#__macrodemo% "blub" "flapp" schmuh "x,x," "test space"
pause
hat nicht mehr in einen Kommentar gepasst...
kleine Spielerei , Steuerung WSAD:
Das ist BatchMacro auf die Spitze getrieben 😏
@echo off
set fruits[0]=Apple
set fruits[1]=Apricot
set fruits[2]=Asparagus
set fruits[3]=Aubergine
set fruits[4]=Banana
FOR /L %%i IN (0 1 4) DO (
call echo Element At %%i = %%fruits[%%i]%%
)
pause
Bei deinem Lösungsvorschlag wird einfach 4 mal
rand]
ausgegeben.
Mit %%i krieg ichs auch hin, ich brauchs mit rand. Eine Zufallszahl die bei jedem Schleifendurchlauf anders ist.
(Bzw. mit einer Variable die man nur mit !Var! und nicht mit %var% auslesen kann, das sollte ja aufs selbe hinauskommen)
was ist den bei dir da Richtig bei echo !rand! , bei mir kommt da ein randomwert und dahinter %3
Mach Echo Off, und gib dir die Zahl per echo !rand! aus.
Ein Wert zwischen 0 und 2 kommt raus.
Bzw. per
call echo %%rand%%
wenn du enabledelayedexpansion nicht machen willst. Kommt ja aufs selbe hinaus wie
!rand!
Funkt super, vielen dank.
Hatte es schon mit
!chars[!rand!]! probiert, weil das ja quasi genau das ist was ich brauche, aber ich denke mal das ging nicht weil Batch nicht weiß welche ! zusammengehören, richtig?
Und mit call set %%..!..!..%% weiß Batch halt, im Gegensatz zu !..!..!..! die Reihenfolge und was zusammengehört, richtig?
Wie macht man es bei 3 Abstraktionsebenen? Also z.B. bei
chars[number[rand]] ?
Oder bei 4?
Bin ich dann gezwungen mehrere deiner Methoden zu kombinieren, oder gibts da ne bevorzugte Lösung?
Und online hab ich auch ne lösung mit
string:~%x%
oder so gefunden, wie nennt man das? Würds gern googlen aber kenn den ausdruck dafür nicht.