2010-12-15 2 views
1

У меня есть каталог со следующей структурой:копирования * .dat из разных каталогов в каталог зеркала

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 

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

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

спасибо!

ответ

1

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

@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

Спасибо. Это произошло, когда я запустил скрипт (после изменения каталогов и * .cpp до * .dat). Он создает зеркало каждого каталога в C: \, но каждый каталог создается на C :, не внутри друг друга, и он игнорирует TargetDir при создании dirs. Наконец, он копирует файл .dat в TargetDir без создания зеркальных зеркал внутри TargetDir – 2010-12-15 15:17:14

0

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

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

Если вы не хотите, чтобы увидеть имена файлов, отображаемых на экране оных «» в списке опций.

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

«/v» силы проверки. Не нужно, но приятно иметь это душевное спокойствие.

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

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

Смежные вопросы