apop85
Goto Top

Variabelinhalt wiederum als Variabel verwenden.

Versuche gerade einen kleinen Batch zu Scripten welche eine Eingabe mit einem bestimmten Muster Codiert. Nun möchte ich nur ungern für jede Variable eine eigene überprüfung durchzuführen.

Ich versuch grad ein Script zu erstellen welches Eingaben nach einem Bestimmten Muster Codiert. Nun möchte ich nicht unbedingt, dass ich jede Variable einzeln Prüfen muss sonder würde gerne eine Variabel in einer Variabel verwenden.

rem zuerst
if %counter% LSS 8 set bs=%%%var%%counter%%% else set bs=%var%%pwcounter%
rem danach
if %bs% == 1 set bs=z 

Nur schaff ichs irgendwie nicht dass er die ausgabe als Variabel versteht und nicht als Textausgabe.

Im obigen Beispiel erhalte ich dann die Ausgabe < bs=%b1% > also die ausgabe mit den % funktioniert aber bei der Prüfung (Zeile 4) überprüft er dann auch genau dies < if %b1% = 1 set bs=z > und das kann er natürlich nicht interpretieren und endet in einem Syntaxfehler.

Wäre froh wenn mir da jemand helfen könnte.

Gruss

Apop

Content-ID: 204947

Url: https://administrator.de/forum/variabelinhalt-wiederum-als-variabel-verwenden-204947.html

Ausgedruckt am: 25.12.2024 um 14:12 Uhr

colinardo
colinardo 14.04.2013 aktualisiert um 10:25:01 Uhr
Goto Top
Hi Apop,
dazu benutze die doppelte Expansion der Shell (http://stackoverflow.com/questions/1199931/how-expand-a-cmd-shell-varia ..)

schreibe dazu Zeile 02 so:
if %counter% LSS 8 set bs=!%var%%counter%! else set bs=%var%%pwcounter%
und in in den Kopf deines Scripts muss noch ein:
setlocal ENABLEDELAYEDEXPANSION

Grüße Uwe
bastla
bastla 14.04.2013 aktualisiert um 16:54:30 Uhr
Goto Top
Hallo Apop85 und colinardo!

Das würde besser etwa so
if %counter% LSS 8 (set bs=!%var%%counter%!) else (set bs=!%var%%pwcounter%!)
aussehen, "delayedExpansion" lässt sich aber auch vermeiden:
if %counter% LSS 8 (call set "bs=%%%var%%counter%%%") else (call set "bs=%%%var%%pwcounter%%%")
Grüße
bastla

[Edit] Anpassung, damit %var% (und nicht "var") als Betandteil des Variablennamens verwendet wird [/Edit]
Apop85
Apop85 14.04.2013 aktualisiert um 12:39:39 Uhr
Goto Top
Cool Danke viel mals. Bevor ich jetzt noch einen Thread öffne wegen meinem Cryp-Script wollte ich noch was Fragen...

Dieses Argument: %variable:~0,1% wie ist hier was Definiert. Ich versuche eine 8-Stellige Eingabe in ihre Einzelteile zu zerlegen jedoch bring ich es einfach nicht fertig.... jedes mal wenn ich denke AHAAAA jetzt weis ich wie dieses Argument sich verhält knallt es mir wieder die Latte vor den Kopf... face-sad

set "b1=%name:~0,1%" & set "p1=%pass:~0,1%"  
set "b2=%name:~1,1%" & set "p2=%pass:~1,1%"  
set "b3=%name:~2,2%" & set "p3=%pass:~1,2%"  
set "b4=%name:~2,2%" & set "p4=%pass:~2,2%"  
set "b5=%name:~2,3%" & set "p5=%pass:~2,3%"  
set "b6=%name:~3,3%" & set "p6=%pass:~3,3%"  
set "b7=%name:~6,6%" & set "p7=%pass:~6,6%"  
set "b8=%name:~7,8%" & set "p8=%pass:~7,8%"  

Wer dieses Argument kennt, weiss wohl dass bei obiger Schreibweise nach der Eingabe 12345678 nicht 1, 2, 3, 4, 5, 6, 7, 8 raus kommt...
Im Moment Spuckt er folgendes aus:
%name% : 1, 2, 34, 34, 345, 456, 78, 8
%pass% : 1, 2, 23, 34, 345, 456, 78, 8
aber wie schaff ich das? bzw. Wie definiert sich dieses Argument?

grüsse Apop
rubberman
rubberman 14.04.2013 um 12:50:03 Uhr
Goto Top
Hallo Apop85,

die Erklärung findest du in der Hilfe zu SET.
Was du vermutlich tun möchtest:
%variable:~0,1% nach dem 0. Zeichen (also dem Anfang) 1 Zeichen extrahieren.
%variable:~1,1% nach dem 1. Zeichen 1 Zeichen extrahieren.
%variable:~2,1% nach dem 2. Zeichen 1 Zeichen extrahieren.
etc.

Grüße
rubberman
Apop85
Apop85 14.04.2013 um 12:57:40 Uhr
Goto Top
AAAHHHHHHHHHHHH!!!!! Endlich!!
Jetzt ist alles Klar... Klar kam nie das raus was ich wollte XD
ich habs bisher immer als x zeichen weglassen und stelle y zeigen interpretiert o.ä. XD

Danke Danke Danke und Danke auf Knien XD

Lg

Apop
Apop85
Apop85 14.04.2013 aktualisiert um 13:38:56 Uhr
Goto Top
Habs jetzt versucht einzubauen aber es will noch nicht recht.

if %counter% LSS 8 ( set "var=b" ) else ( set "var=p" )  
if %counter% LSS 8 ( set /a counter=%counter%+1 ) else ( set /a pwcounter=%pwcounter%+1 )
if %pwcounter% == 8 goto END
if %counter% LSS 8 (set bs=!var%counter%!) else (set bs=!var%pwcounter%!)

echo %counter%-%pwcounter% - %bs%
echo -%b1%-%b2%-%b3%-%b4%-%b5%-%b6%-%b7%-%b8%-
echo -%p1%-%p2%-%p3%-%p4%-%p5%-%p6%-%p7%-%p8%-

if "%bs%" == / set "bs=z" & goto CRYPT1  
if "%bs%" == "0" set "bs=r" & goto CRYPT1  
if "%bs%" == "9" set "bs=m" & goto CRYPT1  
...

Als ausgabe für %bs% erhalte ich aber jedesmal NUL, heisst das echo zeigt bei der Variable nichts an... Demnach ändert er auch keine Buchstaben so wie in den letzten Zeilen gedacht...

setlocal ENABLEDELAYEDEXPANSION habe ich auch gesetzt. Habe auch die Variante probiert von @bastla ohne setlocal ENAB... kam aber das selbe dabei raus...

Grüsse

P.S.
@rubberman
Endlich klappt das so wie ich will ^^
rubberman
rubberman 14.04.2013 um 13:54:52 Uhr
Goto Top
Hallo Apop85,

kannst du das mal im ganzen Batch posten. Ich weiß nicht mal welchen Wert du in welcher Variablen erwartest.
In Zeile 10 fehlen die Anführungszeichen um den Slash. Das kann's aber kaum gewesen sein ...

Grüße
rubberman
bastla
bastla 14.04.2013 um 14:02:48 Uhr
Goto Top
Hallo Apop85!
Als ausgabe für %bs% erhalte ich aber jedesmal NUL, heisst das echo zeigt bei der Variable nichts an...
Dann ist der gezeigte Code-Teil vermutlich selbst auch noch innerhalb einer "geklammerten" Struktur - falls ja (und da Du bereits "delayedExpansion" aktiviert hast), könntest Du anstelle von %bs% einfach !bs! verwenden ...

Grüße
bastla
Apop85
Apop85 14.04.2013, aktualisiert am 15.04.2013 um 22:02:13 Uhr
Goto Top
Hier der Code:
rem Passwortverschlüsselung
:START

@echo off
setlocal ENABLEDELAYEDEXPANSION
cls
echo.
echo.
echo.
echo.
echo.
echo   Bitte gib den Benutzernamen an (Max. 8 Zeichen)
set /p name=
echo.
echo   Bitte gib das gewünschte Passwort an.
set /p pass=

set globalcount=0
goto REORG

:REORG
set counter=0
set pwcounter=0
if %globalcount% == 20 goto END
set /a globalcount=%globalcount%+1
rem Benutzername und Passwort in Einzelteile zerlegen
set "b1=%name:~0,1%" & set "p1=%pass:~0,1%"  
set "b2=%name:~1,1%" & set "p2=%pass:~1,1%"  
set "b3=%name:~2,1%" & set "p3=%pass:~2,1%"  
set "b4=%name:~3,1%" & set "p4=%pass:~3,1%"  
set "b5=%name:~4,1%" & set "p5=%pass:~4,1%"  
set "b6=%name:~5,1%" & set "p6=%pass:~5,1%"  
set "b7=%name:~6,1%" & set "p7=%pass:~6,1%"  
set "b8=%name:~7,1%" & set "p8=%pass:~7,1%"  

rem NUL eingaben entfernen
if "%b1%" == "" set "b1=/"  
if "%b2%" == "" set "b2=/"  
if "%b3%" == "" set "b3=/"  
if "%b4%" == "" set "b4=/"  
if "%b5%" == "" set "b5=/"  
if "%b6%" == "" set "b6=/"  
if "%b7%" == "" set "b7=/"  
if "%b8%" == "" set "b8=/"  
if "%p1%" == "" set "p1=/"  
if "%p2%" == "" set "p2=/"  
if "%p3%" == "" set "p3=/"  
if "%p4%" == "" set "p4=/"  
if "%p5%" == "" set "p5=/"  
if "%p6%" == "" set "p6=/"  
if "%p7%" == "" set "p7=/"  
if "%p8%" == "" set "p8=/"  

rem Benutzername und Passwort neu zusammensetzen und nochmals mischen
set "name=%p7%%b4%%p2%%b8%%b6%%p1%%p8%%b1%"  
set "pass=%p6%%b5%%p4%%p3%%b7%%b2%%b2%%p5%"  

set "b2=%name:~0,1%" & set "p3=%pass:~0,1%"  
set "b5=%name:~1,1%" & set "p6=%pass:~1,1%"  
set "b7=%name:~2,1%" & set "p8=%pass:~2,1%"  
set "b1=%name:~3,1%" & set "p7=%pass:~3,1%"  
set "b8=%name:~4,1%" & set "p1=%pass:~4,1%"  
set "b6=%name:~5,1%" & set "p4=%pass:~5,1%"  
set "b4=%name:~6,1%" & set "p5=%pass:~6,1%"  
set "b3=%name:~7,1%" & set "p2=%pass:~7,1%"  

goto CRYPT1

:CRYPT1
rem Das eingewntliche Crypten beginnt (ohne Umlaute oder Spezialzeichen)
set "name=%b1%%b2%%b3%%b4%%b5%%b6%%b7%%b8%"  
set "pass=%p1%%p2%%p3%%p4%%p5%%p6%%p7%%p8%"  
if %counter% LSS 8 ( set "var=b" ) else ( set "var=p" )  
if %counter% LSS 8 ( set /a counter=%counter%+1 ) else ( set /a pwcounter=%pwcounter%+1 )
if %pwcounter% == 8 goto REORG
if %counter% LSS 8 (set bs=!var%counter%!) else (set bs=!var%pwcounter%!)
cls
echo %counter%-%pwcounter% - %globalcount% - %bs%
echo -%b1%-%b2%-%b3%-%b4%-%b5%-%b6%-%b7%-%b8%-
echo -%p1%-%p2%-%p3%-%p4%-%p5%-%p6%-%p7%-%p8%-

if "%bs%" == "/" set "bs=z" & goto CRYPT1  
if "%bs%" == "0" set "bs=r" & goto CRYPT1  
if "%bs%" == "9" set "bs=m" & goto CRYPT1  
if "%bs%" == "8" set "bs=g" & goto CRYPT1  
if "%bs%" == "7" set "bs=f" & goto CRYPT1  
if "%bs%" == "6" set "bs=w" & goto CRYPT1  
usw...
if "%bs%" == "d" set "bs=t" & goto CRYPT1  
if "%bs%" == "c" set "bs=2" & goto CRYPT1  
if "%bs%" == "b" set "bs=v" & goto CRYPT1  
if "%bs%" == "a" set "bs=q" & goto CRYPT1  

goto CRYPT1

:END
set "name=%p7%%b4%%p2%%b8%%b6%%p1%%p8%%b1%"  
set "pass=%p6%%b5%%p4%%p3%%b7%%b2%%b2%%p5%"  
echo.
echo.
echo.
echo.
echo Codiert sieht dies denn so aus:
echo.
echo %name%%pass%
echo.
if "%name%%pass%" == "fwnqtanftamqwaam" ( echo SUPER ) else ( echo OOOOOH )  
pause
goto START
bastla
bastla 14.04.2013 aktualisiert um 16:55:36 Uhr
Goto Top
Hallo Apop85!

Da Du ja auch %var% noch variabel benötigst, muss die entsprechende Zeile natürlich
if %counter% LSS 8 (set bs=!%var%%counter%!) else (set bs=!%var%%pwcounter%!)
lauten.
Du kannst übrigens
set /a counter=%counter%+1
so kürzer schreiben:
set /a counter+=1
Grüße
bastla
Apop85
Apop85 14.04.2013 aktualisiert um 23:48:56 Uhr
Goto Top
So weit so gut...
nun habe ich nur noch folgendes Problem
set !%bs%!=%bs1%
Dies wollte ich oben bei Zeile 70 einbauen...

wobei %bs1% bei der Buchstabenabfrage erzeugt wird. Nun möchte ich ja dass %bs% (z.B. "b1") ein neuer Buchstabe zugewiesen wird z.B. a.

set !%bs%!=%bs1%
 --> set b1=a

Da happerts noch. Nachher müssten alle Elemente Funktionieren.

Gruss
bastla
bastla 15.04.2013 um 14:45:18 Uhr
Goto Top
Hallo Apop85!

Du musst Dich zwischen !bs! und %bs% entscheiden ...

Grüße
bastla
Apop85
Apop85 15.04.2013 um 22:00:04 Uhr
Goto Top
Hab den Fehler gefunden face-smile
damit wird obiges ausgeführt.
if "!bs!" NEQ "" set !bs!=!bs1!  
Du musst Dich zwischen !bs! und %bs% entscheiden ...
Um die Buchstaben zu übernehmen durfte ich mich nicht entscheiden face-smile
if "!%bs%!" == "9" set "bs1=m" & goto CRYPT1  

Werde das Komplette Script noch in den Wissensbereich stellen
(Sobald ich mich mal bei delayedexpensions dreingelesen hab)

Werde die Frage nun schliessen.


Vielen dank für eure Hilfe

Grüsse

Apop