Вот прокомментировал пакетный код для выполнения этой задачи:
@echo off
setlocal
rem Define source and backup path.
set "SourcePath=C:\machines\models"
set "BackupPath=E:\backup"
rem Get current date in format YYYY-MM-DD independent on local date format.
for /F "skip=1 tokens=1 delims=." %%T in ('%SystemRoot%\System32\wbem\wmic.exe OS get localdatetime') do set LocalDateTime=%%T & goto ReformatDate
:ReformatDate
set "YearMonthDay=%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2%
rem For each subfolder in source path check if there is a subfolder "defects".
rem If subfolder "defects" exists, copy all files and subfolders of "defects"
rem to the appropriate backup directory with current date and subfolder name
rem in source folder path. Then remove the subfolder "defects" in source
rem folder even if being completely empty to avoid processing this folder
rem again when not being recreated again in the meantime.
for /D %%# in ("%SourcePath%\*") do (
if exist "%%#\defects\*" (
%SystemRoot%\System32\xcopy.exe "%%#\defects\*" "%BackupPath%\%YearMonthDay%\%%~nx#_defects\" /H /I /K /Q /R /S /Y >nul
rd /Q /S "%%#\defects"
)
)
endlocal
Выполнить один раз в окне командной строки wmic OS get localdatetime
, чтобы увидеть, что эта команда выводит, чтобы лучше понять, как текущая дата определяется в формате YYYY-MM-DD
. Было бы быстрее использовать %DATE%
, но формат строки даты %DATE%
зависит от страны, заданной в регионе Windows и языковых настройках, и поэтому требует знания формата строки даты на компьютере, на котором запущен этот командный файл.
Команды XCOPY с используемыми вариантами не создает подкаталог в каталоге резервного копирования, если есть defects
вложенные в директории models
, но в целом defects
подпапок дерева есть не по крайней мере, один файл для копирования.
Альтернативный код с использованием переменной окружения DATE с ожиданием, что расширенная строка даты заканчивается на: MM/DD/YYYY
, например. Tue 05/17/2016
, подробно разъяснено в ответ на:
What does %date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2% mean?
@echo off
setlocal
rem Define source and backup path.
set "SourcePath=C:\machines\models"
set "BackupPath=E:\backup"
rem Get current date in format YYYY-MM-DD depending on local date format.
set "YearMonthDay=%DATE:~-4,4%-%DATE:~-10,2%-%DATE:~-7,2%"
rem For each subfolder in source path check if there is a subfolder "defects".
rem If subfolder "defects" exists, copy all files and subfolders of "defects"
rem to the appropriate backup directory with current date and subfolder name
rem in source folder path. Then remove the subfolder "defects" in source
rem folder even if being completely empty to avoid processing this folder
rem again when not being recreated again in the meantime.
for /D %%# in ("%SourcePath%\*") do (
if exist "%%#\defects\*" (
%SystemRoot%\System32\xcopy.exe "%%#\defects\*" "%BackupPath%\%YearMonthDay%\%%~nx#_defects\" /H /I /K /Q /R /S /Y >nul
rd /Q /S "%%#\defects"
)
)
endlocal
Для понимания используемых команд и как они работают, откройте окно командной строки, выполните там следующие команды, и читать полностью все справочные страницы отображаются для каждого очень осторожно.
echo /?
endlocal /?
for /?
... объясняет также %%~nx#
(имя (и расширение) моделей вложенной).
if /?
rd /?
set /?
setlocal /?
wmic.exe OS get /?
xcopy /?
Смотрите также статью Microsoft о Using command redirection operators, чтобы понять смысл >nul
.
Почему %%~nx#
и не только %%~n#
как папка не имеет расширение файла?
Командный процессор Windows не определяет, является ли строка папкой или именем файла. Все после последнего обратного слэша интерпретируется как имя файла независимо от того, что он в действительности является именем файла или папки. И все после последней точки после последней обратной косой черты в строке интерпретируется как расширение файла, даже если это означает, что имя папки или файла, на которое ссылаются %~n
, является пустой строкой, потому что имя папки/файла начинается с точки и не содержит еще одного как многие «скрытые» файлы на системах * nix, например, .htaccess
. Поэтому %~nx
должен всегда использоваться, если в командной строке требуется цельное имя папки или файла.
Добро пожаловать в SO. Пожалуйста, прочитайте [mcve]. Пожалуйста, введите здесь код. – sjsam
Отмечено с благодарностью sjsam. Поместит некоторый код здесь, как только я буду хорош в пакетном коде :) –
Вы не можете стать _good в пакетном кодировании_, не пытаясь (и ошибаться :)) – JosefZ