我正在尝试编写一个批处理文件,将文件夹从一个文件夹位置复制到另一个文件夹位置,但前提是它们存在于第三个文件夹中。
这听起来令人困惑,我会再试一次。
我有以下 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。
我需要它将子文件夹从 复制AppsRoot
到PVerRoot
,但前提是它们存在于UpdtRoot
。我只需要它复制文件夹和子文件夹,因此根本没有文件。
答案1
我已经包含了一个批处理脚本,它应该完成您所解释的操作,即将所有子文件夹从目录递归复制/Applications
到/Previous Versions
目录,但前提是/Updates
目录中存在相同的“要复制”目录。
值得注意的项目
确保中的字符与目录完整路径(包括结尾的反斜杠)相匹配
SET NewCopyDir=%CopyDir:C:\Test\Apps\=%
。这是将其解析出来以附加到和目录末尾的逻辑,因此命令会相应地复制这些目录。C:\Test\Apps\
Applications
/Updates
/Previous Versions
XCOPY
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