[windows] Windows 명령 줄에서 파일 / 폴더 이름으로 사용하기에 적합한 형식으로 현재 날짜 / 시간을 얻으려면 어떻게해야합니까?

업데이트 : 이제 2016 년이기 때문에, 특히에 대한 지역 설정 문제로 인해 이전 버전과 호환되는 강력한 이유가 없다면 PowerShell을 사용 date합니다. @npocmaka의 https://stackoverflow.com/a/19799236/8479 참조


파일 이름에 넣을 수있는 형식으로 현재 날짜 시간을 가져 오는 데 사용할 수있는 Windows 명령 줄 설명은 무엇입니까?

예를 들어 이름의 일부로 현재 날짜와 시간을 사용하여 디렉토리를 압축 파일로 압축하는 .bat 파일이 필요합니다 Code_2008-10-14_2257.zip. 기기의 국가 별 설정에 관계없이이 작업을 수행 할 수있는 쉬운 방법이 있습니까?

나는 날짜 형식에 대해 신경 쓰지 않고 이상적으로는 yyyy-mm-dd 일 것이지만 간단한 것은 괜찮습니다.

지금까지 나는 이것을 얻었습니다 Tue_10_14_2008_230050_91.

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code

나는 이것과 함께 살 수 있지만 약간 어색한 것 같습니다. 이상적으로는 더 짧고 앞서 언급 한 형식을 갖는 것이 이상적입니다.

Windows Server 2003 및 Windows XP Professional을 사용하고 있습니다. 이것을 달성하기 위해 추가 유틸리티를 설치하고 싶지 않습니다 (멋진 날짜 형식을 수행하는 것이 있음을 알고 있지만).



답변

MMDDYYYY 형식으로 현재 날짜를 얻으려면 Windows 배치 파일 (.bat)을 참조하십시오 .

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

24 시간 / 군사 형식의 시간을 선호하는 경우 두 번째 FOR 줄을 다음과 같이 바꿀 수 있습니다.

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C :>. \ date.bat
2008-10-14_0642

날짜 / 지역 순서와 관계없이 날짜를 원하면 ISO 순서이므로 “WMIC os GET LocalDateTime”을 소스로 사용할 수 있습니다.

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C :> test.cmd
현지 날짜는 [2012-06-19 10 : 23 : 47.048]입니다.


답변

지역적으로 독립된 날짜 시간 구문 분석

명령 의 출력 형식 %DATE%dir명령은 지역에 따라 다르므로 강력하거나 똑똑하지 않습니다. date.exe ( UnxUtils의 일부)는 생각할 수있는 형식으로 날짜 및 시간 정보를 제공합니다. 로 파일에서 날짜 / 시간 정보를 추출 할 수도 있습니다 date.exe.

예 : (cmd-script에서 % 대신 %% 사용)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503 : 모든 텍스트

date.exe +"Text: %y/%m/%d-any text-%H.%M"
텍스트 : 09 / 12 / 22- 모든 텍스트 -18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 “18:55:03″`

참조 파일의 날짜 / 시간 정보 :
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

CMD 스크립트에서이를 사용하여 년, 월, 일, 시간 정보를 얻습니다.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

CMD 스크립트에서이를 사용하여 필요한 형식의 타임 스탬프를 얻습니다.

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

참조 파일에서 날짜 / 시간 정보 추출

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

날짜 / 시간 정보를 파일에 추가 :

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe는 설치가 필요없는 무료 GNU 도구의 일부입니다 .

참고 : date.exe검색 경로에있는 디렉토리로 복사 하면 Windows 내장 date명령 을 사용하는 다른 스크립트가 실패 할 수 있습니다 .


답변

시간 설정에 의존하지 않는 두 가지 방법 (둘 다 : 현지화와 독립적으로 데이터 / 시간을 얻는 방법 🙂 . 그리고 둘 다 요일을 가지며 관리자 권한이 필요하지 않습니다! :

  1. MAKECAB- 모든 Windows 시스템에서 작동합니다 (빠르지 만 작은 임시 파일을 만듭니다) (foxidrive 스크립트).

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
       set "current-date=%%e-%%b-%%c"
       set "current-time=%%d"
       set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    

    get-date 함수에 대한 자세한 정보 .

  2. ROBOCOPY -Windows XP 및 Windows Server 2003의 기본 명령은 아니지만 Microsoft 사이트에서 다운로드 할 수 있습니다 . 그러나 Windows Vista 이상의 모든 기능이 내장되어 있습니다.

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
     set "dow=%%D"
     set "month=%%E"
     set "day=%%F"
     set "HH=%%G"
     set "MM=%%H"
     set "SS=%%I"
     set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

    그리고 다른 Windows 스크립트 언어를 사용하는 세 가지 방법이 더 있습니다. 그들은 당신에게 더 많은 유연성을 제공 할 것입니다.

  3. JScript / 배치 하이브리드 (로 저장해야 함 .bat) JScript는 NT 및 그 이상의 모든 시스템에서 Windows Script Host 의 일부로 제공됩니다 ( 레지스트리를 통해 비활성화 할 수는 있지만 드문 경우입니다 ).

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
            // Today date time which will used to set as default date.
            var todayDate = new Date();
            todayDate = todayDate.getFullYear() + "-" +
                           ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                           ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                           ("0" + todayDate.getMinutes()).slice(-2);
    
            return todayDate;
        }
    
    WScript.Echo(GetCurrentDate());
    
  4. VSCRIPT / BATCH 하이브리드 JScript와 동일한 경우 ( 일시 파일을 사용하지 않고 배치 파일 내에 VBScript를 포함하고 실행할 수 있습니까? ) 하이브리드 화가 그다지 완벽하지는 않습니다.

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date,1),", ","-")
    
  5. PowerShell -Microsoft에서 .NET을 다운로드 한 모든 시스템 ( v1 , v2 , v3 (Windows 7 이상에만 해당))에 설치할 수 있습니다 . 기본적으로 Windows 7 / Windows Server 2008 이상의 모든 항목에 설치됩니다.

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    배치 파일에서 사용하려면

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. 자체 컴파일 된 jscript.net/batch (.NET이없는 Windows 시스템을 본 적이 없으므로 이식성이 뛰어납니다.)

    @if (@X)==(@Y) @end /****** silent line that start JScript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    
    :: Searching the latest installed .NET framework
    for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Logman 이것은 년과 요일을 얻을 수 없습니다. 비교적 느리고 임시 파일을 작성하며 logman이 로그 파일에 넣는 시간 소인을 기반으로합니다. Windows XP 이상에서 모든 작업을 수행합니다. 아마 나를 포함하여 다른 사람이 사용하지는 않지만 한 가지 더 방법입니다 …

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    
  8. WMIC의 또 다른 방법 은 일주일과 요일을 제공하지만 밀리 초는 아닙니다 (밀리 초의 경우 foxidrive의 답변 확인).

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. TYPEPERF 를 사용하여 다른 언어 설정과 최대한 빠르게 호환되도록 노력하십시오.

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA를 사용하면 위의 # 3에서 설명한 JScript 메서드와 유사한 JavaScript 메서드를 호출 할 수 있습니다. 월 값이 포함 된 JavaScript의 Date 객체 속성은 1에서 12가 아닌 0에서 11까지 번호가 매겨집니다. 따라서 값 9는 10 월을 의미합니다.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    

답변

다음은 로컬 독립적으로 작동하는 alt.msdos.batch.nt의 변형입니다.

이를 텍스트 파일 (예 : getDate.cmd)에 넣습니다.

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'%
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

코드가 stderr에 sans error msg를 작동 시키려면 %% a, %% b 및 %% c에 대한 변수 할당을 작은 따옴표로 추가해야했습니다. “set = 20″과 같은 항목이 실행되는 루핑 / 구문 분석에서 한 단계에서 내 로케일 (PT)이 오류를 일으켰습니다. 따옴표는 할당 문의 왼쪽에 대해 토큰을 생성합니다 (비어 있음).

단점은 지저분한 로케일 변수 이름 : ‘yy’, ‘mm’및 ‘dd’입니다. 그러나, 누가 걱정하는지!


답변

나는 이것을 사용한다 (다시 독립 지역 (영국)이 아님)

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%


답변

이 코드의 처음 네 줄은 Windows XP Professional 이상에서 신뢰할 수있는 YY DD MM YYYY HH Min Sec 변수를 제공합니다.

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause


답변

불행히도 이것은 지역 환경에 영향을 미치지 않지만 원하는 것을 수행합니다.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Wikipedia에서 찾을 수있는 놀라운 것들 .