batch - Nach Dateien suchen und auf anderen Laufwerk kopieren
homer
- sonstiges
Hallo,
ich möchte mit einer batch Datei in einem Laufwerk von mir nach Dateien suchen, die z.B. "juli" enthalten. Diese Dateien möchte ich dann in einen anderen Ordner kopieren. Das funktioniert hiermit:
@echo off
echo dateien kopieren
pause
for /F "tokens=*" %%f in ('dir /S /b D:\meineordner\*juli*.*') do (
xcopy "%%f" C:\zielordner\ /S
)
pause
Ich möchte aber, dass die Ordnerstruktur in denen die Datei jeweils gefunden wird, im Zielverzeichnis nachgebildet wird.
Beispiel:
Hier wird eine Datei gefunen
D:\meineordner\kosten\sonstiges\umsatz-juli.pdf
Jetzt soll sie hierhin, in der gleichen Ordnerstruktur kopiert werden
C:\zielordner\kosten\sonstiges\umsatz-juli.pdf
Die Dateien aus den Ordnern davor sollen nicht kopiert werden, die Ordnerstruktur soll nur nachgebildet werden.
Wie kann ich das machen?
Mir würde es auch schon helfen zu wissen, wie ich aus %%f den Pfad ohne Laufwerksbustaben erhalte, so dass ich ihn an den Zielpfad hängen kann.
Gruß
Homer
Hallo,
ich möchte mit einer batch Datei in einem Laufwerk von mir nach Dateien suchen, die z.B. "juli" enthalten. Diese Dateien möchte ich dann in einen anderen Ordner kopieren.
Ich möchte aber, dass die Ordnerstruktur in denen die Datei jeweils gefunden wird, im Zielverzeichnis nachgebildet wird.
Beispiel:
Hier wird eine Datei gefunen
D:\meineordner\kosten\sonstiges\umsatz-juli.pdfJetzt soll sie hierhin, in der gleichen Ordnerstruktur kopiert werden
C:\zielordner\kosten\sonstiges\umsatz-juli.pdfDie Dateien aus den Ordnern davor sollen nicht kopiert werden, die Ordnerstruktur soll nur nachgebildet werden.
Hierbei kann Dir find(.exe) aus den UNIX/Linux Tools für Windows helfen. Es liefert dir die Pfad- und Dateinamen zurück. Die kannst Du mit sed(.exe) weiter verarbeiten. sed ist, neben einer Menge sehr(!) nützlichem Zeug (gawk, grep, recode, tr, weget, whois, bc, diff, patch, tar, gzip, unrar ...) auch enthalten.
Mir würde es auch schon helfen zu wissen, wie ich aus %%f den Pfad ohne Laufwerksbuchstaben erhalte, so dass ich ihn an den Zielpfad hängen kann.
Du lässt also find laufen: find.exe -name '*-juli*' -exec DEIN_Skript '{}';
dann wird für jedes 'C:\foo\bar\wasweissich-juli-2013.txt' DEIN_Skript aufgerufen.
Du musst mit sed.exe nur das '[1]:\' durch nichts ('') ersetzen, dann den (Rest-)Pfad weiter in die Ordner zerlegen. Das kann z.B. tr '\' ' ' - dessen Rückgaben Du einer For-Schleife verarbeitest. Problematisch wird das, wenn die Ordner Leerzeichen enthalten...
Für die Ordner von links beginnend prüfen, ob der Ordner existiert, wenn nicht anlegen.
wenn alle durch sind, die Datei kopieren.
Derlei würde ich wohl gleich mit Perl machen. Das gibt es auch für Windoof kostenlos. Es eignen sich auch viele andere Programmiersprachen.
Tip: kopiere die Dateien aus dem Zip UNIX/Linux Tools für Windows in einen der in %PATH% enthaltenen Ordner.
a-zA-Z ↩︎
Hi, vielen Dank schon mal für die ausführliche Hilfe!
Du lässt also find laufen: find.exe -name '*-juli*' -exec DEIN_Skript '{}';
dann wird für jedes 'C:\foo\bar\wasweissich-juli-2013.txt' DEIN_Skript aufgerufen.
Leider scheitere ich schon hier, wenn ich das genauso schreibe funktioniert das nicht. Kannst du das evtl. nur in einem Miniscript mal zeigen?
Ich hatte es auch so probiert
@echo off
echo dateien kopieren
pause
find.exe -name '*-juli*' -exec dSkript '{}'\;
:dSkript
for /F "tokens=*" %%f in ('dir /S /b D:\meineordner\kosten\sonstiges\*juli*.pdf') do (
xcopy "%%f" C:\cmd-test\ /S
)
pause
Gruß
Homer
gudn tach!
Du lässt also find laufen: find.exe -name '*-juli*' -exec DEIN_Skript '{}';
dann wird für jedes 'C:\foo\bar\wasweissich-juli-2013.txt' DEIN_Skript aufgerufen.
Leider scheitere ich schon hier, wenn ich das genauso schreibe funktioniert das nicht.
welches "find" benutzt du? das, welches bei windows dabei ist, oder das von Joerg vorgeschlagene? ich frage nur sicherheitshalber.
Ich hatte es auch so probiert
find.exe -name '*-juli*' -exec dSkript '{}';
:dSkript
das wird - vermute ich - nicht funzen, da dSkript ein richtiges script (z.b. ein neues batchscript) sein muesste und nicht nur eine sprungmarke sein duerfte.
ich wuerde fuer solche aufgaben perl nehmen und empfehlen (wieder andere wuerden wohl heutzutage python nehmen).
prost
seth
Hallo Homer,
> @echo off
> echo dateien kopieren
> pause
> for /F "tokens=*" %%f in ('dir /S /b D:\meineordner\*juli*.*') do (
> xcopy "%%f" C:\zielordner\ /S
> )
> pause
Mir würde es auch schon helfen zu wissen, wie ich aus %%f den Pfad ohne Laufwerksbustaben erhalte, so dass ich ihn an den Zielpfad hängen kann.
for /? in der DOS-Box hilft da. Ziemlich am Ende steht, wie man an Teile des Pfads rankommt. Für den Ordner ohne Laufwerk ist das %%~pf, dein xcopy-Befehl müßte also so aussehen damit die Ordner erstellt werden:
xcopy "%%f" "C:\zielordner%%~pf"
gudn tach!
for /? in der DOS-Box hilft da. Ziemlich am Ende steht, wie man an Teile des Pfads rankommt. Für den Ordner ohne Laufwerk ist das %%~pf, dein xcopy-Befehl müßte also so aussehen damit die Ordner erstellt werden:
xcopy "%%f" "C:\zielordner%%~pf"
auf <http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx?mfr=true> und <http://en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde> gibts weitere infos dazu.
das urspruengliche problem wird damit aber nicht 100%ig geloest, sondern es kaeme hierbei ein zusaetzliches (nicht gewuenschtes) unterverzeichnis im komplettpfad hinzu. das zu loeschen, geht aber auch, sei es durch textersetzung
set newvarname=%varname:needle=replacement%
oder substring-bildung a la
set newvarname=%varname:~begin%
bzw.
set newvarname=%varname:~begin,end%
prost
seth
Hi
xcopy "%%f" "C:\zielordner%%~pf"
>
1000 Dank, das hat super funnktioniert!
gruß
homer