2010-12-15 15 views
1

ich ein Verzeichnis mit der folgenden Struktur:Kopieren * .dat aus verschiedenen Verzeichnissen zu einem Spiegel-Verzeichnis

C:\Directory1\ 
     sub1\ 
     sub2\ 
     sub3\ 
     somefilename.txt 
     someotherfile.txt 

In jedem sub*\ gibt es .dat Dateien, die ich in ein anderes Verzeichnis auf dem Weg Spiegelung kopieren müssen die Verzeichnisname, wo sie gefunden wurden. Wenn ich also C:\Directory1\sub2\file.dat finde, würde ich das in C:\mirror\sub2\file.dat kopieren und so weiter.

Ich habe versucht, verschiedene Kombinationen von Dingen ähnlich wie

for /R %SRC_DIR% %%f in (*.dat) do copy "%%f" %BACKUP_DIR%\%%~nf%%~xf 

(bitte beachten Sie, das nur ein Beispiel für Code, mit dem ich spielen, ich wissen es nicht funktioniert)

sowieso, nachdem ich ein paar Tage versucht habe, weiß ich immer noch nicht, wie ich es machen soll. Jede Chance auf Hilfe? Code wird geschätzt.

danke!

Antwort

1

Dies funktioniert für mich:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 

set SourceDir=c:\source\dir 
set TargetDir=d:\target\path 
set FileMask=*.cpp 

for /r "%SourceDir%" %%F in (%FileMask%) do (
    call :ReplacePrefix target_path "%%~F" "%SourceDir%" "%TargetDir%" 
    call :CopyFile "%%~F" "!target_path!" 
) 

endlocal 
goto :EOF 


:CopyFile %1=source_path %2=target_path 
    mkdir %~dp2 
    copy %1 %2 
    goto :EOF 


:ReplacePrefix %1=result_var_name %2=string %3=replace_what %4=replace_with 
    rem a question mark is prepended to ensure matching only at the beginning of the string 
    set rp_value=?%~2 
    call :DoIt "set %1=%%rp_value:?%~3=%~4%%" 
    goto :EOF 


:DoIt %1=cmd 
    %~1 
    goto :EOF 

Beachten Sie aber, dass es brechen kann, wenn Pfade ungewöhnliche Zeichen (wie = und einige andere, die ich jetzt nicht erinnern kann) enthalten.

+0

Danke. Dies ist beim Ausführen des Skripts passiert (nachdem die Verzeichnisse und * .cpp in * .dat geändert wurden). Es erstellt eine Spiegelung jedes Verzeichnisses in C: \, aber jedes Verzeichnis wird auf C: erstellt, nicht ineinander und ignoriert TargetDir beim Erstellen der Verzeichnisse. Schließlich kopiert es die .dat-Datei nach TargetDir, ohne die Spiegel-Verzeichnisse in TargetDir zu erstellen. –

+0

hat es behoben! Danke für die Hilfe! –

+0

@Mr Aleph - was war das Problem? Ich habe diesen Beitrag auf einem Skript basiert, das ich ohne Probleme benutze (obwohl ich es vor dem Posten etwas bearbeitet habe). Also bin ich gespannt was für ein Problem sich auf meinem Weg lauern mag :) – atzz

0

Verwenden Sie den folgenden Befehl XCOPY:

xcopy "c:\directory1\*.dat" "c:\mirror\" /s /v /c /y 

Wenn Sie nicht wollen, die Dateinamen auf dem Bildschirm Add ‚/q‘ in die Liste der Optionen angezeigt sehen.

Die '/s' kopiert Dateien aus Unterordnern. Wenn die Unterordner nicht bereits vorhanden sind, werden sie erstellt.

Die '/v' erzwingt die Verifizierung. Nicht notwendig, aber es ist schön, diese Ruhe zu haben.

Die ‚/c‘ Kräfte XCOPY mit dem Rest der Dateien fortzusetzen, wenn es irgendwelche Probleme stößt - in anderen Worten, Ihre Batch-Datei nicht abrupt mit nur halt ‚einig‘ Ihren Dateien kopiert . XCOPY kopiert alles, was es kann.

Die '/y' unterdrückt die Aufforderung, eine vorhandene Datei zu überschreiben.

Verwandte Themen