강좌 / 팁

윈 도 우 배치파일로 원하는 날짜 포멧 조합하기

2022.02.17 13:36

지후빠 조회:1609 추천:11

2022-02-19 16:40 - 아래쪽에 수정, 보충합니다.^^

2022-02-21 13:10 - 하단에 doff.exe 외부 유틸 추가합니다.


안녕하세요?

히이이잌님의 게시물 https://windowsforum.kr/lecture/17551740 을 보고 아이디어가 떠올라서... 히이이잌님 감사합니다.^^

이렇게 저렇게 검토해보니 비록 레지스트리에 쓰기를 하지만 히이이잌님 방법이 훌륭하다는 결론입니다.

 

제어판 날짜 형식 설정; 순서등을 바꾸면 다양한 형태로 표시될 수 있습니다.

fd-1-1.png

 

각 PC에서 윈도우 날짜 설정에 따라서 %DATE% 출력 값이 상이하여 배치파일로 일정한 형태의 날짜를 구하기가 어렵습니다.

(영어, 한글 윈도우에 따라 날짜 표현 정의-레지스트리-가 다르기도 합니다.)

외부 명령어 wsh, powershell, wmic 들을 이용하여 구하는 방법이 있겠지만 PE에서 외부툴이 없는 경우 등을 생각하여 배치파일로만...

- 외부툴 이용 참고; https://stackoverflow.com/questions/1192476/format-date-and-time-in-a-windows-batch-script

 

HKCU\Control Panel\International\sShortDate 키 값 형태에서 yyyy-MM-dd ddd (2022-02-17 목) 각 항목 자체를 변수로 이용하는 것입니다.

레지스트리 쓰기가 없어서 관리자 권한을 요구하지 않습니다.

 

1. FormatDate2.cmd

@echo off&setlocal enabledelayedexpansion

 

for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v "sShortDate"') do set $sS=%%b

set $sS=!$sS:/= !& set $sS=!$sS:-= !& set $dD=!DATE:/= !& set $dD=!$dD:-= !

for %%a in (%$sS%) do set /a i+=1&set $i!i!=%%a

for %%a in (%$dD%) do set /a j+=1&call set %%$i!j!%%=%%a

 

if defined yyyy (set $y=%yyyy%) else if defined yy set $y=%yy%

if defined mm (set $m=%mm%) else if defined m set $m=%m%

if defined dd (set $d=%dd%) else if defined d set $d=%d%

if defined ddd (set $w=%ddd%) else if defined dddd set $w=%dddd%

 

echo %$y%-%$m%-%$d%-%$w%

echo %$y%.%$m%.%$d%.[%$w%]

pause

 

최종 변수 $y $m $d $w 를 modify 하면 원하는 결과를 얻을 수 있습니다.

FormatDate2.jpg

 

레지스트리 sShortDate 값에 알파벳, -, /, (스페이스) 정도만 있다고 생각하여 만들어서 특별한 기호 등이 있을때는 수정이 필요할 것 같습니다.

혹시 자주 사용하는 형태에서 에러가 발생하면 댓글에 알려주시면 적용해보겠습니다.

 

출력형태는 원하시는 형태로 수정하실 수 있습니다.

예를 들면, yy 형태인데 2022 형태로 출력을 고정하고 싶을 때 후반부에 set $y=20!$y!& set $y=!$y:~-4! 정도를 추가할 수 있겠습니다.

 

점심 시간에 궁금하여 탐구 목적으로 해봤습니다. 아직 식사 전이라 이만 줄이고, 댓글 등을 보고 필요하면 더 추가하겠습니다.

즐거운 하루 되십시오.~


 

검색해보니 오래전부터 문제거리였나 봅니다. 다양한 방법이 잘 정리된 링크입니다.

- https://ss64.com/nt/syntax-getdate.html

 

각 나라마나 날짜를 표기하는 형태가 다양하네요. https://ss64.com/nt/date.html

- 요약하면, 0123456789-/. 조합으로 표현하고 요일이 추가되기도 합니다.

 

영어 윈도우에서는 M/d/yy 로 설정되어 있어도 Sat 02/19/2022 로 출력이되고 (영어 PE에서)

러시아 윈도우에서는 dd/MM/yyyy 로 되어 있고 19.02.2022 로 출력됩니다.

한글 윈도우에서는 yyyy-MM-dd 로 되어 있고 2022-02-19 로 출력됩니다.

- 영어에서 레지스트리 형태와 다르게 출력되는 것이 문제네요.

- 또 추가 문자들을 사용하면 위 방법으로 문제됩니다. 예) yyyy-MM-dd '['ddd']'

 

일반적인 경우에 좀 더 문제가 발생하지 않도록 개선하였습니다.

 

2. FormatDate3.cmd

@echo off&setlocal enabledelayedexpansion

 

for /f "skip=2 tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v "sShortDate"') do call :strTrim "%%b" _sS

set _sS=!_sS:-= !& set _sS=!_sS:/= !& set _sS=!_sS:.= !& set _dD=!DATE:-= !& set _dD=!_dD:/= !& set _dD=!_dD:.= !

if "%_sS:ddd=%"=="%_sS%" if %_dD:~0,1% gtr 9 set _sS=ddd %_sS%

for %%a in (%_sS%) do set /a i+=1&set _i!i!=%%a

for %%a in (%_dD%) do set /a j+=1&call set %%_i!j!%%=%%a

 

if defined yy (set _y=%yy%) else set _y=%yyyy%

if defined mm (set _m=%mm%) else set _m=%m%

if defined dd (set _d=%dd%) else set _d=%d%

if defined ddd (set _w=%ddd%) else set _w=%dddd%

 

echo %_y%-%_m%-%_d%-%_w%

echo %_y%.%_m%.%_d%.[%_w%]

 

endlocal & pause & exit /b

 

:strTrim

setlocal enabledelayedexpansion

set "_val=yMd-/. " & set "_str=%~1"

:strTrim_Loop

set "_s1=!_str:~%i%,1!"

if not "!_s1!"=="" (if not "!_val:%_s1%=!"=="%_val%" set _valid=!_valid!%_s1%) & set /a i+=1 & goto :strTrim_Loop

endlocal & set %2=%_valid%

goto :eof

 

영어 윈도우에서 테스트

fd-1-en.png

 

러시아 윈도우에서 테스트

fd-1-ru.png

 

한글 윈도우에서 테스트

fd-1-ko.png

 

배치파일 스크립트 간단하게 설명

 

for /f "skip=2 tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v "sShortDate"') do call :strTrim "%%b" _sS

- 레지스트리에서 sShortDate 값을 불러와서 필요한 "yMd-/. " 문자만 남기고 제거 (:strTrim 함수)

 

set _sS=!_sS:-= !& set _sS=!_sS:/= !& set _sS=!_sS:.= !& set _dD=!DATE:-= !& set _dD=!_dD:/= !& set _dD=!_dD:.= !

- 구분자 "-/."를 공백으로 변환

 

if "%_sS:ddd=%"=="%_sS%" if %_dD:~0,1% gtr 9 set _sS=ddd %_sS%

- 영어 윈도우 ddd, dddd 포맷이 없을때 요일 표시되는 것 고려

 

for %%a in (%_sS%) do set /a i+=1&set _i!i!=%%a

for %%a in (%_dD%) do set /a j+=1&call set %%_i!j!%%=%%a

- 레지스트리 각 항목(변수로 사용)과 날짜 출력 각 항목(값으로 사용) 매치시키기

 

if defined ~~~

- _y _m _d _w 변수에 년 월 일 요일 할당

 

먼저 올린 내용에 부족한 점이 있어서 보충하였습니다. 즐거운 주말되시길 바랍니다. -꾸~벅-


내부 명령어로만 해결하는 것이 목적이라서 올리지 않았는데 필요하신 분 계실까봐 추가합니다.

 

3. doff.exe cmd용 외부 유틸

- https://ss64.com/nt/syntax-getdate.html 아래쪽에 위치합니다.

 

(사용예) 도움말은 doff.exe -h

d:\>doff.exe

20220221131237

d:\>doff yy-mm-dd

22-02-21

d:\>doff mm/dd/yyyy

02/21/2022

 

@echo off

for /f "tokens=1-3 delims=/ " %%a in ('doff mm/dd/yyyy -1') do (

set mm=%%a

set dd=%%b

set yyyy=%%c)

rename httpd-access.log httpd-access-%yyyy%%mm%%dd%.log

 

번호 제목 글쓴이 조회 추천 등록일
[공지] 강좌 작성간 참고해주세요 gooddew - - -
4083 윈 도 우| 인터넷에 연결하지 않고도 Windows 11 장치를 설정할 수 있... VᴇɴᴜꜱGɪ 1468 8 02-23
4082 윈 도 우| 이 앱이 디바이스를 변경할 수 있도록 허용하시겠어요? [4] 하늘은높고 1402 10 02-22
4081 윈 도 우| (수정) Extd 한글 설명서 [명령_문법 부분에 대하여 자세한... [4] 슈머슈마 874 6 02-21
4080 윈 도 우| [자작] Open the Folder - 우클릭 [10] 배워요 1651 14 02-20
» 윈 도 우| 배치파일로 원하는 날짜 포멧 조합하기 [6] 지후빠 1609 11 02-17
4078 윈 도 우| PE에서 드라이버가 설치 되기위해 필요한 파일 [10] @카리스마 1716 8 02-17
4077 윈 도 우| 배치파일로 윈도 설정과 관계없이 일정한 날짜 얻기 [6] 히이이잌 927 12 02-16
4076 기 타| RSImageX 기본 파일 구성 [19] suk 2756 33 02-14
4075 윈 도 우| WIM 우클릭 부팅 관련 메뉴 2부 [11] 지후빠 2147 18 02-13
4074 윈 도 우| PE 네트워크 설정하는 방법 2편입니다. [4] PC_Clinic 1177 11 02-12
4073 윈 도 우| WIM(PE) 1회성 부팅; 우클릭 보내기 메뉴에 추가 [16] 지후빠 2817 27 02-11
4072 윈 도 우| AdGuard 사용시 다나와 메뉴 폰트 깨지는 현상 [3] damoa 645 2 02-11
4071 소프트웨어| PE 바탕화면에 바로가기 기능 추가 초 간단 팁 [7] 그루터기 999 9 02-11
4070 소프트웨어| 한글2022 원클릭 설치하기.......CraXicS님 덕분에 가능해... [4] 밤이슬216 6869 12 02-07
4069 윈 도 우| 윈10 화면보호기 설정하는 2가지 방법 ( 배치파일로 설정... 코요88 1154 3 02-07
4068 소프트웨어| 한글 2020 제품키 자동 입력 및 업데이트 통합하기 [30] CraXicS 12023 45 02-06
4067 소프트웨어| GNU GRUB 2.0.6 을 이용한 OS 설치 및 부팅 저장매체 만들기 [9] 메인보드 2221 17 02-02
4066 윈 도 우| Clinic PE 크롬/웨일/엣지에서 확장앱 사용하기 [6] PC_Clinic 1030 8 02-02
4065 윈 도 우| 폴더 잠금용 배치파일 : 사적인 폴더 숨기기 [11] 지후빠 1551 16 02-02
4064 소프트웨어| 일반 키보드를 매크로 키보드처럼 사용하기(feat.Autohotkey) [6] 미유키로즈 1561 3 02-02
XE1.11.6 Layout1.4.8