我有一个具有以下结构的目录:
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
(请注意这只是我正在玩的代码的示例,我知道它不起作用)
无论如何,在尝试了几天之后,我仍然不知道该怎么做。有任何帮助的机会吗? 代码表示赞赏。
谢谢!
答案 0 :(得分: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
请记住,如果路径包含不常见的字符(例如=
和其他一些我现在不记得的话),它可能会中断。
答案 1 :(得分:0)
使用以下XCOPY命令:
xcopy "c:\directory1\*.dat" "c:\mirror\" /s /v /c /y
如果您不想看到屏幕上显示的文件名,请在选项列表中添加“ / q ”。
' / s '将从子文件夹中复制文件。如果子文件夹尚不存在,则会创建它们。
' / v '强制验证。没有必要,但有这种安心是很好的。
' / c '强制XCOPY在遇到任何问题时继续使用其他文件 - 换句话说,只有'某些文件才会突然停止批处理文件'复制了您的文件。 XCOPY将复制所有可能的内容。
“ / y ”会禁止提示覆盖现有文件。