forgottenrealm

Problem mit for schleife - batch

Hallo


Ich wollte einige Scripte, welche erstellte Batchdateien automatisch verarbeiten (mit rar.exe packen und verschieben), mit einer for-schleife kürzen, allerdings funktioniert das einfach nicht.

Bisher schaut die Datei so aus (gekürzt)

@title Archivierung
@echo OFF

@set NETWORKDRIVE=Z:
@set LOCALDRIVE=E:
@set WORKPATH=%NETWORKDRIVE%\Tasks\Clients\Automatische Sicherung
@if %COMPUTERNAME%==SERVER @set WORKPATH=%LOCALDRIVE%\Netzwerkablage\Tasks\Clients\Automatische Sicherung
@set /P VERSION=<"%WORKPATH%\Version.txt"
@set CLIENTLIST=Clients.txt
@set DELOPTIONS=/F /Q
@set RAROPTIONS=-Y -M5 -U A
@set ARCHIVFILE=%VERSION%.rar
REM -----------------------------------------------------------------------------------------------
@set CLIENT=abc
@set TARGET=%WORKPATH%\%CLIENT%\%ARCHIVFILE%

@title %CLIENT%
CD %WORKPATH%\%CLIENT%
@del %DELOPTIONS% "%TARGET%"
@rar %RAROPTIONS% "%TARGET%" "%VERSION%"


Der Teil nach dem Trennstrich wiederholt sich etwa 350 mal, was die Batchdatei wahnsinnig unübersichtlich und unpraktisch macht.
In der Clients.txt habe ich jetzt alle ca 350 Clienten eingetragen, welche abgearbeitet werden sollen.

Das was ich mir bisher mit for gebastelt habe, funktioniert nicht, weil die for-schleife in jeder Anweisung bei der leerstelle in "Automatische Sicherung" aufhört, sobald diese mit der Variable %%L arbeiten soll, obwohl in dieser nur der Inhalt der Textdatei stehen sollte.

@for /F %%L IN ("%WORKPATH%\%CLIENTLIST%") DO (

@title %%L
@set TARGET=%WORKPATH%\%%L\%ARCHIVFILE%
CD %WORKPATH%\%%L
@del %DELOPTIONS% "%TARGET%"
@rar %RAROPTIONS% "%TARGET%" "%VERSION%"
)

Wo liegt der Fehler?
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen
Kommentar vom Moderator Biber am 18.02.2010 um 19:27:14 Uhr
Verschoben von "Entwicklung" nach "Batch & Shell".

Content-ID: 136324

Url: https://administrator.de/forum/problem-mit-for-schleife-batch-136324.html

Ausgedruckt am: 09.07.2025 um 00:07 Uhr

Biber
Biber 18.02.2010 um 19:25:57 Uhr
Moin ForgottenRealm,

sinngemäß musst du bei der FOF/F-Anweisung mit "delims=" arbeiten (=keine Token-Trenner, nimm ganze Zeile) und die Laufvariable dann ggf. in Anführungszeichen setzen.

...
FOR /F "delims=" %%L IN ("%WORKPATH%\%CLIENTLIST%") DO (  

Title %%L
set "TARGET=%WORKPATH%\%%L\%ARCHIVFILE%"  
CD "%WORKPATH%\%%L"  
del %DELOPTIONS% "%TARGET%"  
rar %RAROPTIONS% "%TARGET%" "%VERSION%"  
)
....

Grüße
Biber
bastla
bastla 18.02.2010 um 19:29:08 Uhr
... und außerdem wird "%WORKPATH%\%CLIENTLIST%" (da unter Anführungszeichen stehend) als Text und nicht als Pfad zu einer Datei interpretiert - daher:
FOR /F "usebackq delims=" %%L IN ("%WORKPATH%\%CLIENTLIST%") DO (
Grüße
bastla
ForgottenRealm
ForgottenRealm 18.02.2010 um 19:36:05 Uhr
Hi face-smile

Funktioniert leider beides nicht.

Die Variable %%L wird nach wie vor nicht richtig aufgelöst
bastla
bastla 18.02.2010 um 19:57:13 Uhr
Hallo ForgottenRealm!
Die Variable %%L wird nach wie vor nicht richtig aufgelöst
Wie äußert sich das?
Ohne "delayedExpansion" kann allerdings die Verwendung der Variablen %TARGET% in der Schleife nicht funktionieren - so sollte es aber klappen:
FOR /F "usebackq delims=" %%L IN ("%WORKPATH%\%CLIENTLIST%") DO (  
    Title %%L 
    CD "%WORKPATH%\%%L"   
    del %DELOPTIONS% "%WORKPATH%\%%L\%ARCHIVFILE%"   
    rar %RAROPTIONS% "%WORKPATH%\%%L\%ARCHIVFILE%" "%VERSION%"  
)
Grüße
bastla
ForgottenRealm
ForgottenRealm 18.02.2010 um 20:20:41 Uhr
Im Moment schaut es so aus ...

Wenn ich CD "%WORKPATH%\%%L" verarbeiten lasse, so wird das Ziel nicht gefunden und der Text in der Fehlerausgabe endet bei Automatische"

Es scheint also ein Problem mit dem Leerzeichen zu geben.

Lasse ich mir jetzt aber "%WORKPATH%\%%L" mit echo ausgeben, so wird der Pfad korrekt angegeben.

Woran liegt das?

Weiterhin bin ich bei anderen Scripts darauf angewiesen, in der For-Schleife Variablen zu definieren, was aber leider nicht funktioniert.

Ich könnte natürlich auch mit;

@set CLIENTS=AA BB CC DD ...

for %%i in (%CLIENTS%) do (
set client=%clients%
cd "%clients%"
)

Arbeiten, allerdings wird die Variable dann wieder sehr lang und unübersichtlich ...