копирование * .dat из разных каталогов в зеркальный каталог - PullRequest
1 голос
/ 15 декабря 2010

У меня есть каталог со следующей структурой:

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

Внутри каждого sub*\ есть .dat файлы, которые мне нужно скопировать в другое зеркальное отображение каталога по пути к имени каталога, в котором они были найдены. Поэтому, если я найду C:\Directory1\sub2\file.dat, я скопирую это в C:\mirror\sub2\file.dat и т. Д.

Я пробовал несколько комбинаций вещей, похожих на

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

(обратите внимание, это всего лишь пример кода, с которым я играл, я знаю, это не работает)

во всяком случае, после нескольких попыток я все еще не знаю, как это сделать. Есть ли шанс помочь? Код приветствуется.

спасибо!

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Это работает для меня:

@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

Имейте в виду, что он может сломаться, если пути содержат необычные символы (такие как = и некоторые другие, которые я сейчас не могу вспомнить).

0 голосов
/ 19 декабря 2010

Используйте следующую команду XCOPY:

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

Если вы не хотите, чтобы имена файлов отображались на экране, добавьте ' / q ' в список параметров.

/ s копирует файлы из подпапок. Если подпапки еще не существуют, они будут созданы.

' / v ' принудительно проверяет. Не обязательно, но приятно иметь это спокойствие.

' / c ' заставляет XCOPY продолжить работу с остальными файлами, если возникнут какие-либо проблемы - другими словами, ваш пакетный файл не остановится внезапно, только с ' some из ваших файлов скопированы. XCOPY скопирует все, что может.

' / y ' подавляет запрос на перезапись существующего файла.

...