Batch file 将*.dat从不同目录复制到镜像目录
我有一个具有以下结构的目录:Batch file 将*.dat从不同目录复制到镜像目录,batch-file,dos,Batch File,Dos,我有一个具有以下结构的目录: C:\Directory1\ sub1\ sub2\ sub3\ somefilename.txt someotherfile.txt 在每个sub*\中都有.dat文件,我需要将这些文件复制到另一个目录中,并沿找到它们的目录名进行镜像。因此,如果我找到C:\Directory1\sub2\file.dat,我会将其复制到C:\mirror\sub2\file.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
(请注意,这只是我玩的一个代码示例,我知道它不起作用)
无论如何,经过几天的努力,我还是不知道怎么做。有机会帮忙吗?
代码是赞赏的
谢谢 这对我很有用:
@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
但是请记住,如果路径包含不寻常的字符(例如=
和一些我现在记不起来的字符),它可能会中断。这对我很有用:
@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
但是请记住,如果路径包含不寻常的字符(例如
=
和一些我现在记不起来的字符),它可能会中断。使用以下XCOPY命令:
xcopy "c:\directory1\*.dat" "c:\mirror\" /s /v /c /y
如果不想看到屏幕上显示的文件名,请将“/q”添加到选项列表中
“/s”将从子文件夹复制文件。如果子文件夹不存在,将创建它们
“/v”强制验证。没必要,但有这样的平静心情很好
“/c”命令XCOPY在遇到任何问题时继续处理其余的文件——换句话说,批处理文件不会因为只复制了“部分”文件而突然停止。XCOPY将尽可能复制所有内容
“/y”禁止覆盖现有文件的提示。使用以下XCOPY命令:
xcopy "c:\directory1\*.dat" "c:\mirror\" /s /v /c /y
如果不想看到屏幕上显示的文件名,请将“/q”添加到选项列表中
“/s”将从子文件夹复制文件。如果子文件夹不存在,将创建它们
“/v”强制验证。没必要,但有这样的平静心情很好
“/c”命令XCOPY在遇到任何问题时继续处理其余的文件——换句话说,批处理文件不会因为只复制了“部分”文件而突然停止。XCOPY将尽可能复制所有内容
“/y”将取消覆盖现有文件的提示。谢谢。这就是我运行脚本时发生的情况(将目录和*.cpp更改为*.dat之后)。它会为C:\上的每个目录创建镜像,但每个目录都是在C:'上创建的,而不是在彼此内部,并且在创建目录时会忽略TargetDir。最后,它将.dat文件复制到TargetDir,而不在TargetDir中创建镜像dir修复了它!谢谢你的帮助@Aleph先生-有什么问题?我根据我使用的一个脚本写了这篇文章,没有任何问题(尽管我在发表之前对它进行了一些编辑)。所以,我很好奇,在我的人生道路上,到底潜藏着什么样的问题:)谢谢。这就是我运行脚本时发生的情况(将目录和*.cpp更改为*.dat之后)。它会为C:\上的每个目录创建镜像,但每个目录都是在C:'上创建的,而不是在彼此内部,并且在创建目录时会忽略TargetDir。最后,它将.dat文件复制到TargetDir,而不在TargetDir中创建镜像dir修复了它!谢谢你的帮助@Aleph先生-有什么问题?我根据我使用的一个脚本写了这篇文章,没有任何问题(尽管我在发表之前对它进行了一些编辑)。因此,我很好奇,在我的人生道路上,到底潜藏着什么样的问题:)