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-Key: 204947

Url: https://administrator.de/contentid/204947

Printed on: April 25, 2024 at 10:04 o'clock

Member: colinardo
colinardo Apr 14, 2013 updated at 08:25:01 (UTC)
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
Member: bastla
bastla Apr 14, 2013 updated at 14:54:30 (UTC)
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]
Member: Apop85
Apop85 Apr 14, 2013 updated at 10:39:39 (UTC)
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
Member: rubberman
rubberman Apr 14, 2013 at 10:50:03 (UTC)
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
Member: Apop85
Apop85 Apr 14, 2013 at 10:57:40 (UTC)
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
Member: Apop85
Apop85 Apr 14, 2013 updated at 11:38:56 (UTC)
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 ^^
Member: rubberman
rubberman Apr 14, 2013 at 11:54:52 (UTC)
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
Member: bastla
bastla Apr 14, 2013 at 12:02:48 (UTC)
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
Member: Apop85
Apop85 Apr 14, 2013, updated at Apr 15, 2013 at 20:02:13 (UTC)
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
Member: bastla
bastla Apr 14, 2013 updated at 14:55:36 (UTC)
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
Member: Apop85
Apop85 Apr 14, 2013 updated at 21:48:56 (UTC)
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
Member: bastla
bastla Apr 15, 2013 at 12:45:18 (UTC)
Goto Top
Hallo Apop85!

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

Grüße
bastla
Member: Apop85
Apop85 Apr 15, 2013 at 20:00:04 (UTC)
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