Я пытаюсь написать пакетный файл, который копирует папки из одной папки в другую, но только если они существуют в третьей папке.
Звучит запутанно. Попробую еще раз.
У меня есть следующие 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
Поддерживающие ресурсы
- ВЫЗОВ
-
/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.