如何使用批处理文件将特定子文件夹复制到备份文件夹中的新文件夹中?

时间:2017-11-02 10:14:53

标签: batch-file xcopy

我是一个初学者,我需要一些帮助,用服务器上的文件备份一些文件夹。

我需要将一些文件夹复制到本地计算机。

要复制的文件夹是这样的

\\DistantServer\path\RandomFolder\Config\old
\\DistantServer\path\Another Random Folder\Config\old
...

应将这些旧文件夹复制到:

D:\Backup\RandomFolder\old
D:\Backup\Another Random Folder\old

我尝试了一些代码,但我只是有错误。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

此批处理文件应该适用于该任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFolder=\\DistantServer\path"
set "TargetFolder=D:\Backup"

for /D %%I in ("%SourceFolder%\*") do (
    if exist "%%I\Config\Old\" (
        rd /Q /S "%TargetFolder%\%%~nxI\old" 2>nul
        %SystemRoot%\System32\xcopy.exe "%%I\Config\Old" "%TargetFolder%\%%~nxI\old\" /C /E /H /I /K /Q /R /Y >nul
    )
)

endlocal

命令 FOR 在源文件夹中搜索环境变量SourceFolder定义的非隐藏子文件夹。找到的每个子文件夹都分配有完整路径,而不是以反斜杠结尾,并且从不用双引号括起来循环使用I引用的变量%%I

命令 IF 检查源文件夹的当前子文件夹中是否存在子文件夹Config\old。如果不包含子文件夹Config\old,则会忽略找到的子文件夹。

当源文件夹的当前子文件夹中存在Config\old时,命令 RD 首先将所有子文件夹静默删除与其存在无关的相应目标文件夹,以确保完成下一个副本的结果在1:1文件夹中复制。如果目标文件夹在复制完成之前很可能永远不存在,或者希望目标文件夹的现有内容与源文件夹的当前内容合并,则可以删除 RD 命令。

%%~nxI引用源文件夹中没有路径的当前子文件夹,即没有使用环境变量SourceFolder定义的文件夹路径。

命令 XCOPY 将源文件夹的当前子文件夹中的整个文件夹Config\old复制到环境变量old定义的目标文件夹中的子文件夹TargetFolder。如果目标规范尚未存在,则由 XCOPY 自动创建适当目标文件夹的整个目录结构,因为目标规范的结尾是反斜杠,表明目标字符串指定的 XCOPY 目录。

注意:上面没有命令 RD 的整个代码也可以优化到单个命令行。

@for /D %%I in ("\\DistantServer\path\*") do @if exist "%%I\Config\Old\" %SystemRoot%\System32\xcopy.exe "%%I\Config\Old" "D:\Backup\%%~nxI\old\" /C /E /H /I /K /Q /R /Y >nul

带命令 RD 的单一命令行:

@for /D %%I in ("\\DistantServer\path\*") do @if exist "%%I\Config\Old\" rd /Q /S "D:\Backup\%%~nxI\old" 2>nul & %SystemRoot%\System32\xcopy.exe "%%I\Config\Old" "D:\Backup\%%~nxI\old\" /C /E /H /I /K /Q /R /Y >nul

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rd /?
  • set /?
  • setlocal /?
  • xcopy /?

另请阅读Microsoft有关Using Command Redirection Operators的文章,了解>nul2>nul的说明。并阅读Single line with multiple commands using Windows batch file上的答案,了解最后一批代码中使用的运算符&的解释(带有 RD 的单一命令行)。