homer: batch - Nach Dateien suchen und auf anderen Laufwerk kopieren

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

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

    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.

    Hinweis:

    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.

    Jörg Reinholz


    1. a-zA-Z ↩︎

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

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

  2. 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"  
    
    
    1. 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
      
    2. Hi

      xcopy "%%f" "C:\zielordner%%~pf"

      
      >   
        
      1000 Dank, das hat super funnktioniert!  
        
      gruß  
      homer