forgottenrealm
Goto Top

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?
Kommentar vom Moderator Biber am Feb 18, 2010 um 18:27:14 Uhr
Verschoben von "Entwicklung" nach "Batch & Shell".

Content-Key: 136324

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

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

Member: Biber
Biber Feb 18, 2010 at 18:25:57 (UTC)
Goto Top
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
Member: bastla
bastla Feb 18, 2010 at 18:29:08 (UTC)
Goto Top
... 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
Member: ForgottenRealm
ForgottenRealm Feb 18, 2010 at 18:36:05 (UTC)
Goto Top
Hi face-smile

Funktioniert leider beides nicht.

Die Variable %%L wird nach wie vor nicht richtig aufgelöst
Member: bastla
bastla Feb 18, 2010 at 18:57:13 (UTC)
Goto Top
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
Member: ForgottenRealm
ForgottenRealm Feb 18, 2010 at 19:20:41 (UTC)
Goto Top
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 ...