sparky45
Goto Top

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

Content-ID: 26897

Url: https://administrator.de/forum/per-for-schleife-dateipfade-mit-leerzeichen-aus-textdatei-auslesen-26897.html

Ausgedruckt am: 23.12.2024 um 10:12 Uhr

Dani
Dani 25.02.2006 um 21:34:02 Uhr
Goto Top
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
sparky45
sparky45 25.02.2006 um 21:51:11 Uhr
Goto Top
Hallo Dani....

erstmal vielen vielen Dank für Deine superschnelle Antwort.

Hat aber leider nicht funktioniert.

Mit Deinen Änderungen sucht er nun das Verzeichnis c:\verz_sich.txt.

Gruß
sparky45
Dani
Dani 25.02.2006 um 21:59:23 Uhr
Goto Top
Hi Sparky45,

warum das?? Es ist doch die Datei angeben!! Was passiert, wenn du bei set datfile.... die " wegmachst?!

Gruß
Dani
sparky45
sparky45 25.02.2006 um 22:04:40 Uhr
Goto Top
Hallo Dani...

dann funktioniert es wieder soweit wie vorher auch...

bei dem Echo (Echo %pfad:~3%), welches ich zu Testzwecken eingetragen habe steht dann wieder

Dokumente

dort sollte aber

Dokumente und Einstellungen\User1\Favoriten

stehen

Gruß
sparky45
Dani
Dani 25.02.2006 um 22:09:15 Uhr
Goto Top
Hi Sparky,
schreibs doch einfach mal so: E"%pfad:~3%"


Gruß
Dani
sparky45
sparky45 25.02.2006 um 22:19:26 Uhr
Goto Top
Hallo Dani....

dann sieht die Ausgabe so aus:

"\Dokumente"" (in Textdatei Pfad OHNE Anführunszeichen)
"\"Dokumente"" (in Textdatei Pfad MIT Anführungszeichen c:\"Dokumente und Einstellungen"\...)

wie sollte es denn in der Textdatei stehen ??

Gruß
sparky45
Biber
Biber 25.02.2006 um 23:48:07 Uhr
Goto Top
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:
$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
.....
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:

$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"  
In Deinem Fall im Batch also (gleich getrennt nach Lw-Buchstaben und Pfad):
:: 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
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]
TheSpecialist
TheSpecialist 26.02.2006 um 16:01:05 Uhr
Goto Top
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;
Biber
Biber 26.02.2006 um 16:43:10 Uhr
Goto Top
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:
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
> works as designed.

Welche Robocopy-Version hast Du denn?
Grüße
Biber
sparky45
sparky45 26.02.2006 um 19:54:14 Uhr
Goto Top
Hallo Bernd, hallo Biber....

auch Euch vielen vielen Dank für die Hilfe.

meine Robocopy Version = XP010

Ich habe Biber`s Version noch ein wenig abändern müssen:
@ECHO OFF

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 "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%


if exist %ziel%\%lw%%pfad%\ goto :mirror
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

:eof 
In Textdatei:

c:\Dokume~1\User1\Favoriten

Robocopy Protokoll:
-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows     ::     Version XP010
-------------------------------------------------------------------------------

  Started : Sun Feb 26 19:35:29 2006

   Source : c:\Dokume~1\User1\Favoriten\
     Dest = H:\Datensicherung\So\c\Dokume~1\User1\Favoriten\

    Files : *.*
	    
  Options : *.* /S /E /COPY:DAT /ZB /NP /R:1000000 /W:30 

------------------------------------------------------------------------------

hier die kopierten Dateien gelistet

------------------------------------------------------------------------------

                Total    Copied   Skipped  Mismatch    FAILED    Extras
     Dirs :         20         20         0         0         0         0
    Files :       107       107         0         0         0         0
    Bytes :     11.5 k     11.5 k         0         0         0         0
    Times :   0:04:09   0:04:09                       0:00:00   0:00:00
Das hat ja soweit geklappt face-smile)

nu kommt aber der nächste Fehler:

Ich habe einen Pfad

d:\Programme\Serwin 2000

wenn ich nun in der Textdatei den Pfad ebenfalls mit Tildezeichen angebe:

d:\Programme\Serwin~1

erscheint folgende Meldung im Robocopy Protokoll:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows     ::     Version XP010
-------------------------------------------------------------------------------

  Started : Sun Feb 26 19:39:55 2006

   Source : d:\Programme\Serwin 2000" H:\Datensicherung\So\d\Programme\Serwin 2000\ \S \E \ZB \COPY:DAT \NP\  
     Dest - 

    Files : *.*
	    
  Options : *.* /COPY:DAT /R:1000000 /W:30 

------------------------------------------------------------------------------

ERROR : No Destination Directory Specified.

       Simple Usage :: ROBOCOPY source destination /MIR

             source :: Source Directory (drive:\path or \\server\share\path).
        destination :: Destination Dir  (drive:\path or \\server\share\path).
               /MIR :: Mirror a complete directory tree.

    For more usage information run ROBOCOPY /? or read Robocopy.Doc.

NOTE: Read "True Replication" in Robocopy.Doc prior to first use of /MIR !  
****  /MIR can DELETE files as well as copy them !
jemand ne Idee ??

liegt es vielleicht wirklich an der Version von Robocopy ??

kann mir jemand die 1.96er Version schicken ??
kann sie nirgens finden (gegooglet) finde nur die XP010.

Gruß
sparky45
Biber
Biber 26.02.2006 um 20:28:03 Uhr
Goto Top
Also, sparky,

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 
HTH Biber
sparky45
sparky45 26.02.2006 um 21:28:26 Uhr
Goto Top
Halli Hallo....

also mit der 1.96er Version von Robocopy funktioniert es jetzt !!! face-smile

ich brauch noch nicht mal das Tildezeichen in der Textdatei !!

Das heißt die Pafade stehen nun wie folgt in der verz_sich.txt:

C:\Dokumente und Einstellungen\User1\Favoriten
...
D:\Programme\Serwin 2000
...
usw.

VIELEN VIELEN DANK EUCH ALLEN !!!!!!!!!

Gruß aus Essen

Marco
sparky45 face-smile
Biber
Biber 27.02.2006 um 00:45:51 Uhr
Goto Top
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.. face-sad

Warum sind diese Redmonder eigentlich so beliebt bei uns? *grübelgrummelbrummel*

Stressarmen Rosenmontag
Biber
sparky45
sparky45 27.02.2006 um 11:59:01 Uhr
Goto Top
Hallo Biber....

tjaja.... Die Wege DES Herrn sind unergründlich.... face-wink

NOCHMALS vielen Dank für Eure Unterstützung !!!

ebenfalls allen noch nen stressfreien Rosenmontag !!!

Gruß

sparky45
Biber
Biber 27.02.2006 um 12:55:14 Uhr
Goto Top
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:
>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
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
TheSpecialist
TheSpecialist 27.02.2006 um 14:06:10 Uhr
Goto Top
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