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
나는이 스크립트로 끝났다.
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에서 예를 들어 'set month = % date : ~ 3,2 %'를 아래와 같이 만들어야했습니다.
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
...
나는 보통 날짜 / 시간 문자열이 필요할 때마다 이렇게한다 :
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). 기본적으로 하위 문자열을 연결하고 마지막으로 모든 공백을 0으로 바꿉니다.
부분 문자열의 작동 방식에 대한 간단한 설명 :
%VARIABLE:~num_chars_to_skip,num_chars_to_keep%
따라서 "29.03.2018"과 같은 날짜에서 연도를 얻으려면 다음을 사용하십시오.
%DATE:~6,4%
^-----skip 6 characters
^---keep 4 characters
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%
공백을 0으로 바꾸고 기본적으로 시간이 0 인 패드입니다.
빠른 검색 후 명령 확장이 필요한지 여부를 찾지 못했습니다 (여전히 SETLOCAL DISABLEEXTENSIONS에서 작동 함).
언급 한 바와 같이, 날짜 및 시간을 구문 분석하는 것은 현재 사용자가 사용중인 형식 (예 : MM / dd / yy 또는 dd-MM-yyyy)을 알고있는 경우에만 유용합니다. 이것은 결정할 수 있지만 모든 스트레스와 구문 분석을 수행 할 때 예상치 못한 형식이 사용되는 상황이 생겨 더 많은 조정이 필요합니다.
원하는 형식으로 날짜 슬러그를 반환하는 외부 프로그램을 사용할 수도 있지만 스크립트 / 배치와 함께 유틸리티 프로그램을 배포해야하는 단점이 있습니다.
꽤 원시적 인 방식으로 CMOS 클럭을 사용하는 배치 트릭도 있지만 대부분의 사람들이 베어 전선에 너무 가까우며 항상 날짜 / 시간을 검색하는 데 선호되는 장소는 아닙니다.
아래는 위의 문제를 피하는 솔루션입니다. 그렇습니다. 다른 문제가 있지만 내 목적으로 현대 Windows 시스템의 .bat 파일에 날짜 스탬프를 만드는 가장 쉽고 명확하며 이식성이 뛰어난 솔루션이라는 것을 알았습니다. 이것은 단지 예일 뿐이지 만 다른 날짜 및 / 또는 시간 형식 등을 수정하는 방법을 보게 될 것입니다.
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
이 형식이 정확히 필요하지 않은 경우 :
2009_07_28__08_36_01
그런 다음 % date % 및 % time %를 사용하는 다음 3 줄의 코드 를 사용할 수 있습니다 .
set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%
참고 : 문자 /
및 문자 :
가 제거되고 문자 .
및 공백이 밑줄로 바뀝니다.
출력 예 (50 초와 93 밀리 초로 12:49 PM에 수요일 8/5/15에 촬영) :
echo %mytimestamp%
Wed_08052015_124950_93
다음은 직접적인 답변이 아니라 가까운 답변 일 수 있습니다.
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%
적어도 영감을 줄 수 있습니다.
는 offset:length
지원 서식 SET
(가) 패드에 당신을 허용하지 않습니다 Windows의 명령 0
당신이에 관심이있을 것 같은.
그러나 BATCH 스크립트를 코딩하여 시간이 미만인지 확인 10
하고
그에 따라 다른 echo
문자열로 채울 수 있습니다.
이 링크 에서 SET
명령에 대한 정보를 찾을 수 있습니다.
다른 프로그래밍 방법으로 변경하여 여기로 이동할 수도 있습니다.
유닉스 bash (Windows의 Cygwin에서 사용 가능)에서 간단히 말하면,
date +%Y_%m_%d__%H_%M_%S
그리고 항상 올바르게 패딩됩니다.
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%
나는 이렇게했다 :
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
::========================================================================
::== 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
원하는대로 출력 형식을 지정할 수 있습니다.
나는 배치 파일을 처음 접했고 이것이 내 코드입니다! (왜 그런지 모르겠지만 날짜 / t 와 시간 / t를 함께 결합 할 수 없었고 변수없이 % date % 와 % time %을 직접 사용할 수 없었습니다 ...)
@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT
그것은 다른 사람들로부터 재사용 된 것입니다 (질문은 파일 이름으로 사용할 형식이 지정된 날짜를 얻는 것이 었습니다).
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%)
이 배치 스크립트는 OP가 원하는 것을 정확하게 수행합니다 (Windows XP SP3에서 테스트).
또한 이전에 "jph"로 설명 된 영리한 레지스트리 트릭을 사용했습니다. IMHO는 이전 "yyyy_MM_dd"
또는 모든 Windows 시스템 에서 날짜의 100 % 일관된 형식을 얻는 가장 간단한 방법입니다 . 이를 위해 하나의 레지스트리 값을 변경하는 것은 일시적이고 사소합니다. 즉시 되돌리기 전에 몇 밀리 초 동안 지속됩니다.
이 데모 파일을 더블 클릭하면 즉시 데모를 볼 수 있습니다. 명령 프롬프트 창이 나타나고 타임 스탬프가 표시됩니다. . . . .
@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
또 다른 쉬운 방법이 있습니다.
set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)
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"라는 파일을 만들고 아래 내용을 파일에 넣으십시오. 그런 다음 두 번 클릭하십시오. AM을 적절히 처리하기 위해 임시 % THH % 변수가 사용되었습니다. 시간의 처음 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
이 bat 파일 (datetimestr.bat로 저장)은 날짜 시간 문자열을 3 번 생성합니다. (1) 요일과 초가 포함 된 긴 날짜 시간 문자열, (2) 날짜가없는 짧은 날짜 시간 문자열 및 (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
적절한 신용을 얻기 위해 Peter Mortensen (Jun 18 '14 at 21:02)과 opello (Aug 25 '11 at 14:27)의 개념을 병합했습니다.
훨씬 짧게 작성할 수 있지만이 긴 버전을 사용하면 코드를 쉽게 읽고 이해할 수 있습니다.
@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
이것은 내 2 센트입니다 datetime string
. 에 MM DD YYYY
시스템 제 1 및 제 2 스위치 %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%
(* 크리스마스 *)
아마도 이런 식으로 뭔가 :
@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
이와 같은 상황에서는 간단한 표준 프로그래밍 방식을 사용합니다. 알 수없는 엔터티를 구문 분석하는 데 많은 노력을 기울이지 않고 현재 구성을 저장하고 알려진 상태로 재설정하고 정보를 추출한 다음 원래 상태를 복원하면됩니다. 표준 Windows 리소스 만 사용하십시오.
특히 날짜 및 시간 형식은 [MS 정의] "값"의 레지스트리 키 HKCU \ Control Panel \ International \ 아래에 저장됩니다 : "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"타임 토큰은 앞에 0을 붙여야하지만 그렇지 않습니다. 다행히도 해결 방법이 쉽습니다.
:: =============================================================
:: 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
날짜 명령의 결과를 슬래시로 나눈 다음 각 토큰을 적절한 변수로 옮길 수 있습니다.
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를 사용하십시오. 이것은 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
%를 사용하면 시간 값이 7-9 일 때 16 진 연산 오류가 발생합니다. 이를 피하려면 DelayedExpansion을 사용 하고! min : ~ 1!
PowerShell 을 사용하는 경우 대체 방법 은 다음을 호출하는 것입니다.
for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i)
참고 URL : https://stackoverflow.com/questions/1192476/format-date-and-time-in-a-windows-batch-script
'Programing' 카테고리의 다른 글
Windows 배치 스크립트에서 날짜 및 시간 형식 (0) | 2020.05.20 |
---|---|
Windows 배치 스크립트에서 날짜 및 시간 형식 (0) | 2020.05.20 |
.NET : 데이터와 함께 POST를 보내고 응답을 읽는 가장 간단한 방법 (0) | 2020.05.20 |
파일에서 Bash 배열로 줄 읽기 (0) | 2020.05.20 |
Laravel-Eloquent "Has", "With", "WhereHas"-무슨 뜻입니까? (0) | 2020.05.20 |