CMD / BAT - Помогите определить дату 36 дней назад - PullRequest
0 голосов
/ 20 августа 2009

Каждую ночь мне нужно работать над папкой, которой 36 дней с текущей даты. У меня есть система, которая записывает файлы в ежедневную структуру, как показано ниже. Мне нужно хранить 35 дней на локальном диске, и поэтому каждую ночь мне нужно архивировать данные с 36-го дня. Здесь кикер ... Есть около 2 миллионов файлов в день, поэтому я не могу эффективно сканировать всю папку 2009 года и перемещать только файлы старше 35 дней. Что мне нужно сделать, так это с помощью пакетного скрипта определить путь к папке, которой 36 дней, и затем применить мою логику архива. У меня есть сценарии для определения, но у меня проблемы с выполнением определения до 36 дней. В крайнем случае, я могу использовать Perl, если нет пакетного способа сделать это. --Shawn

Структура папок выглядит следующим образом:

2009\07\01
2009\07\02
2009\07\03
.
.
.
2009\08\01
2009\08\02
2009\08\03

@ РЕДАКТИРОВАТЬ: Великий ответ Хелен имеет меня 99% пути туда. Моя единственная проблема заключается в том, что месяц и день из VBS не дополнены нулем, с которым мне приходится иметь дело в структуре папок. У кого-нибудь есть простой способ дополнить 0, если день или месяц меньше 10?

Вот что я делаю до сих пор:

for /F "tokens=1-3 delims=/" %%x in ('cscript //nologo get36thday.vbs') do (
   SET YYYY=%%z
   SET MM=%%x
   SET DD=%%y)

за исключением того, что% MM% заканчивается 7 вместо 07

Ответы [ 3 ]

1 голос
/ 21 августа 2009

Пакетный параметр довольно злой, вам нужно будет рассчитать, какой месяц он будет основан на цикле выполнения, в котором отсчитываются дни. Я очень рекомендую Perl, так как это будет несколько строк кода

с использованием модуля DateTime из CPAN

http://search.cpan.org/dist/DateTime/lib/DateTime.pm

my $dt = DateTime->now->subtract(days => 36);
0 голосов
/ 29 марта 2013

Если вы пришли сюда с Google, как я:
Чтобы исправить ведущие нули в .vbs, я добавляю ноль впереди и убираю нужные 2 символа.
«0» & «7» -> «07» и «0» & «14» -> «14»

OldDateCode.vbs:

OldDate = DateAdd("d", Date, -36)
DateCode = Year(OldDate) & Right("0" & Month(OldDate), 2) & Right("0" & Day(OldDate), 2)
WScript.Echo DateCode

Я также хотел сохранить первую папку месяца, поэтому я сравниваю последние 2 цифры (день) с "01"
Код VBS для проверки на 1-й день:

If Right(DateCode, 2)="01" then
  WScript.Echo "The 1st:" & vbCrLf & DateCode
Else
  WScript.Echo "Not the 1st:" & vbCrLf & DateCode
End If

CheckDate.bat:

@Echo Off
Set Folder=D:

for /f %%d in ('cscript //nologo OldDateCode.vbs') do set OldDateCode=%%d

If "%OldDateCode:~6,7%"=="01" (
  Echo "Old Backup: %OldDateCode% 1st of the month: keeping..."
) ELSE (
  Echo "Old Backup: %OldDateCode% not the 1st of the month: removing..."
  RD /S /Q "%Folder%\%OldDateCode%"
)
pause

Создайте папку в D: \ с кодом даты 36 дней назад. Поиграйте с -36 и датами.

0 голосов
/ 21 августа 2009

Пакетный способ определения даты будет слишком сложным; для этого гораздо проще использовать скрипт. Извините, нет образца Perl, но есть VBScript:

WScript.Echo DateAdd("d", Date, -36)

Вы можете вызвать этот скрипт из командного файла и прочитать рассчитанную дату следующим образом:

for /f %%d in ('cscript //nologo datediff.vbs') do set dt=%%d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...