Цикл FOR в пакетном файле для копирования папок только в том случае, если они существуют в другой папке

Цикл FOR в пакетном файле для копирования папок только в том случае, если они существуют в другой папке

Я пытаюсь написать пакетный файл, который копирует папки из одной папки в другую, но только если они существуют в третьей папке.

Звучит запутанно. Попробую еще раз.

У меня есть следующие 3 папки:

  • Обновления
  • Приложения
  • Предыдущие версии

Перед обновлением \Applicationsструктуры подпапок со \Updatesструктурой подпапок [new version], мне нужно скопировать \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

Поддерживающие ресурсы

  • ВЫЗОВ
  • XКОПИРОВАТЬ

      /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.
    

Связанный контент