DOS/batch: Nach bestimmtenDateien auf allen externen Laufwerken suchen und kopieren
Nadja84
- dos
Hallo liebe Community,
ich hoffe Ihr könnt mir helfen. Ein Freund aus der Uni hat mir ein batch-skript (ich hoffe das ist richtig geschrieben) geschrieben. Es soll nach bestimmten Dateiendungen suchen und diese in mein lokales Stammverzeichnis kopieren.
Das funktioniert auch, allerdings will ich die Suche auf ALLE Laufwerke anwenden und nicht nur auf beispielsweise e:\
Weiß jemand wie man dieses Skript dememntsprechend anpassen kann?
for /f %%e in ('dir /s /b E:\*.psd') do copy "%%e" C:\test>nul && echo %date% "%%e" Dateien wurden in das Zielverzeichnis kopiert >>c:\test
Vielen lieben Dank für eure Hilfe!
LG
Naddi
hi,
wie eine Schleife aussieht, steht ja schon da. Da wäre nur noch eine äußere Schleife drumherum zu legen die über die Laufwerke iteriert.
Über den Umgang mit doppelten Dateinamen im Zielverzeichnis würde ich nachdenken. MfG
Tach!
Weiß jemand wie man dieses Skript dememntsprechend anpassen kann?
In Anbetracht der Tatsache, dass du das vermutlich nicht selbst kannst, wäre es am einfachsten, die Zeile so oft zu kopieren, wie du Laufwerke hast, und die Buchstaben anzupassen.
dedlfix.
Lieber Dedlfix,
vielen lieben Dank für deine Nachricht.
Okay, verstehe das soweit. Könntest Du mir noch ein Beispiel nennen, wie diese kopierte Zeile dann aussehen würde?
LG
Naddi
Tach!
Okay, verstehe das soweit. Könntest Du mir noch ein Beispiel nennen, wie diese kopierte Zeile dann aussehen würde?
Genauso wie die bisherige, nur dass statt e: eben jeweils ein anderer Laufwerksbuchstabe da steht.
dedlfix.
Hallo @Nadja84,
for /f %%e in ('dir /s /b E:\*.psd') do copy "%%e" C:\test>nul && echo %date% "%%e" Dateien wurden in das Zielverzeichnis kopiert >>c:\test
Im geklammerten Ausdruck ('dir /s /b E:\*.psd')
steht dein Laufwerk E. An dieser Stelle musst du es durch den Namen des gewünschten Laufwerks ersetzen, für D z.B. ('dir /s /b D:\*.psd')
, also „in Summe“
for /f %%e in ('dir /s /b D:\*.psd') do copy "%%e" C:\test>nul && echo %date% "%%e" Dateien wurden in das Zielverzeichnis kopiert >>c:\test
Bedenke allerdings den Einwand von pl.
Viele Grüße
Robert
Hallo Robert!
Vielen Dank. Meinst du so?
for /f %%e in ('dir /s /b E:*.psd')('dir /s /b F:*.psd')('dir /s /b G:*.psd') do copy "%%e" C:\test>nul && echo %date% "%%e" Dateien wurden in das Zielverzeichnis kopiert >>c:\test
Hallo @Nadja84,
Meinst du so?
for /f %%e in ('dir /s /b E:*.psd')('dir /s /b F:*.psd')('dir /s /b G:*.psd') do copy "%%e" C:\test>nul && echo %date% "%%e" Dateien wurden in das Zielverzeichnis kopiert >>c:\test
Nein, denn da fehlen die Backslashes. Und ob diese Verkettung wie gewünscht funktioniert, weiß ich nicht. Aber wenn du diese Zeilen untereinander hängst, sollte es funktionieren.
Viele Grüße
Robert
sorry. ich bin glaube ich zu blöd 😟 welche zeilen sind das in dem link?
Hi,
sorry. ich bin glaube ich zu blöd 😟
So ein Quatsch 😉
welche zeilen sind das in dem link?
Die, in denen kopiert wird. Zufälligerweise ist ein Rahmen darum.
Viele Grüße
Robert
Hallo Nadja84,
wenn es Dich nicht stört, die Ordnerstruktur der Quelle in C:\test wiederzufinden, kannst Du das Problem - für ein Laufwerk - mit einem Einzeiler lösen:
xcopy E:*.pst C:\test /y /s /i >>c:\test\copylog
Die Parameter von xcopy bedeuten:
/y - keine Bestätigung beim Überschreiben anfordern /s - rekursiv die Unterverzeichnisse durchsuchen /i - wenn c:\test noch nicht existiert, wird es als Ordner angelegt. Falls es bereits eine DATEI C:\test gibt, wird eine Fehlermeldung angezeigt.
Wenn Du keine Verzeichnisse im Zielordner haben willst, musst Du die Überprüfung des /i Parameters erstmal selbst durchführen. Beachte den Unterschied zwischen if exist c:\test\
und if exist c:\test
- ersteres testet gezielt auf ein Verzeichnis, letzteres auf einen Verzeichniseintrag (Datei oder Verzeichnis).
if not exist C:\test\ (
if exist c:\test (
echo Es existiert bereits eine Datei C:\test, Ordner c:\test kann nicht angelegt werden
goto :eof
)
md c:\test
)
Die Klammern erlauben es Dir, in Batches mehrzeilige Blockstrukturen zu bauen.
Es ist auch nicht nötig, mit for /f einen externen Befehl zum Finden der gewünschten Dateien aufzurufen, das kann for ganz allein.
for /r E:\ %%e in (*.pst) do (
copy %%e c:\test >nul
echo %date% %time% "%%e% kopiert >>C:\test\logfile
)
Die Angabe von >>c:\test\logfile
ist WICHTIG. C:\test
ist ein Ordner, und an den kannst Du keinen Text anhängen. >>c:\test
als Ausgabeziel für echo führt zu "Zugriff verweigert".
Und wenn Du es für mehrere Laufwerke willst, dann musst Du das selbst steuern. Es geht aber leider nur mit try and error. Problem sind ggf die Laufwerke mit Wechseldatenträgern. Die existieren, aber wenn Du sie ansprechen willst und nichts drin liegt, kann es einen Fehler geben oder die Aufforderung, einen Datenträger einzulegen.
for %%a in (d e f g h i j k j m n o p q r s t u v w x y z) do (
if exist %%a: (
for /r %%a:\ %%e in (*.pst) do (
copy %%e c:\test >nul
echo %date% %time% "%%e% kopiert >>C:\test\logfile
)
)
)
goto :eof
A: und B: habe ich weggelassen, Diskettenlaufwerke hat heute keiner mehr.
Beachte, dass ich auch Laufwerk C: ausgenommen habe. C: habe ich entfernt, weil er sonst ein existierendes C:\test auf sich selbst kopieren würde, das hagelt dann Fehlermeldungen. Du müsstest vor dem copy abfragen, ob der gefundene Dateiname mit C:\test\ beginnt.
Eventuell willst Du auch noch andere Laufwerke ausnehmen. Wenn da Netzwerklaufwerke bei sind, die viel Inhalt haben, kann der Scan sehr lange dauern.
Um es mit JJ Abrams zu sagen: This is not your Daddy's Batch Language.
Rolf
Hallo,
und wenn du jetzt noch erläuterst, warum Nadja statt Photoshop-Dateien lieber Outlook-Datei kopieren soll…
Gruß
Kalk
Hallo Tabellenkalk,
ganz einfach: Outlook habe ich, Photoshop nicht. Daher schlug meine mentale Autokorrektur zu. Ich bin sicher, dass Nadja das rückübersetzen kann.
** duck und weg **
Rolf