Как добавить дату в пакетных файлах - PullRequest
42 голосов
/ 14 мая 2009

У меня есть следующая строка в командном файле (которая работает на старом Windows 2000 поле):

7z a QuickBackup.zip *.backup

Как добавить дату в файл QuickBackup.zip. Поэтому, если бы я запускал пакетный файл сегодня, в идеале, файл будет QuickBackup20090514.zip.

Есть ли способ сделать это?

Ответы [ 14 ]

57 голосов
/ 15 мая 2009

Ответ Бернхарда потребовал некоторой доработки для меня, потому что переменная окружения% DATE% находится в другом формате (как было отмечено в другом месте). Также пропала тильда (~).

Вместо:

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:0,2%

Я должен был использовать:

set backupFilename=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%

для формата даты:

c: \ Scripts> echo% DATE%

Чт 14.05.2009

12 голосов
/ 27 мая 2009

Если вы знаете, что ваши региональные настройки не изменятся, вы можете сделать это следующим образом:

  • если ваш краткий формат даты - дд / мм / гггг:

    SET MYDATE =% DATE: ~ 3,2 %% DATE: ~ 0,2 %% DATE: ~ 8,4%

  • если ваш краткий формат даты - ММ / дд / гггг:

    SET MYDATE =% DATE: ~ 0,2 %% DATE: ~ 3,2 %% DATE: ~ 8,4%

Но нет общего способа сделать это независимо от ваших региональных настроек.

Я не рекомендовал бы полагаться на региональные настройки для всего, что будет использоваться в производственной среде. Вместо этого вам следует рассмотреть возможность использования другого языка сценариев - PowerShell, VBScript, ...

Например, если вы создаете VBS-файл yyyymmdd.vbs в том же каталоге, что и ваш командный файл, со следующим содержимым:

' yyyymmdd.vbs - outputs the current date in the format yyyymmdd
Function Pad(Value, PadCharacter, Length)
    Pad = Right(String(Length,PadCharacter) & Value, Length)
End Function

Dim Today
Today = Date
WScript.Echo Pad(Year(Today), "0", 4) & Pad(Month(Today), "0", 2) & Pad(Day(Today), "0", 2)

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

FOR /F %%i IN ('cscript "%~dp0yyyymmdd.vbs" //Nologo') do SET MYDATE=%%i
echo %MYDATE%

Конечно, в конечном итоге наступит момент, когда перезапись вашего пакетного файла на более мощном языке сценариев будет более целесообразной, чем смешивание его с VBScript таким образом.

12 голосов
/ 14 мая 2009

Это будет работать для формата даты за пределами США (dd/MM/yyyy):

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
7z a QuickBackup%backupFilename%.zip *.backup
7 голосов
/ 20 мая 2015
@SETLOCAL ENABLEDELAYEDEXPANSION

@REM Use WMIC to retrieve date and time
@echo off
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF NOT "%%~F"=="" (
        SET /A SortDate = 10000 * %%F + 100 * %%D + %%A
        set YEAR=!SortDate:~0,4!
        set MON=!SortDate:~4,2!
        set DAY=!SortDate:~6,2!
        @REM Add 1000000 so as to force a prepended 0 if hours less than 10
        SET /A SortTime = 1000000 + 10000 * %%B + 100 * %%C + %%E
        set HOUR=!SortTime:~1,2!
        set MIN=!SortTime:~3,2!
        set SEC=!SortTime:~5,2!
    )
)
@echo on
@echo DATE=%DATE%, TIME=%TIME%
@echo HOUR=!HOUR! MIN=!MIN! SEC=!SEC!
@echo YR=!YEAR! MON=!MON! DAY=!DAY! 
@echo DATECODE= '!YEAR!!MON!!DAY!!HOUR!!MIN!' 

Выход:

DATE=2015-05-20, TIME= 1:30:38.59
HOUR=01 MIN=30 SEC=38
YR=2015 MON=05 DAY=20
DATECODE= '201505200130'
5 голосов
/ 27 мая 2009

Вы также можете получить доступ к дате через переменную %DATE%

При тестировании моей системы %DATE% выдает ддд дд / мм / гггг

вы можете использовать операторы подстроки для создания желаемого формата

т. запуск следующего в понедельник 12/12/2018 с региональными настройками США

%DATE:~3,3% %DATE:~0,3% %DATE:~7,2%

Будет выдавать вывод:

11 Mon 12

аргументы подстроки:
%*variable*:~*startpos*,*numberofchars*%

3 голосов
/ 17 января 2011

Это все неудобно и не зависит от локальных настроек. Сделайте это так:

%CYGWIN_DIR%\bin\date +%%Y%%m%%d_%%H%%M% > date.txt
for /f "delims=" %%a in ('type "date.txt" 2^>NUL') do set datetime=%%a
echo %datetime%
del date.txt

Да, используйте Cygwin date и все ваши проблемы исчезли!

2 голосов
/ 14 мая 2009

Конечно.

FOR %%A IN (%Date:/=%) DO SET Today=%%A
7z a QuickBackup%TODAY%.zip *.backup

Это формат DDMMYYYY.

Вот YYYYDDMM:

FOR %%A IN (%Date%) DO (
    FOR /F "tokens=1-3 delims=/-" %%B in ("%%~A") DO (
        SET Today=%%D%%B%%C
    )
)
7z a QuickBackup%TODAY%.zip *.backup
1 голос
/ 26 августа 2017

Если у вас включен WSL (только для Windows 10), вы можете сделать это с помощью bash, независимо от локали.

set dateFile=%TEMP%\currentDate.txt
bash -c "date +%Y%m%d" > %dateFile%
set /p today=<%dateFile%

Не стесняйтесь заменить перенаправление файла на мерзость цикла "for", предложенную в других ответах здесь и далее Пакетное назначение Windows для вывода переменной программы

1 голос
/ 31 января 2017

Сайрам С примерами, приведенными выше, я попробовал и вышел со сценарием, который я хотел. Параметры положения, упомянутые в другом примере, дали разные результаты. Я хотел создать один пакетный файл для ежедневного резервного копирования данных Oracle (экспорт данных), сохраняя отдельные файлы DMP с датой и временем как частью имени файла. Вот сценарий, который работал хорошо:

cls
set dt=%date:~0,2%%date:~3,2%%date:~6,4%-%time:~0,2%%time:~3,2%
set fn=backup-%dt%.DMP
echo %fn%
pause A
exp user/password file=D:\DATA_DMP\%fn%
1 голос
/ 17 февраля 2010

Как было отмечено, синтаксический анализ даты и времени полезен только в том случае, если вы знаете формат, используемый текущим пользователем (например, MM / dd / yy или dd-MM-yyyy только для имени 2). Это может быть определено, но к тому времени, когда вы выполните все операции выделения и выделения, у вас все равно останется некоторая ситуация, когда используется непредвиденный формат, и потребуется больше настроек.

Вы также можете использовать некоторую внешнюю программу, которая будет возвращать слаг даты в выбранном вами формате, но у него есть недостатки, связанные с необходимостью распространения утилиты с вашим скриптом / пакетом.

есть также пакетные приемы, использующие часы CMOS довольно сырым способом, но это слишком близко к оголенным проводам для большинства людей, а также не всегда предпочтительное место для получения даты / времени.

Ниже приведено решение, позволяющее избежать вышеуказанных проблем. Да, это создает некоторые другие проблемы, но для моих целей я обнаружил, что это самое простое, понятное и портативное решение для создания меток даты в файлах .bat для современных систем Windows. Это всего лишь пример, но я думаю, вы увидите, как изменить другие форматы даты и / или времени и т. Д.

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM the following may be needed to be sure cache is clear before using the new setting
reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...