Batch: Array-Wert in einer Schleife ausgeben - Wie?


10.09.2020, 01:49

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

Vom Fragesteller als hilfreich ausgezeichnet

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%"
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
MrAmazing2 
Fragesteller
 10.09.2020, 15:02

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.

0
Erzesel  10.09.2020, 19:00
@MrAmazing2
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
1
@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
MrAmazing2 
Fragesteller
 10.09.2020, 01:49

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)

0
RakonDark  10.09.2020, 02:01
@MrAmazing2

was ist den bei dir da Richtig bei echo !rand! , bei mir kommt da ein randomwert und dahinter %3

0
MrAmazing2 
Fragesteller
 10.09.2020, 02:02
@RakonDark

Mach Echo Off, und gib dir die Zahl per echo !rand! aus.

Ein Wert zwischen 0 und 2 kommt raus.

0
MrAmazing2 
Fragesteller
 10.09.2020, 02:08
@MrAmazing2

Bzw. per

call echo %%rand%%

wenn du enabledelayedexpansion nicht machen willst. Kommt ja aufs selbe hinaus wie

!rand!
0
MrAmazing2 
Fragesteller
 10.09.2020, 01:59

Bei deinem Lösungsvorschlag wird einfach 4 mal

rand]

ausgegeben.

0