Как скопировать несколько папок в новый каталог с указанием текущего года и месяца в имени каталога?

У меня есть две папки под названием Roads а также Kerbs, Я хочу скопировать обе папки (сохраняя имя папки) в резервную папку с текущим годом / месяцем в качестве имени папки.

Пример: имя папки резервной копии будет 201812 и если я открою две папки Roads а также Kerbs будет под ним. Я хочу создать командный файл с xcopy сделать эту функцию для меня.

Текущий код открывает только папку с именем 01 и только копирует содержимое папки. Я хочу месяц / год, а затем две папки под ним с их содержанием.

@echo off
set curr_date=%DATE:~10,2%-%DATE:~7,2%
mkdir "C:\Roads_backup\%curr_date%"
xcopy "C:\Roads" "C:\Roads_backup\%curr_date%" /D/S/H/V/C/F/K

Как скопировать две папки в новый каталог с указанием текущего года и месяца в имени каталога?

1 ответ

Решение

CMD ужасен в даты

Для любой сложности, я бы не стал использовать %DATE% а также %TIME% в пользу не изобретать велосипед. PowerShell поставляется в стандартной комплектации (хотя и с разными версиями) для каждой платформы Windows, выпущенной за последние 10 лет, и использует достаточно полнофункциональную библиотеку даты и времени.

FOR /F "usebackq" %%d IN (`PowerShell -NoProfile -ExecutionPolicy Bypass -Command "Get-Date -UFormat '%%Y%%m'" ^<NUL`) DO SET "STAMP=%%~d"

Это установит envvar STAMP в форматированную строку даты, контролируемую -UFormat параметр. Неважно, какой язык или язык компьютера, и он будет работать на чем угодно с PowerShell ( стандарт для Win7 и выше).

Это немного многословно, но вы также можете легко скопировать / вставить его без необходимости пересчитывать все смещения строк, необходимые для разделения значений в %DATE% а также %TIME% каждый раз, когда вы хотите отформатировать текущую дату.

Вы также можете сделать то же самое с датами, отличными от текущей, а также вычесть временные интервалы из текущей даты, чтобы получить такие вещи, как "неделю назад" - что-то мучительно болезненное делать только с чистыми партиями /CMD.

Копирование каталогов

Вы, вероятно, захотите использовать /I (target name is dir) параметр xcopy, а также указать имя целевого каталога для использования (в противном случае xcopy поместит содержимое Roads в целевой каталог без создания каталога с именем Roads).

xcopy "C:\Roads" "C:\Roads_backup\%STAMP%\Roads" /I/D/S/H/V/C/F/K

Я не уверен, если вам нужно /D если вы всегда будете создавать новые каталоги, так как это означает "копировать только новые файлы".

Другие вопросы по тегам