Zippen von Dateien in Variablen Verzeichnissen - geschachtelte FOR-Schleife
Hallo zusammen,
Das ist mein erster Eintrag hier. Ich hoffe, dass ihr mir helfen könnt.
Ich habe folgende Ausgangssituation:
Stammverzeichnis: D:\Temp
Darunter gibt es folgende Verzeichnisstruktur (Namen sind Variabel und beinhalten Leerzeichen):
Cat 1
Cat 2
Cat 3
usw.
In diesen Verzeichnissen werden zyklisch neue Textdateien abgelegt mit ebenfalls variable Namen mit Leerzeichen.
Ich möchte per Skript die Textdateien in eine Zip-Datei verschieben. Die Zip-Datei liegt unter bzw. heist: d:\<Jahr>\<Monat>\<Jahr>-<Verzeichnisname>.zip
Hierzu habe ich mir folgendes Skript überlegt:
:datum in Variablen
set "Jahr=%date:~-4%"
set "Monat=%date:~-7,2%"
set "Tag=%date:~-10,2%"
: Schleife über alle Unterverzeichnisse in D:\Temp
for /f "tokens=*" %%i in ('dir /b d:\Temp') do (
set "cat=%%i"
echo %cat%
: Schleife über alle Dateien im Unterverzeichnis
for /R "d:\Temp\%cat%" %%j in (*.txt) do (
set "Report=%%j"
echo %Report%
: erst mal wird nur hinzugefügt und nicht verschoben. 7zip kann nicht moven, d.h. das Ergebnis ist hier noch zu prüfen und bei Erfolg ist %Report% zu löschen. Kommt später.
"%programfiles%\7-zip\7z.exe" a "D:\%Jahr%\%Monat%\%Jahr%-%cat%.zip" "%Report%"
)
)
Das funktioniert nur für den ersten Schleifendurchlauf. Danach haben die Variablen %cat% und %Report% feste Werte, die nicht mehr überschrieben werden.
1. Durchlauf der äußeren Schleife:
%%i == Cat 3
echo %cat% ergibt "Cat 3"
2. Durchlauf der äußeren Schleife:
%%i == Cat 2
jedoch
echo %cat% ergibt immer noch "Cat 3"
3. Durchlauf und alle weiteren Durchläufe, sowie bei der inneren Schleife passiert dasselbe mit dem Ergebnis, dass x mal die gleiche Textdatei in die gleiche Zip-Datei gezippt wird.
Ich habe schon rauf und runter gegooglet, aber nichts brauchbares gefunden. Es ware super, wenn mir hier jemand weiterhelfen könnte.
Ich danke euch schonmal für eure Antworten!
Viele Grüße
Misterjo
Das ist mein erster Eintrag hier. Ich hoffe, dass ihr mir helfen könnt.
Ich habe folgende Ausgangssituation:
Stammverzeichnis: D:\Temp
Darunter gibt es folgende Verzeichnisstruktur (Namen sind Variabel und beinhalten Leerzeichen):
Cat 1
Cat 2
Cat 3
usw.
In diesen Verzeichnissen werden zyklisch neue Textdateien abgelegt mit ebenfalls variable Namen mit Leerzeichen.
Ich möchte per Skript die Textdateien in eine Zip-Datei verschieben. Die Zip-Datei liegt unter bzw. heist: d:\<Jahr>\<Monat>\<Jahr>-<Verzeichnisname>.zip
Hierzu habe ich mir folgendes Skript überlegt:
:datum in Variablen
set "Jahr=%date:~-4%"
set "Monat=%date:~-7,2%"
set "Tag=%date:~-10,2%"
: Schleife über alle Unterverzeichnisse in D:\Temp
for /f "tokens=*" %%i in ('dir /b d:\Temp') do (
set "cat=%%i"
echo %cat%
: Schleife über alle Dateien im Unterverzeichnis
for /R "d:\Temp\%cat%" %%j in (*.txt) do (
set "Report=%%j"
echo %Report%
: erst mal wird nur hinzugefügt und nicht verschoben. 7zip kann nicht moven, d.h. das Ergebnis ist hier noch zu prüfen und bei Erfolg ist %Report% zu löschen. Kommt später.
"%programfiles%\7-zip\7z.exe" a "D:\%Jahr%\%Monat%\%Jahr%-%cat%.zip" "%Report%"
)
)
Das funktioniert nur für den ersten Schleifendurchlauf. Danach haben die Variablen %cat% und %Report% feste Werte, die nicht mehr überschrieben werden.
1. Durchlauf der äußeren Schleife:
%%i == Cat 3
echo %cat% ergibt "Cat 3"
2. Durchlauf der äußeren Schleife:
%%i == Cat 2
jedoch
echo %cat% ergibt immer noch "Cat 3"
3. Durchlauf und alle weiteren Durchläufe, sowie bei der inneren Schleife passiert dasselbe mit dem Ergebnis, dass x mal die gleiche Textdatei in die gleiche Zip-Datei gezippt wird.
Ich habe schon rauf und runter gegooglet, aber nichts brauchbares gefunden. Es ware super, wenn mir hier jemand weiterhelfen könnte.
Ich danke euch schonmal für eure Antworten!
Viele Grüße
Misterjo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 285545
Url: https://administrator.de/forum/zippen-von-dateien-in-variablen-verzeichnissen-geschachtelte-for-schleife-285545.html
Ausgedruckt am: 22.04.2025 um 06:04 Uhr
5 Kommentare
Neuester Kommentar
Hallo misterjo, willkommen im Forum.
Variablen werden in einer Kommandozeile oder einem in Klammern eingefassten Block von Kommandozeilen nur einmal zum Wert expandiert. Das passiert noch bevor die Zeile/der Block ausgeführt wird. Der Rumpf deiner FOR Schleifen ist so ein Block. Abhilfe würde die verzögerte Variablenerweiterung schaffen (setlocal EnableDeleyedExpansion), wobei die % einer Variablen durch ! ersetzt werden würden. Die Verarbeitung ist aber trotzdem nicht einfach, da nun ein ! in einem String (bspw. ein Dateiname) zu Fehlinterpretationen führen würde.
In deinem Fall stellt sich die Frage, warum du überhaupt die Variablen cat und Report definierst. Ebenso gut kannst du innerhalb des Schleifenkonstrukts mit den FOR Variablen %%i und %%j weiterarbeiten.
Grüße
rubberman
Variablen werden in einer Kommandozeile oder einem in Klammern eingefassten Block von Kommandozeilen nur einmal zum Wert expandiert. Das passiert noch bevor die Zeile/der Block ausgeführt wird. Der Rumpf deiner FOR Schleifen ist so ein Block. Abhilfe würde die verzögerte Variablenerweiterung schaffen (setlocal EnableDeleyedExpansion), wobei die % einer Variablen durch ! ersetzt werden würden. Die Verarbeitung ist aber trotzdem nicht einfach, da nun ein ! in einem String (bspw. ein Dateiname) zu Fehlinterpretationen führen würde.
In deinem Fall stellt sich die Frage, warum du überhaupt die Variablen cat und Report definierst. Ebenso gut kannst du innerhalb des Schleifenkonstrukts mit den FOR Variablen %%i und %%j weiterarbeiten.
Grüße
rubberman
Hallo misterjo.
... wobei
Grüße
rubberman
Jetzt habe ich nur noch die Frage, ob for /f "tokens=*" genügt
Ja, genügt. "delims=" wäre die Alternative zu diesem Zweck, das Ergebnis ist aber (in diesem Fall) dasselbe.Im Moment würde ich versuchen die Ausgabe des 7zip zu parsen ... Geht das vielleicht auch einfacher?
Hmm. Habe 7zip noch nicht in der Kommandozeile benutzt. Aber laut Referenz kannst du den Rückgabewert abfragen."%programfiles%\7-zip\7z.exe" a "D:\%Jahr%\%Monat%\%Jahr%-%%i.zip" "d:\Temp\%%i\%%j"
if errorlevel 1 echo Fehler.
... wobei
if errorlevel 1
, im Gegensatz zur Prüfung der %errorlevel% Variable, auch in einem in Klammern gesetzten Zeilenblock funktioniert. Die Bedeutung ist: "Wenn der Rückgabewert größer oder gleich 1 ist, dann ..."Grüße
rubberman