Windows 배치 스크립트에서 날짜 및 시간 형식


193

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



datetimef변수의 빈 공간을 바꾸고 대신 0을 넣을 수 있습니다 . 귀하의 예 :SET datetimef=%datetimef: =0%
SebaGra

답변:


148

나는이 스크립트로 끝났다.

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%

11
참고로, Windows Server 2003 및 Windows 7에서이 스크립트는 "201200Mo_085806"(올바른 연도 및 시간)을 표시했습니다.
sfuqua

50
Google에서 온 사람 (나 같은 사람)을위한 참고 사항 : 로케일에 따라 다르므로 영어 이외의 Windows에서 작동하려면 조정이 필요할 수 있습니다.
PiotrK

나는 이것을 이렇게했다 : Time / T> Time.dat set / P ftime = <Time.dat set fDate = % date : ~ 6 %% date : ~ 3,2 %% date : ~ 0,2 %% ftime : ~ 0,2 %% ftime : ~ 3,2 % 에코 % f 날짜 %-> 201310170928
Ice

% time : ~ 0,2 %는 : ~, % 구조에 대한 문서는 어디에 있습니까?
user1605665

6
이 모든 것은 일반적인 문자열 대체를 사용하여 단 2 줄로 수행 할 수 있습니다 : stackoverflow.com/a/23558738/1879699
Andreas

71
@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

2
Windows Server 2003 및 Windows 7에서 이것은 올바른 문자열을 제공했습니다. 과거에 구성한 것보다 훨씬 우아하므로 감사합니다!
sfuqua

3
러시아어 로켈이있는 Windows 7에서 제공하는 기능은 다음과 같습니다. 현재 시간은 2013-05-03T02 : 22 : 51이지만 스크립트는 다음과 같이 인쇄됩니다 : "2013-5.-01_02_22_51"
nightcoder

7
% date %는 로케일마다 다른 문자열을 제공합니다.
AechoLiu

2
는 20146.0._173502를 나에게 반환합니다 (체코 로캘)
Muflix

2
win7 64bit 궁극의, 부정확 한 시간 : 20140.01_131612, (2014.10.26_131612)
waza123

66

다음은 로그 파일 이름을 생성하는 방법입니다 ( 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
...

5
로케일 독립적 타임 스탬프 생성에 대한 질문은 SO에 대한 최상의 답변입니다.
Mike Campbell

2
대박! 이것을 해결책으로 표시하는 방법이 있어야합니다
Rado

49

나는 보통 날짜 / 시간 문자열이 필요할 때마다 이렇게한다 :

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 

7
깨끗한 타임 스탬프 (공백 또는 기타 문자 없음)가 필요할 때 가장 우아한 솔루션
jvdneste

1
MRT 공유에 대한 더 많은 @jvdneste 감사에 동의 할 수 없습니다
this.user3272243

1
절대적으로 훌륭하고 효과적입니다. [필요한 구문은 매우 혼란 스럽지만 포스터의 문제는 거의 없습니다.]
JosephDoggie

38

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을 사용하여 날짜 / 시간을 얻을 수 있다면 배치 파일을 사용하는 이유는 무엇입니까?하지만 몇 가지 명백한 이유는 다음과 같습니다. 배치 파일을 사용하여 구식 방식을 사용하거나 (b) 기존 스크립트를 업데이트하고 모든 것을 PS로 포팅하고 싶지 않습니다.


(a) 내 경우에는 이것이 완벽하게 작동합니다 (박쥐는 내 환경에만 해당되지만 다른 PC에 로케일이 혼합되어 있습니다). 감사합니다!
ccalboni

30

나는 오늘이 문제를 겪고 그것을 해결했다.

SET LOGTIME=%TIME: =0%

공백을 0으로 바꾸고 기본적으로 시간이 0 인 패드입니다.

빠른 검색 후 명령 확장이 필요한지 찾지 못했습니다 (여전히 SETLOCAL DISABLEEXTENSIONS와 함께 작동).


자, 변수의 대체. 이제-콜론 ( :) 을 대체하는 방법 ?
Tomasz Gandor

@TomaszGandor이 나를 위해 작동합니다 echo %TIME: =:%하지만이 경우 어쩌면 탈출 시도하지 :A를을 ^같이 echo %TIME: =^:%(또한 나를 위해 작동합니다).
opello

1
단순화를 위해 +1 콜론은 파일 이름에 유효하지 않습니다. set = Time = :: = % 삭제합니다. 공백으로 0을 대체하고, 콜론을 삭제하고, 단일 명령문에서 6 자로 자르므로 (소수 부분 삭제)? 2 ~ 3 줄이 걸리더라도 그렇게 큰 문제는 아닙니다. 그냥 궁금 해서요
riderBill

내가 아는 것은 아닙니다. 하나를 찾으면 후속 조치를 취하십시오!
opello

21

언급했듯이 날짜 및 시간을 구문 분석하는 것은 현재 사용자가 사용중인 형식 (예 : 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

3
내가 찾던 것. 모든 로케일 설정에서 작동하는 것. 감사!
Lost_DM 2016 년

우리가 다루어야 할 "현대 Windows 시스템"의 경우 +1 : 농담은 제쳐두고, 매우 독창적이며, 당신이 말했듯이 휴대용, 문제를 다루는 방법입니다.
Zach Young

9
이것은 끔찍한 해결책입니다. 실패하면 전역 설정이 영구적으로 변경됩니다. 또한 다른 응용 프로그램과의 경쟁 조건을 소개합니다.
MikeKulls

reg query "HKCU\Control Panel\International" /v sShortDate레지스트리 설정을 변경하지 않고도 해당 부분을 사용할 수 있습니다 (리더에게 왼쪽 운동!).
tricasse

9

다음은 직접적인 답변이 아니라 가까운 답변 일 수 있습니다.

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

그런 다음 % 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

시간이 12 미만인 경우 mydate = % date : / = % set mytime = % time :: = % set mytime = % mytime : = 0 % set mytimestamp = % mydate : = _ % _ % mytime :. = _ 설정 %
ragche

8
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%

6

offset:length지원 서식 SET패드에 당신을 허용하지 않습니다 Windows의 명령0 당신이에 관심이있을 것 같은.

그러나 BATCH 스크립트를 코딩하여 시간이 미만인지 확인 10하고
그에 따라 다른 시간을 채울 수 있습니다.echo 문자열로 채울 수 있습니다.

이 링크 에서 SET명령에 대한 정보를 찾을 수 있습니다.


다른 프로그래밍 방법으로 변경하여 여기로 이동할 수도 있습니다.

유닉스 bash (Windows의 Cygwin에서 사용 가능)에서 간단히 말하면,

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

그리고 항상 올바르게 패딩됩니다.


6

나는 이렇게했다 :

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


영어 서버에서 실행됩니다 (OS 이름 : Microsoft (R) Windows (R) Server 2003 Standard x64 Edition, OS 버전 : 5.2.3790 서비스 팩 2 빌드 3790)
Ice

1
독일 서버에서도 테스트되었습니다 (Betriebssystemname : Microsoft® Windows Server® 2008 Enterprise, Betriebssystemversion : 6.0.6002 서비스 팩 2 빌드 6002)
Ice

1
이것도 괜찮습니다. (Betriebssystemname : Microsoft Windows Server 2012 Standard, Betriebssystemversion : 6.2.9200 Nicht zutreffend Build 9200)
Ice

4
::========================================================================  
::== 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
원하는대로 출력 형식을 지정할 수 있습니다.


4

이 bat 파일 (datetimestr.bat로 저장)은 날짜 시간 문자열을 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)의 개념을 병합했습니다.

훨씬 짧게 작성할 수 있지만이 긴 버전을 사용하면 코드를 쉽게 읽고 이해할 수 있습니다.


4

나는 배치 파일을 처음 접했고 이것이 내 코드입니다! (왜 그런지 잘 모르겠지만 날짜 / t시간 / t를 함께 결합 할 수 없었고 변수없이 % date %% time %을 직접 사용할 수 없었습니다 ...)

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

그것은 다른 사람들로부터 재사용 된 것입니다 (질문은 파일 형식으로 사용할 형식이 지정된 날짜를 얻는 것이 었습니다).


4

또 다른 쉬운 방법이 있습니다.

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)

3

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%)

특정 지역 설정을 가정합니까?
Peter Mortensen 2016 년

1
에 따르면 ss64.com/nt/syntax-variables.html%TIME%하고 %DATE%변수는 동일한 형식을 사용 TIME하고 DATE, 각각의 명령. 시스템에서 변수가 지역 설정과 일치하지 않습니다.
M. Dudley

3

이 배치 스크립트는 OP가 원하는 것을 정확하게 수행합니다 (Windows XP SP3에서 테스트).

또한 이전에 "jph"로 설명 된 영리한 레지스트리 트릭을 사용했습니다. IMHO는 이전 "yyyy_MM_dd"또는 모든 Windows 시스템 에서 날짜의 100 % 일관된 형식을 얻는 가장 간단한 방법입니다 . 이를 위해 하나의 레지스트리 값을 변경하는 것은 일시적이고 사소합니다. 즉시 되돌리기 전에 몇 밀리 초 동안 지속됩니다.

이 데모 파일을 더블 클릭하면 즉시 데모를 볼 수 있습니다. 명령 프롬프트 창이 나타나고 타임 스탬프가 표시됩니다. . . . .

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

Windows 2019에서도 작동합니다. 나는 :) 그것을처럼, 나는 당신의 솔루션 주변을하겠습니다
user225479

질문, 방금 자정이 지나면 후행 "0"이 출력에서 ​​삭제됩니다. 이유에 대한 아이디어가 있습니까? 스크립트를 사용한 결과는 다음과 같습니다. 타임 스탬프는 ..00_58_07 대신 2019_09_16__0_58_07입니다. 그러나 1시 이후에 예상대로 작동합니다 (출력 : ..01_01_56).
user225479

ELSE 문에 IF % HOUR % == 0 (SET HOUR = 00)을 추가했습니다. 즉 :) 나는 희망을 수정해야
user225479

의견 @ user225479에 감사드립니다. 코드를 수정했습니다. 24 시간 형식으로 변환 된 HOUR 변수의 모든 가능한 순열이 이제 올바르게 작동합니다. 또한 읽기 쉽게 레이아웃을 수정했습니다.
derty2

2
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%

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

2

@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

1

이것은 내 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%

1

나는 받아 들인 대답을 시도했지만 꽤 잘 작동합니다. 불행하게도 미국 시간 형식은 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%

(* 크리스마스 *)


1

아마도 이런 식으로 뭔가 :

@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

1

이와 같은 상황에서는 간단한 표준 프로그래밍 방식을 사용합니다. 알 수없는 엔터티를 구문 분석하는 데 많은 노력을 기울이지 않고 현재 구성을 저장하고 알려진 상태로 재설정하고 정보를 추출한 다음 원래 상태를 복원하면됩니다. 표준 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을 붙여야하지만 그렇지 않습니다. 다행히도 해결 방법이 쉽습니다.


-1 "제로 앞에 0을 추가하는 대신, 기계 구성을 방해하지 않고 임의의 필요에 맞게 변경 한 다음해야 할 일이 있습니까?" 이 접근 방식은이 세상에서 벗어 났으며 상당한 노력이 필요하며 원치 않는 결과가 무한히 발생할 수 있습니다. 그리고 가독성과 표준 예상 코드 동작에 대한 토론조차 시작하고 싶지 않습니다. 명성.
vaitrafra

sTimeFormat시간 형식을 재설정하는 것은 쓸모가 없습니다 . 아니. 후속 콘솔 프롬프트에 영향을 주므로 다음을 사용하여 적용하십시오.for /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ

1

이 스크립트는 WXP 도구를 통해 기본으로 액세스되는 WMI 인터페이스를 사용합니다. WMIC 도구는 Windows XP Professional (Windows 에디션도 지원되지만 도구는 기본적으로 설치되지 않음) 이후 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

1

초기 변수 확장을 피하는 좋은 한 줄 트릭 cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%

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

0

파일 이름에 사용하기위한 숫자 날짜에 대한 매우 간단한 해결책을 보려면 다음 코드를 사용하십시오.

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

0

날짜 명령의 결과를 슬래시로 나눈 다음 각 토큰을 적절한 변수로 옮길 수 있습니다.

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%
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.