[windows] 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을 사용하여 날짜 / 시간을 얻을 수 있다면 배치 파일을 사용하는 이유는 무엇입니까?하지만 몇 가지 명백한 이유는 다음과 같습니다. 배치 파일을 사용하여 구식 방식을 사용하거나 (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