Формат даты и времени в пакете Windows script
В пакете Windows (Windows XP) script Мне нужно отформатировать текущую дату и время для последующего использования в именах файлов и т.д.
Он похож на вопрос Как добавить дату в пакетных файлах, но со временем также.
У меня это до сих пор:
echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%
который дает:
28/07/2009
8:35:31.01
2009_07_28__ 8_36_01
Есть ли способ, которым я могу разрешить одну цифру часа в% TIME%, поэтому я могу получить следующее?
2009_07_28__08_36_01
Ответы
Ответ 1
Я закончил с этим script:
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%
set year=%date:~-4%
echo year=%year%
:: На WIN2008R2, например. Мне нужно было сделать ваш "установленный месяц =% даты: ~ 3,2%", как показано ниже: иначе появляется 00 для MONTH
set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%
set datetimef=%year%%month%%day%_%hour%%min%%secs%
echo datetimef=%datetimef%
Ответ 2
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention
SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2%
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%
if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)
ECHO %dtStamp%
PAUSE
Ответ 3
Вот как я создаю имя файла журнала (на основе http://ss64.com/nt/syntax-getdate.html):
@ECHO OFF
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error
:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
IF "%%~L"=="" goto s_done
Set _yyyy=%%L
Set _mm=00%%J
Set _dd=00%%G
Set _hour=00%%H
SET _minute=00%%I
SET _second=00%%K
)
:s_done
:: Pad digits with leading zeros
Set _mm=%_mm:~-2%
Set _dd=%_dd:~-2%
Set _hour=%_hour:~-2%
Set _minute=%_minute:~-2%
Set _second=%_second:~-2%
Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump
:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_
:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...
Ответ 4
Если PowerShell установлен, вы можете легко и надежно получить дату/время в любом формате, который вам нужен, например:
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"
Конечно, в настоящее время PowerShell всегда установлен, но в Windows XP вы, вероятно, захотите использовать этот метод, если ваша партия script используется в известной среде, где вы знаете, что PS доступен (или проверьте свою партию файл, если доступна PowerShell...)
Вы можете разумно спросить: зачем вообще использовать пакетный файл, если вы можете использовать PowerShell для получения даты/времени, но я думаю, что некоторые очевидные причины: (а) вы не все знакомы с PowerShell и по-прежнему предпочитаете делать большинство вещей старомодным способом с пакетными файлами или (б) вы обновляете старый script и не хотите переносить все на PS.
Ответ 5
Я обычно делаю это так, когда мне нужна строка даты/времени:
set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%
Это для немецкого формата даты/времени (dd.mm.yyyy hh: mm: ss). В основном я конкатенирую подстроки и, наконец, заменяю все пространства нулями.
Краткое объяснение того, как работают подстроки:
%VARIABLE:~num_chars_to_skip,num_chars_to_keep%
Таким образом, чтобы получить только год с даты, например "29.03.2018", используйте:
%DATE:~6,4%
^-----skip 6 characters
^---keep 4 characters
Ответ 6
Сегодня я столкнулся с этой проблемой и решил ее:
SET LOGTIME=%TIME: =0%
Он заменяет пробелы 0s и в основном нулевые прокладки в час.
После некоторого быстрого поиска я не выяснил, нужны ли ему расширения команд (все еще работало с SETLOCAL DISABLEEXTENSIONS).
Ответ 7
Как уже отмечалось, анализ даты и времени полезен только в том случае, если вы знаете формат, используемый текущим пользователем (например, MM/dd/yy или dd-MM-yyyy, чтобы назвать два). Это можно определить, но к тому моменту, когда вы сделаете все, что нужно, и проанализируйте, вы все равно столкнетесь с ситуацией, когда используется неожиданный формат, и вам потребуются дополнительные настройки.
Вы также можете использовать некоторую внешнюю программу, которая вернет пул дат в предпочтительном формате, но у этого есть недостатки, связанные с необходимостью распространять служебную программу с помощью script/batch.
Есть также пакетные трюки, использующие часы CMOS в довольно грубом виде, но это tooo близко к оголенным проводам для большинства людей, а также не всегда предпочтительное место для получения даты/времени.
Ниже приведено решение, позволяющее избежать вышеуказанных проблем. Да, это вводит некоторые другие проблемы, но для моих целей я нашел это самым простым и ясным, самым портативным решением для создания datestamp в .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 reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
Ответ 8
Следующий может быть не прямым ответом, а близким?
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
По крайней мере, это может вдохновить.
Ответ 9
Если вам не нужен именно этот формат:
2009_07_28__08_36_01
Затем вы можете использовать следующие 3 строки кода, в которых используются% date% и% time%:
set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%
Примечание. Символы /
и :
удаляются, а символ .
и пробел заменяются символом подчеркивания.
Пример вывода (принято в среду 8/5/15 в 12:49 PM с 50 секундами и 93 миллисекундами):
echo %mytimestamp%
Wed_08052015_124950_93
Ответ 10
Форматирование offset:length
поддерживаемое командой SET
в Windows, не позволит вам вставлять 0
как вам кажется, вас интересует.
Однако вы можете закодировать сценарий BATCH для проверки того, что час меньше 10
и
соответственно, с другой echo
строкой.
Вы найдете некоторую информацию о команде SET
по этой ссылке.
Вы также можете перейти на другие методы программирования, чтобы попасть сюда.
Это довольно просто в unix bash (доступно с Cygwin на Windows), чтобы просто сказать:
date +%Y_%m_%d__%H_%M_%S
И он всегда правильно накладывается.
Ответ 11
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).
IF "%time:~0,1%" LSS "1" (
SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)
ECHO %DATETIME%
Ответ 12
Я сделал это следующим образом:
REM Generate FileName from date and time in format YYYYMMTTHHMM
Time /T > Time.dat
set /P ftime= < Time.dat
set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log
echo %FileName%
LogFile201310170928.log
Ответ 13
Вы можете сделать это намного проще:
set datetimef=%date%_%time:~0,2%-%time:~3,2%-%time:~6,2%
set datetimef=%datetimef: =0%
echo% datetimef% return "
2015-09-01_09-58-33
Первая строка преобразует дату/время в желаемый формат
а второй заменяет все пробелы на 0 (ноль).
Ответ 14
Я действительно новичок в пакетных файлах, и это мой код! (Я не уверен, почему, но я не мог комбинировать дату/t и время/т вместе, и я не мог использовать % date% и % time% напрямую без переменной...)
@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT
Это отчасти повторное использование от других (вопрос состоял в том, чтобы получить отформатированное время для использования в качестве имени файла).
Ответ 15
::========================================================================
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS
::======= ================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%
Первая строка всегда выводит в этом формате аспекты часового пояса:
20150515150941.077000 + 120
Это оставляет вам только форматирование вывода в соответствии с вашими пожеланиями.
Ответ 16
Чтобы создать временную метку YYYY-MM-DD hh:mm:ss
(24 часа), я использую:
SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)
Ответ 17
Есть еще один простой способ сделать это:
set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)
Ответ 18
Эта партия script сделает именно то, что хочет O.P. (протестировано в Windows XP SP3).
Я также использовал этот умный трюк реестра, описанный ранее "jph", IMHO - это самый простой способ получить 100% -ное согласованное форматирование даты до "yyyy_MM_dd"
в любой новой или старой системе Windows. Изменение одного значения реестра для этого является мгновенным временным и тривиальным; он длится всего несколько миллисекунд, прежде чем он будет немедленно возвращен обратно.
Дважды щелкните этот командный файл для мгновенной демонстрации, появится окно командной строки и отобразится метка времени.,,.
@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A
TITLE GENERATE A CUSTOM FORMATTED TIMESTAMP USING %%DATE%% AND %%TIME%% COMMANDS
:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul
SET MYDATE=%date%
:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul
:: --- SPLIT THE TIME DIGITS TO THREE BLOCKS [H] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO SET HOUR=%%A& SET MINUTES=%%B& SET SECONDS=%%C
:: --- YOUR CHOICE - FOR 4 DIGIT SECONDS - REMOVES THE DOT FROM THE SECONDS BLOCK [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- YOUR CHOICE - FOR 2 DIGIT SECONDS - GETS THE FIRST TWO DIGITS FROM THE SECONDS BLOCK [SS.SS]
SET SECONDS=%SECONDS:~0,2%
:: --- GET THE "AM PM" STRING TO CHECK THE HOUR BLOCK
FOR /F "tokens=1,2 delims= " %%A IN ('time /t') DO SET AM_PM=%%B
:: --- CONVERT THE HOUR BLOCK [H] TO "24 HOUR" FORMAT [HH]
IF %AM_PM%==PM (
IF %HOUR%==01 (SET HOUR=13)
IF %HOUR%==02 (SET HOUR=14)
IF %HOUR%==03 (SET HOUR=15)
IF %HOUR%==04 (SET HOUR=16)
IF %HOUR%==05 (SET HOUR=17)
IF %HOUR%==06 (SET HOUR=18)
IF %HOUR%==07 (SET HOUR=19)
IF %HOUR%==08 (SET HOUR=20)
IF %HOUR%==09 (SET HOUR=21)
IF %HOUR%==10 (SET HOUR=22)
IF %HOUR%==11 (SET HOUR=23)
) ELSE (
IF %HOUR%==12 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)
)
:: --- GENERATE OUR WANTED TIMESTAMP
ECHO. & ECHO.
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%
ECHO Your timestamp is: %TIMESTAMP%
:: --- WAIT - VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO. & ECHO.
ECHO Job is done. Press any key to exit . . .
PAUSE > NUL
EXIT
Ответ 19
set hourstr = %time:~0,2%
if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%)
set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%
Ответ 20
Создайте файл под названием "search_files.bat" и поместите содержимое в файл. Затем дважды щелкните по нему. Временная переменная% THH% была введена в действие для надлежащего управления AM. Если в первые 2 цифры времени есть 0, Windows игнорирует остальную часть имени файла LOG.
CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG
Ответ 21
Этот файл bat (save as datetimestr.bat) создает строку datetime 3 раза: (1) длинную строку даты и времени с днем недели и секундами,
(2) короткая строка datetime без них и
(3) короткая версия кода.
@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%
set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to
REM replace semi-colons with hyphens (or any
REM non-special character)
set t=%t::=%
set t=%t:.=%
set datetimestr=%d%_%t%
@echo Long date time str = %datetimestr%
set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%
@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%
pause
Чтобы отдать должное, я объединил концепции Питера Мортенсена (18-18 июня в 21:02) и opello (25 августа 2011 года в 14:27).
Вы можете написать это намного короче, но эта длинная версия упрощает чтение и понимание кода.
Ответ 22
Мне нравится короткая версия поверх @The lorax,
но для других языковых настроек это может быть немного иначе.
Например, в настройках немецкого языка (с естественным форматом даты: dd.mm.yyyy) запрос месяца должен быть изменен с 4,2 до 3,2:
@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.
SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2%
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%
if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)
ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)
PAUSE
Ответ 23
Это мои 2 цента за datetime string
. В системах MM DD YYYY
переключается первая и вторая записи %DATE:~
.
REM ====================================================================================
REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
REM ====================================================================================
REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
REM ====================================================================================
REM CHECK for SHORTDATE dd DDxMMxYYYY
IF "%DATE:~0,1%" GTR "3" (
SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
) ELSE (
REM ASSUMES SHORTDATE DDxMMxYYYY
SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
)
REM CORRECT FOR HOURS BELOW 10
IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
ECHO %DATETIME%
Ответ 24
Я попробовал принятый ответ, и он работает очень хорошо. К сожалению, формат времени США выглядит как H: MM: SS.CS, а недостающее 0 на фронте вызывает проблемы с анализом до 10 часов утра. Чтобы преодолеть это препятствие, а также разрешить разбор большинства форматов мирового времени, я придумал эту простую процедуру, которая, похоже, работает достаточно хорошо.
:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF
Хорошая вещь с этой подпрограммой заключается в том, что вы передаете строку времени в качестве первого параметра и имя переменной среды, в которую вы хотите указать время (в секундах) в качестве второго параметра. Например:
CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%
(* Chris *)
Ответ 25
Возможно, что-то вроде этого:
@call:DateTime
@for %%? in (
"Year :Y"
"Month :M"
"Day :D"
"Hour :H"
"Minutes:I"
"Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_
:: OUTPUT
:: Year : _DT_Y_ : 2014
:: Month : _DT_M_ : 12
:: Day : _DT_D_ : 17
:: Hour : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35
@pause>nul
@goto:eof
:DateTime
@verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
@if not errorlevel 1 (
@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 "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
) else (
@set "_DT_T_=1234567890 "
)
@if errorlevel 1 (
@for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
@for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
@for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
)
@if errorlevel 1 (
@if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
@for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
@for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
@for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
)
@for %%i in ("Y" ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+= 0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
@for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b
Ответ 26
В таких ситуациях используйте простой, стандартный подход к программированию:
Вместо того, чтобы тратить огромные усилия на анализ неизвестного объекта, просто сохраните текущую конфигурацию, reset в известном состоянии, извлеките информацию и затем восстановите исходное состояние. Используйте только стандартные ресурсы Windows.
В частности, форматы даты и времени хранятся в разделе реестра
HKCU\Control Panel\International\in [MS definition] "values": "sTimeFormat" и "sSortTate".
Reg - это редактор реестра консоли, входящий в состав всех версий Windows.
Для изменения ключа HKCU не требуются повышенные привилегии
Prompt $N:$D $T$G
::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF
::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss" /f
Reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f
::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%
::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f
Простой, понятный и должен работать во всех регионах.
По причинам, которые я не понимаю, сброс значения "sShortDate" вступает в силу немедленно
консольное окно, но сброс очень похожего значения "sTimeFormat" не вступает в силу
пока не откроется новое окно консоли. Однако единственным изменчивым является разделитель -
позиции цифр фиксированы. Точно так же токен времени "HH" должен предусматривать предшествующие нули, но это не так.
К счастью, обходные пути легки.
Ответ 27
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================
Ответ 28
Разделите результаты команды date косой чертой, затем вы можете переместить каждый из токенов в соответствующие переменные.
FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
Ответ 29
Для очень простого решения для числовой даты для использования в именах файлов используйте следующий код:
set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%
rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt
Ответ 30
Используйте REG для сохранения/изменения/восстановления того, что когда-либо значения наиболее полезны для вашего bat файла. Это окна 7, для других версий вам может понадобиться другое имя ключа.
reg save "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg /y
reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f
set file=%DATE%-%TIME: =0%
reg restore "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg
set file=%file::=-%
set file=%file:.=-%
set file