Per for Schleife Dateipfade mit Leerzeichen aus Textdatei auslesen
Hallo,
ich habe mir eine kleine batch-Datei zu Sicherung bestimmter Ordner geschrieben.
@echo OFF
:: variable WOCHENTAG ermitteln mittels showclok
:: ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP
for /F "tokens=2" %%i IN ('showclok -c') DO (set WOCHENTAG=%%i)
if %wochentag%==Mon set wochentag_de=Mo
if %wochentag%==Tue set wochentag_de=Di
if %wochentag%==Wed set wochentag_de=Mi
if %wochentag%==Thu set wochentag_de=Do
if %wochentag%==Fri set wochentag_de=Fr
if %wochentag%==Sat set wochentag_de=Sa
if %wochentag%==Sun set wochentag_de=So
set datfile=c:\verz_sich.txt
set ziel=H:\Datensicherung\%wochentag_de%
set logs=H:\Datensicherung\logs
if not exist %ziel% md %ziel%
if not exist %logs% md %logs%
ECHO %date% %time% Starte Datensicherung > %logs%\backup_%date%.log
for /f "eol=;" %%i in (%datfile%) do call :Datensicherung %%i
:Datensicherung
setlocal
set pfad=%1
echo %pfad:~3% :: dieses Echo ist nur zu Testzwecken
for /F "tokens=1 delims=:" %%i IN (%datfile%) DO (set lw=%%i)
echo %lw%
if exist %ziel%\%pfad:~3% goto :mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /E /ZB /COPY:DAT /NP >> %logs%\backup_%date%.log
goto :Ende
:mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /mir /NP >> %logs%\backup_%date%.log
goto :Ende
:Ende
Klapt auch soweit sehr sehr gut. Nur bin ich nun am Verzweifeln.... ich habe in der Textdatei einen Pfad mit Leerzeichen....
C:\Dokumente und Einstellungen\User1\Favoriten\
ich habe es mit doppelten Anführungszeichen an verschiedenen Stellen versucht wie z.B.
C:\"Dokumente und Einstellungen"\User1\Favoriten\
C:"\Dokumente und Einstellungen\User1\Favoriten\"
"C:\Dokumente und Einstellungen\User1\Favoriten\"
... usw.
Kann mir jemand net Tipp geben, wie der Pfad in der Textdatei stehen muß. damit es klappt ????
vielen vielen Dank schonmal im voraus für Eure Bemühungen !!!!
Gruß
sparky45
ich habe mir eine kleine batch-Datei zu Sicherung bestimmter Ordner geschrieben.
@echo OFF
:: variable WOCHENTAG ermitteln mittels showclok
:: ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP
for /F "tokens=2" %%i IN ('showclok -c') DO (set WOCHENTAG=%%i)
if %wochentag%==Mon set wochentag_de=Mo
if %wochentag%==Tue set wochentag_de=Di
if %wochentag%==Wed set wochentag_de=Mi
if %wochentag%==Thu set wochentag_de=Do
if %wochentag%==Fri set wochentag_de=Fr
if %wochentag%==Sat set wochentag_de=Sa
if %wochentag%==Sun set wochentag_de=So
set datfile=c:\verz_sich.txt
set ziel=H:\Datensicherung\%wochentag_de%
set logs=H:\Datensicherung\logs
if not exist %ziel% md %ziel%
if not exist %logs% md %logs%
ECHO %date% %time% Starte Datensicherung > %logs%\backup_%date%.log
for /f "eol=;" %%i in (%datfile%) do call :Datensicherung %%i
:Datensicherung
setlocal
set pfad=%1
echo %pfad:~3% :: dieses Echo ist nur zu Testzwecken
for /F "tokens=1 delims=:" %%i IN (%datfile%) DO (set lw=%%i)
echo %lw%
if exist %ziel%\%pfad:~3% goto :mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /E /ZB /COPY:DAT /NP >> %logs%\backup_%date%.log
goto :Ende
:mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /mir /NP >> %logs%\backup_%date%.log
goto :Ende
:Ende
Klapt auch soweit sehr sehr gut. Nur bin ich nun am Verzweifeln.... ich habe in der Textdatei einen Pfad mit Leerzeichen....
C:\Dokumente und Einstellungen\User1\Favoriten\
ich habe es mit doppelten Anführungszeichen an verschiedenen Stellen versucht wie z.B.
C:\"Dokumente und Einstellungen"\User1\Favoriten\
C:"\Dokumente und Einstellungen\User1\Favoriten\"
"C:\Dokumente und Einstellungen\User1\Favoriten\"
... usw.
Kann mir jemand net Tipp geben, wie der Pfad in der Textdatei stehen muß. damit es klappt ????
vielen vielen Dank schonmal im voraus für Eure Bemühungen !!!!
Gruß
sparky45
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 26897
Url: https://administrator.de/contentid/26897
Ausgedruckt am: 17.11.2024 um 23:11 Uhr
16 Kommentare
Neuester Kommentar
Hi,
probier's mal hier mit. Hab ein paar Sachen hinzugefügt:
ECHO OFF
:: variable WOCHENTAG ermitteln mittels showclok
:: ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP" title="ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP" target="_blank">ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP
for /F "tokens=2" %%i IN ('showclok -c') DO (set WOCHENTAG=%%i)
if %wochentag%==Mon set wochentag_de=Mo
if %wochentag%==Tue set wochentag_de=Di
if %wochentag%==Wed set wochentag_de=Mi
if %wochentag%==Thu set wochentag_de=Do
if %wochentag%==Fri set wochentag_de=Fr
if %wochentag%==Sat set wochentag_de=Sa
if %wochentag%==Sun set wochentag_de=So
set datfile="c:\verz_sich.txt"
set ziel="H:\Datensicherung\%wochentag_de%"
set logs="H:\Datensicherung\logs"
if not exist %ziel% md %ziel%
if not exist %logs% md %logs%
ECHO %date% %time% Starte Datensicherung > %logs%\backup_%date%.log
for /f "eol=;" %%i in (%datfile%) do call :Datensicherung %%i
:Datensicherung
setlocal
set pfad="%1"
echo %pfad:~3% :: dieses Echo ist nur zu Testzwecken
for /F "tokens=1 delims=:" %%i IN (%datfile%) DO (set lw=%%i)
echo %lw%
if exist %ziel%\%pfad:~3% goto :mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /E /ZB /COPY:DAT /NP >> %logs%\backup_%date%.log
goto :Ende
:mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /mir /NP >> %logs%\backup_%date%.log
goto :Ende
:Ende
Gruß
Dani
probier's mal hier mit. Hab ein paar Sachen hinzugefügt:
ECHO OFF
:: variable WOCHENTAG ermitteln mittels showclok
:: ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP" title="ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP" target="_blank">ftp://ftp.ads.uga.edu/utility/win-nt/SHOWCLOK.ZIP
for /F "tokens=2" %%i IN ('showclok -c') DO (set WOCHENTAG=%%i)
if %wochentag%==Mon set wochentag_de=Mo
if %wochentag%==Tue set wochentag_de=Di
if %wochentag%==Wed set wochentag_de=Mi
if %wochentag%==Thu set wochentag_de=Do
if %wochentag%==Fri set wochentag_de=Fr
if %wochentag%==Sat set wochentag_de=Sa
if %wochentag%==Sun set wochentag_de=So
set datfile="c:\verz_sich.txt"
set ziel="H:\Datensicherung\%wochentag_de%"
set logs="H:\Datensicherung\logs"
if not exist %ziel% md %ziel%
if not exist %logs% md %logs%
ECHO %date% %time% Starte Datensicherung > %logs%\backup_%date%.log
for /f "eol=;" %%i in (%datfile%) do call :Datensicherung %%i
:Datensicherung
setlocal
set pfad="%1"
echo %pfad:~3% :: dieses Echo ist nur zu Testzwecken
for /F "tokens=1 delims=:" %%i IN (%datfile%) DO (set lw=%%i)
echo %lw%
if exist %ziel%\%pfad:~3% goto :mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /E /ZB /COPY:DAT /NP >> %logs%\backup_%date%.log
goto :Ende
:mirror
robocopy %pfad% %ziel%\%lw%\%pfad:~3% /mir /NP >> %logs%\backup_%date%.log
goto :Ende
:Ende
Gruß
Dani
Moin sparky45,
ich versuch es auch mal, bevor das hier ganz in Rumraterei endet..
Angenommen, Du hast den Wochentag wie auch immer ermittelt und das %datfile% sieht aus, wie man/frau sich das vorstellt:
also wie eine "Dir /b /s /A:d"-Ausgabe... Pfade mit Leerzeichen sind dabei.
Dann bringt Dir doch am CMD-Prompt folgendes den gewünschten Anfangswert:
In Deinem Fall im Batch also (gleich getrennt nach Lw-Buchstaben und Pfad):
So in etwa würde es aussehen, wenn ich Deine Codestruktur möglichst unverändert lasse.
HTH Biber
[Edit]
Übernommen habe ich die Logik (den Bug?):
if exist "%ziel%\%pfad%" goto :mirror
...
:mirror
robocopy "%lw%\%pfad%" "%ziel%\%lw%\%pfad%"....
IMHO müsste die IF EXIST-Prüfung auf "%ziel%\%lw%\%pfad%" geändert werden.
[/Edit]
ich versuch es auch mal, bevor das hier ganz in Rumraterei endet..
Angenommen, Du hast den Wochentag wie auch immer ermittelt und das %datfile% sieht aus, wie man/frau sich das vorstellt:
$cmd$type %datfile%
d:\Dokumente und Einstellungen\All Users\Desktop
d:\Dokumente und Einstellungen\All Users\Startmenü
d:\Dokumente und Einstellungen\All Users\Anwendungsdaten
d:\Dokumente und Einstellungen\All Users\Vorlagen
d:\Dokumente und Einstellungen\All Users\Favoriten
d:\Dokumente und Einstellungen\All Users\Dokumente
d:\Dokumente und Einstellungen\All Users\Startmenü\Programme
.....
Dann bringt Dir doch am CMD-Prompt folgendes den gewünschten Anfangswert:
$cmd$for /f "delims=" %i in (%datfile%) do @echo "%i"
"d:\Dokumente und Einstellungen\All Users\Desktop"
"d:\Dokumente und Einstellungen\All Users\Startmenü"
"d:\Dokumente und Einstellungen\All Users\Anwendungsdaten"
"d:\Dokumente und Einstellungen\All Users\Vorlagen"
"d:\Dokumente und Einstellungen\All Users\Favoriten"
:: Anmerkung ---die Variable %ziel% ist bei mir
:: statt ALT : -------> set ziel="H:\Datensicherung\%wochentag_de%"
:: jetzt NEU: -------> set "ziel=H:\Datensicherung\%wochentag%"
....
for /f "tokens=1-2 delims=:" %%i in (%datfile%) do call :Datensicherung %%i "%%j"
goto :eof
:Datensicherung
Set "lw=%1" & set "pfad=%~2"
Set "pfad=%pfad:~1%" && rem ersten Backslash entfernen
::%ziel% ist ohne abschließenden Backslash; %pfad% ohne führendem Backslash
echo lw= [%lw%] pfad=[%pfad%]
if exist "%ziel%\%pfad%" goto :mirror
robocopy "%lw%:\%pfad%" "%ziel%\%lw%\%pfad%" /E /ZB /COPY:DAT /NP >> %logs%\backup_%date%.log
goto :eof
:mirror
robocopy "%lw%\%pfad%" "%ziel%\%lw%\%pfad%" /mir /NP >> %logs%\backup_%date%.log
goto :eof
:: ~~~~end of batch
HTH Biber
[Edit]
Übernommen habe ich die Logik (den Bug?):
if exist "%ziel%\%pfad%" goto :mirror
...
:mirror
robocopy "%lw%\%pfad%" "%ziel%\%lw%\%pfad%"....
IMHO müsste die IF EXIST-Prüfung auf "%ziel%\%lw%\%pfad%" geändert werden.
[/Edit]
Robocopy trennt scheinbar von sich aus nach dem ersten Leerzeichen.
mit der Zeile:
for /f "delims=;" %%i in (%datfile%) do (set pfad=%%i)
bekommt man den %Pfad% mit den langen Dateinamen gefüllt, aber ob mit oder ohne Anführungszeichen, es wird ein Fehler in der Logdatei ausgegeben.
ERROR : Invalid Parameter #3 : "Einstellungen\all users\Favoriten"
Da hat bei mir nur die Tilde geholfen.
Zeile in der verz_sich.txt:
C:\Dokume~1\alluse~1\Favoriten;
mit der Zeile:
for /f "delims=;" %%i in (%datfile%) do (set pfad=%%i)
bekommt man den %Pfad% mit den langen Dateinamen gefüllt, aber ob mit oder ohne Anführungszeichen, es wird ein Fehler in der Logdatei ausgegeben.
ERROR : Invalid Parameter #3 : "Einstellungen\all users\Favoriten"
Da hat bei mir nur die Tilde geholfen.
Zeile in der verz_sich.txt:
C:\Dokume~1\alluse~1\Favoriten;
Moin Bernd,
kann ich so nicht bestätigen...
habe mit meiner (älteren) Robocopy.exe Vers. 1.96 am CMD-Prompt getestet. Diese Version kennt allerdings keinen Parameter /ZB und kein /Copy:dat... die hab ich rausgelassen.
Test und Ergebnis:
> works as designed.
Welche Robocopy-Version hast Du denn?
Grüße
Biber
kann ich so nicht bestätigen...
habe mit meiner (älteren) Robocopy.exe Vers. 1.96 am CMD-Prompt getestet. Diese Version kennt allerdings keinen Parameter /ZB und kein /Copy:dat... die hab ich rausgelassen.
Test und Ergebnis:
cmd$dir "d:\Dokumente und Einstellungen\Biber\Favoriten\unattended"
Verzeichnis von d:\Dokumente und Einstellungen\Biber\Favoriten\unattended
24.09.2005 14:07 DIR .
24.09.2005 14:07 DIR ..
24.09.2005 14:07 185 Windows-Unattended.url
Z:\>
$cmd$set quellDir="d:\Dokumente und Einstellungen\Biber\Favoriten\unattended"
robocopy %quelldir% "z:\robotest\D\%quelldir:~3,-1%" /E /NP>>robocopy.log
-----> Logfile (Ziel-Verzeichnis existierte NICHT):
$cmd$type robocopy.log
----------------------------------------------------------------------
ROBOCOPY v 1.96 : Robust File Copy for Windows NT
----------------------------------------------------------------------
Started : Sun Feb 26 16:33:37 2006
Source : d:\Dokumente und Einstellungen\Biber\Favoriten\unattended\
Dest : z:\robotest\D\Dokumente und Einstellungen\Biber\Favoriten\unattended\
Files : *.*
Options : *.* /S /E /NP /R:1000000 /W:30
---------------------------------------------------------------------
1 d:\Dokumente und Einstellungen\Biber\Favoriten\unattended\
---------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 1 0 0 0 0
Files : 1 1 0 0 0 0
Bytes : 185 185 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Ended : Sun Feb 26 16:33:37 2006
Welche Robocopy-Version hast Du denn?
Grüße
Biber
Also, sparky,
die Robocopy-Versionen mögen sich unterscheiden, aber nicht bei diesem Leerzeichen-im-Pfad-Problem.
Nochmal mit Kommentaren:
HTH Biber
die Robocopy-Versionen mögen sich unterscheiden, aber nicht bei diesem Leerzeichen-im-Pfad-Problem.
Nochmal mit Kommentaren:
:: set datfile=c:\verz_sich.txt ---->damit kein Leerzeichen am Ende ist:
set "datfile=c:\verz_sich.txt"
set "ziel=H:\Datensicherung\%wochentag_de%" && rem ---->damit kein Leerzeichen am Ende ist:
set "logs=H:\Datensicherung\logs" && REM ---->damit kein Leerzeichen am Ende ist:
:: %ziel% und %logs% emthalten zwar KEINE Leerzeichen im Pfadnamen,
:: aber ich würde auch hier "%ziel%" und "%logs% schreiben
:: ---if not exist %ziel% md %ziel%
:: ---if not exist %logs% md %logs%
if not exist "%ziel%" md "%ziel%"
if not exist "%logs%" md "%logs%"
:: ECHO %date% %time% Starte Datensicherung > %logs%\backup_%date%.log
ECHO %date% %time% Starte Datensicherung >"%logs%\backup_%date%.log"
::---for /f "tokens=1-2 delims=:" %%i in (%datfile%) do call :Datensicherung %%i "%%j
::---------da fehlt ein Anführungszeichen am Ende ...das ist der Bug!!!!
for /f "tokens=1-2 delims=:" %%i in (%datfile%) do call :Datensicherung %%i "%%j"
goto :eof
:Datensicherung
:: ------Set lw=%1
:: ---- set pfad=%2
::--- Set pfad=%pfad:~1%
Set "lw=%1"
:: --------> Wert von [%lw%] ist [D] oder [C]...woher Du auch immer sicherst...
set "pfad=%~2"
::-------->Wert von [Parameter2] war ["\Dokumente und Bla\...\Enddir"]
:: -------> durch die Trim-Tilde ("~") entferne ich die Anführungszeichen
Set "pfad=%pfad:~1%"
:: Hier verwende ich NICHT die Tilde ("~"), sondern die Substring-Funktion (":~") !!
:: Aus [%pfad%] = [\Dokumente und Bla\...\Enddir] wird [Dokumente und Bla\...\Enddir]..... ohne Anfü-Zeichen!
:. ---if exist %ziel%\%lw%%pfad%\ goto :mirror
if exist "%ziel%\%lw%%pfad%" goto :mirror
:: Alle Variablen sind ohne Anführungszeichen...
:: also kann und MUSS ich um den Gesamt-String welche setzen.
::robocopy "%lw%:%pfad%" %ziel%\%lw%%pfad% /S /E /ZB /COPY:DAT /NP >> %logs%\backup_%date%.log
robocopy "%lw%:%pfad%" "%ziel%\%lw%%pfad%" /S /E /ZB /COPY:DAT /NP >>"%logs%\backup_%date%.log"
goto :eof
:mirror
robocopy "%lw%:%pfad%" "%ziel%\%lw%%pfad%" /mir /NP >>"%logs%\backup_%date%.log"
goto :eof
:: Anm. :eof ...überflüssig.."goto :eof" führt IMMER zum Rücksprung. Auch ohne Sprungmarke
Na, sparky45,
dann setze ich Deine Frage mal auf gelöst.
Und morgen schaue ich mir das mal an, wie sich die Robocopy XP010 verhält.
Das darf doch nicht wahr sein, dass M$ da von W2K auf XP die Syntax und das Verhalten ändert...
Obwohl... bei ShutDown.exe und bei Ping.exe war es auch so..
Warum sind diese Redmonder eigentlich so beliebt bei uns? *grübelgrummelbrummel*
Stressarmen Rosenmontag
Biber
dann setze ich Deine Frage mal auf gelöst.
Und morgen schaue ich mir das mal an, wie sich die Robocopy XP010 verhält.
Das darf doch nicht wahr sein, dass M$ da von W2K auf XP die Syntax und das Verhalten ändert...
Obwohl... bei ShutDown.exe und bei Ping.exe war es auch so..
Warum sind diese Redmonder eigentlich so beliebt bei uns? *grübelgrummelbrummel*
Stressarmen Rosenmontag
Biber
Nachtrag:
Habe gerade das oben beschriebene Procedere zum Robocopy-Test am CMD-Prompt (die Antwort an Bernd) auch unter XP Pro mit Robocopy.exe XP010 getestet.
Funktioniert auch:
Also in diesem Punkt ziehe ich meine Skepsis gegenüber M$ zurück.
XP-Robocopy kann ebenso wie W2K-Robocopy mit Leerzeichen in Pfad/Dateinamen umgehen.
Grüße
Biber
Habe gerade das oben beschriebene Procedere zum Robocopy-Test am CMD-Prompt (die Antwort an Bernd) auch unter XP Pro mit Robocopy.exe XP010 getestet.
Funktioniert auch:
>set Quelldir="C:\Dokumente und Einstellungen\Biber\Favoriten\progs-vbs"
>robocopy %quelldir% "d:\temp\robotest\D\%quelldir:~3,-1%" /E /ZB /COPY:dat /NP
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows :: Version XP010
-------------------------------------------------------------------------------
...
Source : C:\Dokumente und Einstellungen\Biber\Favoriten\progs-vbs\
Dest : d:\temp\robotest\D\Dokumente und Einstellungen\Biber\Favoriten\progs-vbs\
Files : *.*
Options : *.* /S /E /COPY:DAT /ZB /NP /R:1000000 /W:30
------------------------------------------------------------------------------
New Dir 7 C:\Dokumente und Einstellungen\Biber\Favoriten\progs-vbs\
New File 72 Active Directory- LDAP-Feldnamen - faq-o-matic.net.url
New File 132 microsoft.public.de.german.scripting.wsh- By Thread.url
......
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 1 0 0 0 0
Files : 7 7 0 0 0 0
...
Ended : Mon Feb 27 12:43:44 2006
XP-Robocopy kann ebenso wie W2K-Robocopy mit Leerzeichen in Pfad/Dateinamen umgehen.
Grüße
Biber
Manchmal sind es nur ein paar Kleinigkeiten wie Anführungszeichen.
Ich habe es nochmal getestet - nach der Vorlage von Biber.
So funktioniert es auch bei mir! Wieder was dazugelernt!
ROBOCOPY :: Robust File Copy for Windows :: Version XP010
ROBOCOPY :: Robust File Copy for Windows :: Version XP010
Started : Mon Feb 27 14:03:18 2006
Source : C:\Dokumente und Einstellungen\b_weise\Favoriten\
Dest : f:\sicherung\Mo\C\Dokumente und Einstellungen\b_weise\Favoriten\
Files : *.*
Options : *.* /S /E /COPY:DAT /PURGE /MIR /NP /R:1000000 /W:30
Grüße aus Bramsche
Bernd
Ich habe es nochmal getestet - nach der Vorlage von Biber.
So funktioniert es auch bei mir! Wieder was dazugelernt!
ROBOCOPY :: Robust File Copy for Windows :: Version XP010
ROBOCOPY :: Robust File Copy for Windows :: Version XP010
Started : Mon Feb 27 14:03:18 2006
Source : C:\Dokumente und Einstellungen\b_weise\Favoriten\
Dest : f:\sicherung\Mo\C\Dokumente und Einstellungen\b_weise\Favoriten\
Files : *.*
Options : *.* /S /E /COPY:DAT /PURGE /MIR /NP /R:1000000 /W:30
Grüße aus Bramsche
Bernd