Batch Schleife als FOR-SCHLEIFE
Mit den FOR-Schleifen habe ich mich leider bislang zu selten auseinander gesetzt, aber da ich sonst gerade nicht weiter komme Frage ich hier mal 
Was ich erzielen möchte ist folgendes. Dateien die in einer Textdatei mit PATH und Dateiname hinterlegt sind so zu Splitten, dass ich den PATH vom Dateinamen getrennt habe.
Wenn nun die Frage noch aufkommen sollte, wofür ich das brauche ist. Ich möchte per Batch mehrere einzelne Dateien aus verschiedenen Ordner in einen anderen Zielordner kopieren / verschieben. Da man nicht von ausgehen kann, dass man keine Leerzeichen im Path oder Datei hat habe ich dies nur bislang so hinbekommen. Nun fehlt es nur noch, dass es in einer verschachtelten FOR-Schleife ist.
Aber im Moment habe ich wohl ein Brett vorm Kopf.
Wer kann mir helfen
Die Erste FOR-Schleife um diese Textdatei auszulesen ist ja noch einfach:
BACKUPDATEI enthält:
"c:\testordner\testdatei nur 1.txt"
"d:\zweiter Ordner\zweite Testdatei.txt"
Batchdatei enthält bislang
for /f "delims=" %%i in (%BACKUPDATEI%) do (
Echo - %%i
)
nun möchte ich in meiner Batchdatei in der FOR-SCHLEIFE folgendes noch einbauen, dass der den Eintrag bis zum ersten Backslash kürzt. Dies habe ich in außerhalb einer For-Schleife so hinbekommen:
So sollte es vielleicht werden:
for /f "delims=" %%i in (%BACKUPDATEI%) do (
Echo - %%i
<PART1>
<PART2>
<PART3>
... dann mit dem Ergebnis was kopieren oder verschieben.
)
Hier meine PART's die hintereinander außerhalb einer FOR-Schleife schon funktionieren
PART 1 von 3: Den Dateinamen "löschen" so dass nu noch der Path übrig bleibt.
:start_ordner
set Ordner="d:\zweiter Ordner\zweite Testdatei.txt"
:schleife_ordner
set Ordner=%Ordner:~0,-1%
if "%Ordner:~-1%"=="\" goto ende_ordner
if not "%Ordner:~-1%"=="\" goto schleife_ordner
:ende_ordner
PART 2 von 3 : Nun habe ich die Zeichenlänge des Ordners mit Hilfe einer weiteren Forschleife berechnet
for /f delims^= %%i in (' cmd /u /von /c "echo !Ordner_ohne!"^|find /v ""^|findstr .^|find /c /v ""
') do set /a ordnerlength = %%i
Part 3 von 3: Den PATH nnun "löschen", so dass nur noch der Dateiname übrig bleibt
set Datei="d:\zweiter Ordner\zweite Testdatei.txt"
set /A countdown=%ordnerlength%+1
:start_Datei
set /A countdown=%countdown%-1
set Datei=%Datei:~1%
if not "%countdown%" == "0" goto start_Datei
kleiner Schönheitsfehler ist hier zwar noch drin, dass der ORDNER noch mit einem " beginnt und die DATEI mit einem " endet.
Was ich erzielen möchte ist folgendes. Dateien die in einer Textdatei mit PATH und Dateiname hinterlegt sind so zu Splitten, dass ich den PATH vom Dateinamen getrennt habe.
Wenn nun die Frage noch aufkommen sollte, wofür ich das brauche ist. Ich möchte per Batch mehrere einzelne Dateien aus verschiedenen Ordner in einen anderen Zielordner kopieren / verschieben. Da man nicht von ausgehen kann, dass man keine Leerzeichen im Path oder Datei hat habe ich dies nur bislang so hinbekommen. Nun fehlt es nur noch, dass es in einer verschachtelten FOR-Schleife ist.
Aber im Moment habe ich wohl ein Brett vorm Kopf.
Wer kann mir helfen
Die Erste FOR-Schleife um diese Textdatei auszulesen ist ja noch einfach:
BACKUPDATEI enthält:
"c:\testordner\testdatei nur 1.txt"
"d:\zweiter Ordner\zweite Testdatei.txt"
Batchdatei enthält bislang
for /f "delims=" %%i in (%BACKUPDATEI%) do (
Echo - %%i
)
nun möchte ich in meiner Batchdatei in der FOR-SCHLEIFE folgendes noch einbauen, dass der den Eintrag bis zum ersten Backslash kürzt. Dies habe ich in außerhalb einer For-Schleife so hinbekommen:
So sollte es vielleicht werden:
for /f "delims=" %%i in (%BACKUPDATEI%) do (
Echo - %%i
<PART1>
<PART2>
<PART3>
... dann mit dem Ergebnis was kopieren oder verschieben.
)
Hier meine PART's die hintereinander außerhalb einer FOR-Schleife schon funktionieren
PART 1 von 3: Den Dateinamen "löschen" so dass nu noch der Path übrig bleibt.
:start_ordner
set Ordner="d:\zweiter Ordner\zweite Testdatei.txt"
:schleife_ordner
set Ordner=%Ordner:~0,-1%
if "%Ordner:~-1%"=="\" goto ende_ordner
if not "%Ordner:~-1%"=="\" goto schleife_ordner
:ende_ordner
PART 2 von 3 : Nun habe ich die Zeichenlänge des Ordners mit Hilfe einer weiteren Forschleife berechnet
for /f delims^= %%i in (' cmd /u /von /c "echo !Ordner_ohne!"^|find /v ""^|findstr .^|find /c /v ""
') do set /a ordnerlength = %%i
Part 3 von 3: Den PATH nnun "löschen", so dass nur noch der Dateiname übrig bleibt
set Datei="d:\zweiter Ordner\zweite Testdatei.txt"
set /A countdown=%ordnerlength%+1
:start_Datei
set /A countdown=%countdown%-1
set Datei=%Datei:~1%
if not "%countdown%" == "0" goto start_Datei
kleiner Schönheitsfehler ist hier zwar noch drin, dass der ORDNER noch mit einem " beginnt und die DATEI mit einem " endet.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 304975
Url: https://administrator.de/forum/batch-schleife-als-for-schleife-304975.html
Ausgedruckt am: 26.04.2025 um 02:04 Uhr
2 Kommentare
Neuester Kommentar

Wieso so umständlich, wenn's dafür schon die passenden Variablen gibt 
ein
Gruß skybird
@echo off
for /f "usebackq delims=" %%a in ("c:\Ordner\datei.txt") do (
echo Laufwerk: %%~da
echo Ordnername: %%~dpa
echo Dateiname: %%~nxa
)
for /?
zeigt dir die möglichen ExpansionenGruß skybird