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先生-有什么问题?我根据我使用的一个脚本写了这篇文章,没有任何问题(尽管我在发表之前对它进行了一些编辑)。因此,我很好奇,在我的人生道路上,到底潜藏着什么样的问题:)