Формат даты и времени в Windows пакетный скрипт

в пакетном скрипте Windows (Windows XP) мне нужно отформатировать текущую дату и время для последующего использования в именах файлов и т. д.

Это похоже на вопрос переполнения стека как добавить дату в пакетные файлы, но со временем.

у меня это до сих пор:

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

30 ответов


Я закончил с этим скриптом:

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 появляется в течение месяца

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%

@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

вот как я создаю имя файла журнала (на основе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
...

Если 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 вы, вероятно, захотите использовать этот метод, только если ваш пакетный скрипт используется в известной среде, где вы знаете, что PS доступен (или проверьте свой пакетный файл, если PowerShell доступен...)

вы можете разумно спросить: зачем вообще использовать пакетный файл, если вы можно использовать PowerShell для получения даты / времени, но я думаю, что некоторые очевидные причины: (a) вы не так хорошо знакомы с PowerShell и по-прежнему предпочитаете делать большинство вещей старомодным способом с пакетными файлами или (b) вы обновляете старый скрипт и не хотите переносить все это в PS.


я столкнулся с этой проблемой сегодня и решил ее с помощью:

SET LOGTIME=%TIME: =0%

Он заменяет пробелы на 0s и в основном нулевые колодки в час.

после некоторого быстрого поиска я не узнал, требуются ли расширения команд (все еще работал с SETLOCAL DISABLEEXTENSIONS).


Я обычно делаю так, когда мне нужна дата/время:

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.мм гггг чч: мм: СС). В основном я объединяю подстроки и, наконец, заменяю все пробелы нулями.

краткое объяснение того, как работают подстроки:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

таким образом, чтобы получить только год от даты, как "29.03.2018" использовать:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 

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

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

есть также пакетные трюки с использованием часов 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 reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f

следующее Может быть не прямым ответом, а близким?

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%

по крайней мере, это может быть вдохновляющим.


Если вам точно не нужен этот формат:

2009_07_28__08_36_01

тогда вы можете использовать следующее 3 строки кода который использует %date% и %time%:

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

Примечание: символы / и : удаляются и символ . и Пробел заменяется знаком подчеркивания.

пример вывода (взято в среду 8/5/15 в 12: 49 вечера с 50 секундами и 93 миллисекундами):

echo %mytimestamp%
Wed_08052015_124950_93

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%

на offset:length форматирование поддерживается с SET команда в Windows не позволит вам заполнить 0 как вы, кажется, заинтересованы.

однако вы можете закодировать пакетный скрипт, чтобы проверить, что час меньше 10 и
pad соответственно с другим echo строку.

вы найдете некоторые информацию о SET по этой ссылке.


вы также можете перейти на другие методы программирования, чтобы добраться сюда.

это довольно просто в unix bash (доступно с Cygwin на Windows), чтобы просто сказать,

date +%Y_%m_%d__%H_%M_%S

и, он всегда прокладывает правильно.


Я сделал это так:

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


для создания 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%)

::========================================================================  
::== 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
Это оставляет вам только форматирование вывода в соответствии с вашими пожеланиями.


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%

создайте файл под названием "search_files.bat" и поместите содержимое ниже в файл. Затем дважды щелкните его. Временная переменная %THH% была введена для обработки AM соответствующим образом. Если в первых 2 цифрах времени есть 0, Windows игнорирует остальную часть имени файла журнала.

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

этот пакетный скрипт будет делать именно то, что хочет О. П. (протестировано на 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

этот файл bat (сохранить как datetimestr.bat) создает строку datetime 3 раза: (1) длинная строка datetime с днем недели и секундами, (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

вы можете написать это намного короче, но эта длинная версия упрощает чтение и понимание кода.


Мне нравится короткая версия поверх @lorax, но для других языковых настроек это может быть немного иначе.

например, в настройках немецкого языка (с естественным форматом даты: dd.мм 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

Я действительно Новичок в пакетных файлах, и это мой код!! (Я не уверен, почему, но я не мог объединить дата / t и время / t вместе и я не могу использовать %дата% и %время% напрямую без переменной...)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

это своего рода повторно используется от других (вопрос состоял в том, чтобы получить отформатированный timedate для использования в качестве имени файла).


Это мои 2 цента заdatetime string. On 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%

я попробовал принял ответ, и он работает довольно хорошо. К сожалению, формат времени в США выглядит как 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*)


может, что-то вроде этого:

@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

:: =============================================================
:: 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
:: =============================================================

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

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

разделите результаты команды 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%

используйте REG для сохранения/изменения / восстановления значений, которые наиболее полезны для вашего файла bat. Это windows 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

в таких ситуациях используйте простой, стандартный подход программирования: Вместо того, чтобы тратить огромные усилия на разбор неизвестной сущности, просто сохраните текущую конфигурацию, сбросьте ее в известное состояние, извлеките информацию, а затем восстановите исходное состояние. Использовать только стандартные ресурсы Windows.

в частности, формат даты и времени хранятся в разделе реестра HKCU\Панель управления\International\ в [MS definition] "значения": "sTimeFormat"и " sShortDate". 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 " должен добавлять ведущие нули, но это не так. К счастью, обходные пути просты.


используя %, вы столкнетесь с ошибкой шестнадцатеричной операции, когда значение времени равно 7-9. Чтобы избежать этого, используйте DelayedExpansion и захватить ценности времени !мин:~1!

альтернативный способ, если у вас есть PowerShell Это называется:

for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i)

этот скрипт использует интерфейс WMI, доступ к первичному через WMIC tool, который является неотъемлемой частью Windows, так как Windows XP Professional (Home edition также поддерживается, но инструмент не установлен по умолчанию). Сценарий также реализует обходной путь отсутствующего инструмента WMIC путем создания и вызова WSH vbscript для доступа к интерфейсу WMI и записи в консоль вывода времени с тем же форматом, что и инструмент WMIC.

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF