只有當資料夾存在於另一個資料夾中時,批次檔 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.
    

相關內容