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
sumpsi - posui - clusi