sysroy
Goto Top

Dateien mit von Leerzeichen befreiten Pfaden kopieren

Hallo zusammen,

ich brauche bitte Eure Hilfe.

Im Vorhinein: Die Batch soll auf Windows XP - PC's und Windows 2003 Server laufen.

Es geht um folgendes:

Ich brauche eine Batch, die ein Verzeichnis (z.B. d:\eigen Daten) komplett in ein neues Verzeichnis kopiert und dabei sämtliche Leerzeichen aus den Pfaden und Dateinamen entfernt. Quelle und Ziel sollten flexibel sein und als Parameter beim Aufruf übergeben werden können (Beispiel: DelSpaces.cmd "d:\eigene Daten" d:\neueDaten)

Beispielsweise sollte die Datei

d:\eigene Daten\Mein Test\Test der ersten Auflösung.bmp

dann unter

d:\neueDaten\MeinTest\TestdererstenAuflösung.bmp

oder (plus dem alten Pfad, wenn das einfacher ist)

d:\neueDaten\d_\eigeneDaten\MeinTest\TestdererstenAuflösung.bmp

wiederzufinden sein.

Kann mir jemand dabei helfen?

Content-ID: 120935

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

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

bastla
bastla 21.07.2009 um 12:10:58 Uhr
Goto Top
Hallo sysroy und willkommen im Forum!

Kaum getestet etwa so:
@echo off & setlocal
set "Quelle=D:\Eigene Daten"  
set "Ziel=D:\neueDaten"  

for /f "delims=" %%i in ('dir /s /b /a-d "%Quelle%"') do set "Pfad=%%i" & call :CopyFile "%%i"  
goto :eof

:CopyFile
call set "PfadNeu=%%Pfad:%Quelle%=%%"  
set "PfadNeu=%PfadNeu: =%"  
xcopy %1 "%Ziel%%PfadNeu%*">nul  
goto :eof
Um Quelle und Ziel als Aufrufparameter verwenden zu können, einfach die Zeilen 2 und 3 durch
set "Quelle=%~1"
set "Ziel=%~2"
ersetzen. Der Quellpfad darf übrigens nicht mit einem "\" enden.

Grüße
bastla
sysroy
sysroy 21.07.2009 um 13:39:28 Uhr
Goto Top
Hallo Bastla,

funktioniert hervorragend!

Für mich zum Verständnis:
":CopyFile" kehrt wegen "Call" und dem "goto :eof " zum Aufrufsort in der For - Schleife zurück, oder?

Zweite Unklarheit:
09: call set "PfadNeu=%%Pfad:%Quelle%=%%" - warum CALL?

Vielen Dank erstmal
sysroy
bastla
bastla 21.07.2009 um 13:47:54 Uhr
Goto Top
Hallo sysroy!
Für mich zum Verständnis:
":CopyFile" kehrt wegen "Call" und dem "goto :eof " zum Aufrufsort in der For - Schleife zurück, oder?
Ja; würde es auch ohne "goto :eof", wenn danach kein weiterer Batch-Code folgt, ist so aber "sauberer".

Zweite Unklarheit:
09: call set "PfadNeu=%%Pfad:%Quelle%=%%" - warum CALL?
Da zuerst die Variable %Quelle% aufgelöst werden muss, könnte entweder "delayedExpansion" verwendet oder eben die Verarbeitung in einer weiteren CMD-Instanz (aufgerufen durch "call") vorgenommen werden - durch die doppelten %-Zeichen um die Variable "Pfad" herum wird diese als Variable übergeben, während für %Quelle% bereits der Wert eingesetzt wird, also im Prinzip:
set "PfadNeu=%Pfad:D:\Eigene Daten=%"
Grüße
bastla
sysroy
sysroy 21.07.2009 um 13:52:17 Uhr
Goto Top
Hallo Bastla,

Trick gelernt (Call) - prima.

Letzt Frage:

Was ist der Unterschied in der Parameterauswertung zwischen <set "Quelle=%~1"> mit Tilde und
<set "Quelle=%1"> ohne Tilde?

Danke
sysroy
bastla
bastla 21.07.2009 um 13:55:50 Uhr
Goto Top
Was ist der Unterschied in der Parameterauswertung zwischen <set "Quelle=%~1"> mit Tilde und
<set "Quelle=%1"> ohne Tilde?
Mit der Schreibweise
set "Quelle=%~1"
ist sicher gestellt, dass %1 keine umgebenden Anführungszeichen enthält - wenn ich solche brauche, setze ich sie später im Batch um %Quelle% herum ...

Grüße
bastla
sysroy
sysroy 21.07.2009 um 14:11:07 Uhr
Goto Top
Und ich habe mich für diesen Zweck bis jetzt damit "geplagt":

:: die " " aus den Parametern entfernen
set pt1=%1
set pt1=%pt1:"=%


Frage hat sich gelohnt.... face-smile

Nochmal vielen Dank für die schnelle und gute Hilfe

Grüße
sysroy