forgottenrealm
Goto Top

Variable aus String wird nicht aufgelöst - Batch

Hallo

Ich stehe wieder einmal vor einem Problem, welches ich auch nach längerer Zeit nicht lösen konnte.


Hiermit wird eine csv Datei ausgelesen, wobei die erste Zeile (überschriften, beschreibungen) übersprungen wird.

[...]

:: Auslesen der Quell- und Zieldaten aus Datenbank
for /F "skip=1 delims=" %%I IN (%INDEX%) DO set "LINE=%%I" & Call :Start  

[...]
:: Für jede Zeile in der csv Datei wird nun in mit den Tokens 1 bis x ein einzelner Wert ausgelesen und in eine Variable gespeichert.

	:Start
:: Sicherungsname
for /F "tokens=1 delims=;" %%J IN ("%LINE%") DO set "JOBNAME=%%J"  
:: Zielordner ohne Laufwerksangabe
for /F "tokens=2 delims=;" %%K IN ("%LINE%") DO set "TARGETPATH=%%K"  
:: Quellordner ohne Umgebungsvariablen
for /F "tokens=3 delims=;" %%L IN ("%LINE%") DO set "SOURCE=%%L"  
:: Name der Dummydatei zur Auswahl des Ziellaufwerks
for /F "tokens=4 delims=;" %%M IN ("%LINE%") DO set "DUMMY=%%M"  
:: Einzelne Datei, optional
for /F "tokens=5 delims=;" %%N IN ("%LINE%") DO set "FILE=%%N"  

[...]

goto :eof
Soweit, sogut. Funktioniert alles.


Das Problem ist jetzt allerdings, dass ich in der csv Datei zwingend Variablen angeben/übergeben muss, um das Programm variabel zu halten.

Eine Beispielzeile aus der csv Datei:

Benutzer;Sicherung\Benutzer;%USERPROFILE%;Dummy.csr;

Nachdem die Funktion :Start die Variablen ausgelesen hat, interpretiert der 3. Token den Wert für %SOURCE% direkt als %USERPROFILE% und nicht, wie benötigt, als C:\User\[Benutzername]


Ich hoffe, es ist einigermaßen verständlich, wo das Problem liegt und mir kann jemand helfen.

[Edit Biber] Codeformatierung [/Edit]

Content-Key: 149881

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

Printed on: April 23, 2024 at 13:04 o'clock

Member: bastla
bastla Aug 27, 2010, updated at Jul 24, 2012 at 07:05:34 (UTC)
Goto Top
Hallo ForgottenRealm!

Versuch es mit
call set "SOURCE=%%L"

Abgesehen davon genügt eigentlich eine "for"-Schleife:
for /F "tokens=1-5 delims=;" %%J IN ("%LINE%") DO (  
    REM Sicherungsname
    call set "JOBNAME=%%J"  
    REM Zielordner ohne Laufwerksangabe
    call set "TARGETPATH=%%K"  
    REM Quellordner ohne Umgebungsvariablen
    call set "SOURCE=%%L"  
    REM Name der Dummydatei zur Auswahl des Ziellaufwerks
    call set "DUMMY=%%M"  
    REM Einzelne Datei, optional
    call set "FILE=%%N"  
)
echo %JOBNAME%_%TARGETPATH%_%SOURCE%_%DUMMY%_%FILE%
Etwas kompakter ließe sich das auch so schreiben:
for /F "tokens=1-5 delims=;" %%J IN ("%LINE%") DO (  
    call set "JOBNAME=%%J"     & REM Sicherungsname  
    call set "TARGETPATH=%%K"  & REM Zielordner ohne Laufwerksangabe  
    call set "SOURCE=%%L"      & REM Quellordner ohne Umgebungsvariablen  
    call set "DUMMY=%%M"       & REM Name der Dummydatei zur Auswahl des Ziellaufwerks  
    call set "FILE=%%N"        & REM Einzelne Datei, optional  
)
echo %JOBNAME%_%TARGETPATH%_%SOURCE%_%DUMMY%_%FILE%
Grüße
bastla

P.S.: Findest Du nicht auch, dass als Code formatierte Batches zumindest schon mal besser aussehen? face-wink
Member: ForgottenRealm
ForgottenRealm Aug 27, 2010 at 20:49:06 (UTC)
Goto Top
Hallo bastla

War mir eigentlich klar, dass DU mir wieder helfen kannst face-smile

Auf die Idee mit dem Call set wäre ich im Leben nicht gekommen, vielen Dank!

Das mit in For schleifen mit Tokens die %% Variablen automatisch fortgeführt werden, wusste ich ebenfalls noch nicht - gut zu Wissen, spart mir viel Arbeit.


Und auch was die Formatierung angeht muss ich dir Recht geben, allerdings vergesse ich jedes mal, den Code als Code zu formatieren ...


Also noch einmal, viele Dank für die schnelle Hilfe!
Member: bastla
bastla Aug 27, 2010 at 20:56:37 (UTC)
Goto Top
Hallo ForgottenRealm!

Na ja, ich war zufällig gerade da ... face-wink

Freut mich jedenfalls, wenn Du etwas mitnehmen kannst. face-smile

Grüße
bastla