Nadja84: DOS/batch: Nach bestimmtenDateien auf allen externen Laufwerken suchen und kopieren

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

  1. 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

  2. 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.

    1. 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

      1. 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.

  3. 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

    1. 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

      1. 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

        1. sorry. ich bin glaube ich zu blöd 😟 welche zeilen sind das in dem link?

          1. 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

  4. 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
    1. Hallo,

      und wenn du jetzt noch erläuterst, warum Nadja statt Photoshop-Dateien lieber Outlook-Datei kopieren soll…

      Gruß
      Kalk

      1. 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

        --
        sumpsi - posui - clusi