윈도우즈 배치 스크립트에서 날짜 및 시간 형식 지정
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%'를 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%
일반적으로 날짜/시간 문자열이 필요할 때마다 다음과 같이 수행합니다.
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으로 바꿉니다.
은 다음과 같습니다.yyyy_mm_dd__hh_mm_ss
서브스트링의 구조에 대한 간단한 설명:
%VARIABLE:~num_chars_to_skip,num_chars_to_keep%
따라서 "29.03.2018"과 같은 날짜로부터 연도를 얻으려면 다음을 사용하십시오.
%DATE:~6,4%
^-----skip 6 characters
^---keep 4 characters
로그 파일명을 생성하는 방법은 다음과 같습니다(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
...
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention ('YYYYMMDD_HHMMSS')
: Scrapes the characters out of their expected permissions in the date/time
: environment variables.
: Expects a date format of '____MM_DD_YYYY'
: Expects a time format of 'HH:MM:SS' or ' H:MM:SS'
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
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 DISABLE EXTENSIONS에서 계속 작동).
앞서 설명한 바와 같이 날짜와 시각의 해석은 현재 사용자가 사용하는 형식을 알고 있는 경우에만 도움이 됩니다(예를 들어 MM/dd/yy 또는 dd-MM-yyy 등).이것은 판별할 수 있습니다만, 모든 부하와 해석을 실시할 때까지 예기치 않은 포맷이 사용되고 있는 상황이 계속 되어, 한층 더 조정이 필요하게 됩니다.
원하는 형식으로 날짜 슬래그를 반환하는 외부 프로그램도 사용할 수 있지만 스크립트/배치와 함께 유틸리티 프로그램을 배포해야 하는 단점이 있습니다.
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:.=_%
" " : " "/
★★★★★★★★★★★★★★★★★」:
「」가 표시됩니다..
공간은 밑줄로 대체됩니다.
출력 예(수요일 오후 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%
다음은 직접적인 답변이 아니라 가까운 답변일 수 있습니다.
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
Windows 의 명령어로 서포트되고 있는 포맷에서는, 관심 있는 것 같은 패드는 사용할 수 없습니다.
단,이 ,, BATCH가 음, 음음음음음음음음음음음음음음음음음음 however however however보다 짧은지 할 수 .10
...
에 다른 패드를 붙이다echo
스트링
명령어에 대한 정보는 이 링크에서 확인할 수 있습니다.
다른 프로그래밍 방법으로 변경할 수도 있습니다.
unix bash(Windows의 Cygwin에서 사용 가능)에서는 다음과 같이 말할 수 있습니다.
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%
로그 파일201310170928.로그.
배치파일은 처음이라서 이게 내 코드야!!(왜 그런지 모르겠지만 date /t와 time /t를 함께 사용할 수 없고 변수 없이 %date%와 %time%를 직접 사용할 수 없습니다.)
@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT
다른 사용자로부터 재이용되고 있습니다(문제는 파일명으로 사용할 포맷된 timedate를 가져오는 것이었습니다).
::========================================================================
::== 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%
항상 으로 출력됩니다.
120150515150941.077000+120
그러면 원하는 대로 출력 포맷만 하면 됩니다.
이 배치 스크립트는 O.P.가 원하는 대로 동작합니다(Windows XP SP3에서 테스트 완료).
IMHO에 % 되게 하는 방법은 가 이전에 에 의해 은 IMHO에 100% 합니다."yyyy_MM_dd"
윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도 윈도.이를 위해 1개의 레지스트리 값이 변경되는 것은 순간적이고 사소한 것입니다.이 변경은 몇 밀리초 후에 즉시 되돌려집니다.
이 배치파일을 더블클릭하면 명령 프롬프트창이 뜨고 타임스탬프가 표시됩니다.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A
:: --- 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 [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)
:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2%
:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT,
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (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
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%
:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO Your timestamp is: %TIMESTAMP%
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%
)
이 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
적절한 평가를 위해 Peter Mortensen (14년 6월 18일 21시 2분)과 opello (11년 8월 25일 14시 27분)의 개념을 통합했습니다.
이 정도로 짧게 쓸 수 있지만, 이 긴 버전은 코드를 읽고 이해하기 쉽게 합니다.
" " 를 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%)
@the lorax 위에 있는 숏버전은 좋지만, 다른 언어 설정에서는 조금 다를 수 있습니다.
예를 들어 독일어 설정(자연일 형식: dd.mm.yyy)에서는 월 쿼리를 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
은 첫 두 번째를 .%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%
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을 적절히 처리하기 위해 TH% 변수가 배치되었습니다.시간의 처음 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
이걸 쓰시면...
Parameters:
%date:~4,2% -- month
%date:~7,2% -- days
%date:~10,4% -- years
%time:~1,1% -- hours
%time:~3,2% -- minutes
%time:~6,2% -- seconds
%time:~9,2% -- mili-seconds
%date:~4,2%%date:~7,2%%date:~10,4% : MMDDYYYY
%date:~7,2%%date:~4,2%%date:~10,4% : DDMMYYYY
%date:~10,4%%date:~4,2%%date:~7,2% : YYYYMMDD
인정된 답변을 시도해보니 꽤 잘 작동합니다.안타깝게도 US 시간 형식은 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
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
이러한 상황에서는 다음과 같은 간단한 표준 프로그래밍 방식을 사용합니다.알 수 없는 엔티티를 해석하는 데 많은 노력을 들이는 대신 현재 설정을 저장하고 기존 상태로 리셋하고 정보를 추출한 후 원래 상태로 복원합니다.표준 윈도우즈 리소스만 사용하십시오.
특히 날짜와 시각 형식은 레지스트리 키 HKCU\Control Panel\에 저장됩니다.[MS 정의] "값"의 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 앞에 붙어야 하는데 그렇지 않습니다.다행히 해결방법은 간단합니다.
%를 사용하면 시간 값이 7-9일 때 16진수 작동 오류가 발생합니다.이를 방지하려면 DelayedExpansion을 사용하고 !min:~1!을 사용하여 시간 값을 잡으십시오.
PowerShell을 사용하는 경우 다음 명령을 호출할 수도 있습니다.
for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i)
이 스크립트는 WMIC 도구를 통해 액세스하는 WMI 인터페이스를 사용합니다. WMIC 도구는 Windows XP Professional 이후 Windows에 필수적인 부분입니다(홈 에디션도 지원되지만 기본적으로 이 도구는 설치되지 않습니다).이 스크립트는 WMI 인터페이스에 액세스하여 WMIC 툴이 제공하는 것과 같은 형식으로 콘솔 출력에 쓰기 위한 WSH vbscript를 생성하여 호출함으로써 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
초기 변수 확장을 피하기 위한 좋은 한 줄 트릭은 다음과 같습니다.cmd /c echo ^%time^%
cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%
언급URL : https://stackoverflow.com/questions/1192476/format-date-and-time-in-a-windows-batch-script
'programing' 카테고리의 다른 글
목록 대신 Blocking Collection을 사용할 때와 Concurrent Bag을 사용할 때 (0) | 2023.04.20 |
---|---|
varchar(8000)보다 varchar(500)가 유리합니까? (0) | 2023.04.20 |
기존 테이블에서 테이블(구조)을 작성합니다. (0) | 2023.04.20 |
C# Excel Interop - 워크시트를 호출할 때 '게시' 대화 상자를 표시하지 않습니다.ExportAsFixedFormat (0) | 2023.04.15 |
UTF-8 인코딩된 NSData를 NSString으로 변환 (0) | 2023.04.15 |