批处理文件 FOR 循环仅当文件夹存在于另一个文件夹中时才复制文件夹

批处理文件 FOR 循环仅当文件夹存在于另一个文件夹中时才复制文件夹

我正在尝试编写一个批处理文件,将文件夹从一个文件夹位置复制到另一个文件夹位置,但前提是它们存在于第三个文件夹中。

这听起来令人困惑,我会再试一次。

我有以下 3 个文件夹:

  • 更新
  • 应用
  • 之前的版本

\Applications在使用 [新版本] 子文件夹结构更新子文件夹结构之前\Updates,我需要将\Applications子文件夹结构复制到\Previous Versions文件夹中。完成后,需要将Updates子文件夹结构复制到/Applications文件夹中。

我得到了以下信息:

Setlocal EnableDelayedExpansion

Set UpdtRoot=C:\Test\Updates
Set AppsRoot=C:\Test\Apps
Set PVerRoot=C:\Test\Previous Versions

FOR /d %%i IN ("!UpdtRoot!\*.*") DO xcopy "!AppsRoot!\%%~nxi" "!PVerRoot!\%%~nxi\" /e

但这不起作用,它会将所有文件夹从 AppsRoot 复制到 PVerRoot。

我需要它将子文件夹从 复制AppsRootPVerRoot,但前提是它们存在于UpdtRoot。我只需要它复制文件夹和子文件夹,因此根本没有文件。

答案1

我已经包含了一个批处理脚本,它应该完成您所解释的操作,即将所有子文件夹从目录递归复制/Applications/Previous Versions目录,但前提是/Updates目录中存在相同的“要复制”目录。

值得注意的项目

  • 确保中的字符与目录完整路径(包括结尾的反斜杠)相匹配SET NewCopyDir=%CopyDir:C:\Test\Apps\=%。这是将其解析出来以附加到和目录末尾的逻辑,因此命令会相应地复制这些目录。C:\Test\Apps\Applications/Updates/Previous VersionsXCOPY

  • Root名称的部分是从目录的变量中取出的,SET但这并不重要,但我将它们缩短,以使它在脚本逻辑中看起来更清晰一些。

批处理脚本

@ECHO ON

SET "Updt=C:\Test\Updates"
SET "Apps=C:\Test\Apps"
SET "PVer=C:\Test\previous Versions"
IF NOT EXIST "%Updt%" MD "%Updt%"
IF NOT EXIST "%Apps%" MD "%Apps%"
IF NOT EXIST "%PVer%" MD "%PVer%"

FOR /D %%S IN ("%Apps%\*") DO (
    CALL :Routine "%%~S"
)
GOTO :EOF

:Routine
SET CopyDir=%~1
SET NewCopyDir=%CopyDir:C:\Test\Apps\=%
IF EXIST "%Updt%\%NewCopyDir%" XCOPY /E /T "%Apps%\%NewCopyDir%" "%PVer%\%NewCopyDir%\"
GOTO :EOF

支持资源

  • 称呼
  • 复制

      /E           Copies directories and subdirectories, including empty ones.
                   Same as /S /E. May be used to modify /T.
    
      /T           Creates directory structure, but does not copy files. Does not
                   include empty directories or subdirectories. /T /E includes
                   empty directories and subdirectories.
    

相关内容