it-swarm.com.ru

Как добавить дату в пакетных файлах

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

7z a QuickBackup.Zip *.backup

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

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

41
AngryHacker

ответ Бернхарда мне потребовалась некоторая доработка для меня, потому что переменная окружения% 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%

Чт 05/14/2009 

55
Chris

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

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

    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
Joe

Это будет работать для не-американского формата даты (dd/MM/yyyy):

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
7z a QuickBackup%backupFilename%.Zip *.backup
11
Bernhard Hofmann
@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'
7
Michael Fitzpatrick

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

При тестировании моей системы %DATE% выдает ddd dd/mm/yyyy

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

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

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

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

11 Mon 12

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

5
ShoeLace

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

%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 Дата и все ваши проблемы исчезли!

3
Exstinctor Dumbulator

Конечно.

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

Это формат ДДММГГГГ.

Вот ГГГГДДММ:

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
2
Dmitri Farkov

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

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

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

1
Raven

Сайрам С примерами, приведенными выше, я попробовал и вышел со сценарием, который я хотел. Параметры положения, упомянутые в другом примере, дали разные результаты. Я хотел создать один пакетный файл для ежедневного резервного копирования данных 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
Udayshankar K P

Как было отмечено, синтаксический анализ даты и времени полезен только в том случае, если вы знаете формат, используемый текущим пользователем (например, 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
1
jph

Я использовал технику переменных среды, описанную здесь: http://cwashington.netreach.net/depo/view.asp?Index=19

http://cwashington.netreach.net/depo/default.asp?topic=repository&move=last&ScriptType=command&SubType=Misc

Вот код с этого сайта:

::~~Author~~.          Brett Middleton
::~~Email_Address~~. [email protected]
::~~Script_Type~~.   nt command line batch
::~~Sub_Type~~. Misc
::~~Keywords~~. environment variables

::~~Comment~~.
::Sets or clears a group of environment variables containing components of the current date extracted from the string returned by the DATE /T command.  These variables can be used to name files, control the flow of execution, etc.

::~~Script~~.

@echo off

::-----------------------------------------------------------------------------
::  SetEnvDate1.CMD                                                     6/30/98
::-----------------------------------------------------------------------------
::  Description  :  Sets or clears a group of environment variables containing
::               :  components of the current date extracted from the string
::               :  returned by the DATE /T command.  These variables can be
::               :  used to name files, control the flow of execution, etc.
::               :
::  Requires     :  Windows NT with command extensions enabled
::               :
::  Tested       :  Yes, as demonstration
::               :
::  Contact      :  Brett Middleton <[email protected]>
::               :  Animal and Dairy Science Department
::               :  University of Georgia, Athens
::-----------------------------------------------------------------------------
::  USAGE
::
::  SetEnvDate1 can be used as a model for coding date/time routines in
::  other scripts, or can be used by itself as a utility that is called
::  from other scripts.
::  
::  Run or call SetEnvDate1 without arguments to set the date variables.
::  Variables are set for the day abbreviation (DT_DAY), month number (DT_MM),
::  day number (DT_DD) and four-digit year (DT_YYYY).
::
::  When the variables are no longer needed, clean up the environment by
::  calling the script again with the CLEAR argument.  E.g.,
::
::       call SetEnvDate1 clear
::-----------------------------------------------------------------------------
::  NOTES
::
::  A time variable could be added by parsing the string returned by the
::  built-in TIME /T command.  This is left as an exercise for the reader. B-)
::
::  This script illustrates the following NT command extensions:
::
::  1.  Use of the extended IF command to do case-insensitive comparisons.
::
::  2.  Use of the extended DATE command.
::
::  3.  Use of the extended FOR command to parse a string returned by a
::      command or program.
::
::  4.  Use of the "()" conditional processing symbols to group commands
::      for conditional execution.  All commands between the parens will
::      be executed if the preceeding IF or FOR statement is TRUE.
::-----------------------------------------------------------------------------

if not "%1" == "?" goto chkarg
echo.
echo Sets or clears date/time variables in the command environment.
echo.
echo    SetEnvDate1 [clear]
echo.
echo When called without arguments, the variables are created or updated.
echo When called with the CLEAR argument, the variables are deleted.
echo.
goto endit

::-----------------------------------------------------------------------------
::  Check arguments and select SET or CLEAR routine.  Unrecognized arguments
::  are ignored and SET is assumed.
::-----------------------------------------------------------------------------

:chkarg

if /I "%1" == "CLEAR" goto clrvar
goto setvar

::-----------------------------------------------------------------------------
::  Set variables for the day abbreviation (DAY), month number (MM), 
::  day number (DD) and 4-digit year (YYYY). 
::-----------------------------------------------------------------------------

:setvar

for /F "tokens=1-4 delims=/ " %%i IN ('date /t') DO (
set DT_DAY=%%i
set DT_MM=%%j
set DT_DD=%%k
set DT_YYYY=%%l)

goto endit

::-----------------------------------------------------------------------------
::  Clear all variables from the environment.
::-----------------------------------------------------------------------------

:clrvar
for %%v in (DT_DAY DT_MM DT_DD DT_YYYY) do set %%v=
goto endit

:endit
1
Cade Roux

Доступен технический рецепт здесь , который показывает, как отформатировать его в MMDDYYYY, вы сможете адаптировать его для своих нужд.

echo on
@REM Seamonkey’s quick date batch (MMDDYYYY format)
@REM Setups %date variable
@REM First parses month, day, and year into mm , dd, yyyy formats and then combines to be MMDDYYYY
FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%

echo %date%

Правка: Причина не работала раньше была из-за «умные цитаты» в оригинальном тексте. Я исправил их, и пакетный файл будет работать, если вырезать и вставить с этой страницы.

1
Andre Miller

Основываясь на идее Джо, вот версия, которая будет создавать свой собственный (.js) помощник и время поддержки:

@echo off

set _TMP=%TEMP%\_datetime.tmp

echo var date = new Date(), string, tmp;> "%_TMP%"
echo tmp = ^"000^" + date.getFullYear(); string = tmp.substr(tmp.length - 4);>> "%_TMP%"
echo tmp = ^"0^" + (date.getMonth() + 1); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getDate(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getHours(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getMinutes(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getSeconds(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo WScript.Echo(string);>> "%_TMP%"

for /f %%i in ('cscript //nologo /e:jscript "%_TMP%"') do set _DATETIME=%%i

del "%_TMP%"

echo YYYYMMDDhhmmss: %_DATETIME%
echo YYYY: %_DATETIME:~0,4%
echo YYYYMM: %_DATETIME:~0,6%
echo YYYYMMDD: %_DATETIME:~0,8%
echo hhmm: %_DATETIME:~8,4%
echo hhmmss: %_DATETIME:~8,6%
0
vszakats

Я нашел два способа, которые работают независимо от настроек даты.

На моем компьютере date/t возвращается 2009-05-27

Вы можете получить доступ к реестру и прочитать региональные настройки (HKEY_CURRENT_USER\Control Panel\International)

Или используйте vbscript . Это уродливый гибрид пакетного файла/vbscript, который я создал некоторое время назад ....

@Echo Off
set rnd=%Random%
set randfilename=x%rnd%.vbs

::create temp vbscript file
Echo Dim DayofWeek(7) >  %temp%\%randfilename%
Echo DayofWeek(1)="Sun" >> %temp%\%randfilename%
Echo DayofWeek(2)="Mon" >> %temp%\%randfilename%
Echo DayofWeek(3)="Tue" >> %temp%\%randfilename%
Echo DayofWeek(4)="Wed" >> %temp%\%randfilename%
Echo DayofWeek(5)="Thu" >> %temp%\%randfilename%
Echo DayofWeek(6)="Fri" >> %temp%\%randfilename%
Echo DayofWeek(7)="Sat" >> %temp%\%randfilename%
Echo DayofWeek(0)=DayofWeek(Weekday(now)) >> %temp%\%randfilename%
Echo Mon=Left(MonthName(Month(now),1),3) >> %temp%\%randfilename%
Echo MonNumeric=right ( "00" ^& Month(now) , 2) >> %temp%\%randfilename%
Echo wscript.echo ( Year(Now) ^& " " ^& MonNumeric ^& " " ^& Mon ^& " "  _ >> %temp%\%randfilename%
Echo ^& right("00" ^& Day(now),2) ^& " "^& dayofweek(0) ^& " "^& _ >> %temp%\%randfilename%
Echo right("00" ^& Hour(now),2)) _ >> %temp%\%randfilename%
Echo ^&":"^& Right("00" ^& Minute(now),2) ^&":"^& Right("00" ^& Second(Now),2)  >> %temp%\%randfilename%

::set the output into vars
if "%1" == "" FOR /f "usebackq tokens=1,2,3,4,5,6" %%A in (`start /wait /b cscript //nologo %temp%\%randfilename%`) do Set Y2KYear=%%A& Set MonthNumeric=%%B& Set Month=%%C& Set Day=%%D& Set DayofWeek=%%E& Set Time=%%F
set year=%y2kyear:~2,2%

::cleanup
del %temp%\%randfilename%

Это не красиво, но это работает.

0
Raymond Joyal