% time % 변수를 사용하는 배치 스크립트에 선행 0이 필요합니다.


26

파일 이름 지정에 날짜 및 시간 데이터를 사용하는 DOS 스크립트에서 버그가 발생했습니다. 시간 변수가 시간 <10 동안 자동으로 선행 0을 제공하지 않기 때문에 문제가 발생했습니다. echo % time %는 '9 : 29 : 17.88'을 반환합니다.

누구 든지이 문제를 해결하기 위해 선행 0을 패딩하는 방법을 알고 있습니까?

추가 정보 : 내 파일 이름 설정 명령은 다음과 같습니다

set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

C : \ Temp \ robolog_20100602_ 93208.log (아침 9:23).

이 질문은 이것과 관련 있습니다.

감사


시간 값을 채울 수 있습니다 ... FOR / F "TOKENS = 1 DELIMS = :"%% A IN ( 'TIME / T') DO SET HH = %% A 그런 다음 % time을 대체하십시오 : ~ 0.2 % % HH %로 더 작은 솔루션을 원했지만 이것이 효과가 있습니다.
Ira

"보다 콤팩트 한"솔루션은 다른 언어 (powershell? python? perl? WSH?)로 된 것입니다.
grawity

Jesse의 답변을 내가 사용하는 솔루션으로 표시하도록 전환했습니다. 그것은 정오 시간과 선행 0 / 패드 정오 군사 시간을 모두 사용하여 작동합니다.
이라크

답변:


60

매우 간단한 방법은 선행 공백을 0으로 바꾸는 것입니다
echo %TIME: =0%
.
09:18:53,45


1
작동합니다! 이것은 내가 생각하는 가장 간단한 솔루션입니다.
Aerobrain

여러 문자로도이 작업을 수행 할 수 있습니까? 즉, 모두 ',', ''및 ':'. 현재 중간 변수를 만들지 만 물론 소수의 교체로 인해 작동합니다. 더 많은 것은 성가시다.
Devolus

1
나는 이것을 시간을 수정하기 위해 두 번째 "단계"로 사용하고 있습니다 : ss64.com/nt/syntax-replace.htmlset HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME% 참조
처리

+1 가장 짧거나 가장 좋은 답변입니다. 내가 사용한 방법 : set timestring=%TIME: =0%하위 호출의 초기- timestring대신 (또는 사용하는 모든 변수)로 작업하십시오.
bshea

14

내 솔루션은 다음 아이디어를 사용하는 것이 었습니다.

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

나는 그것을 좋아한다. 간단하고 직관적입니다.
Ken

최신 Windows에서는 작동하지만 서버 2003에서 구문 오류가 발생합니다!
박사 BDO 아담스

가장 우아한 솔루션 인 2008+에서 완벽하게 작동합니다. 고맙습니다.
bjoster

1
but gives syntax error on server 20032016 년에 왜 그렇게 신경 쓰나요?
Marcin Orlowski

Windows 10 명령 프롬프트에서 완벽
Mike Upjohn 6:21의

5

Dennis의 답변과 비슷한 아이디어 . 문제는 너비 %time%가 항상 동일하므로 짧은 문자열을 반환하는 대신 처음에 공백을 삽입합니다.

당신은 그것을 제거 할 수 있습니다 for:

for /f "delims= " %x in ("%time%") do set T=0%x

나머지는 거의 동일합니다.


2
이 솔루션은> 10 이상에서 작동하지만 이제 10 : 10에 '010'을 만듭니다.
Devolus

3
Jesse의 대답은 정답입니다.
Simon Sobisch

이것은 매우 나쁜 대답이며, 시간에 두 자리 숫자가 있으면 즉시 분해됩니다. OP가 선택한 것을 믿을 수 없습니다.
thebunnyrules

3

Jesse의 Contribution을 사용하여 방금 수정 된 출력으로 변수를 작성했습니다. 그런 다음 해당 변수를 참조하여 시간 부분을 만듭니다.

set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log 
pause

원본 출처 :

set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log

고마워 제시. 평판이 좋으면 투표했을 것입니다.


1

위의 모든 것을 구현하는 가장 컴팩트 한 솔루션의 경우

/ F "TOKENS = 1-4 DELIMS = /"%% A IN ( "% DATE %") FOR / F "TOKENS = 1-3 DELIMS = :." %% E IN ( "% TIME : = 0 %") DO SET logfile = C : \ Temp \ robolog _ %% D %% C %% B _ %% E %% F %% G.log

스크립트에 새로운 줄을 추가하지 않고 여기서 작동합니다. 그러나 여러 명령 솔루션보다 우아하지는 않습니다.


1

다음은 몇 줄 더 필요하지만 명확하고 이해할 수 있습니다. stdout과 stderr을 각각 타임 스탬프가있는 별도의 파일에 저장합니다. 타임 스탬프에는 연도, 월, 일,시, 분 및 초가 포함됩니다. 타임 스탬프는 항상 가장 중요한 날짜 구성 요소가 첫 번째 (연도)이고 가장 작은 구성 요소 (초)가 가장 최근이어야합니다. 이를 통해 파일 목록을 시간 순서대로 정렬 할 수 있습니다. 더 이상 고민하지 않고 여기 내 해결책이 있습니다.

:prepare time stamp 
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " "  set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%

:run the program 
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
               2> RunLogs\err.%timeStamp%

0

이것은 시간의 시작 부분에 0을 붙이고 시간의 마지막 두 자리를 취합니다 (분 및 두 번째 시작 위치는 1 씩 이동합니다). 따라서 오전 3 시가 "03"이되고 "03"이되고 시간 15가 "015"가되고 "15"가됩니다.

set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log

덜 읽기 쉽게 :

set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log

1
잘 모르겠습니다. 'set T = 0 % time %'를 실행하고 9:38 AM 인 경우 echo % T %는 '0 9 : 38 : 54.21'을 반환하고 % T : ~ 1,2 %를 차지하면 공간이 나오지 않습니다. 0.
Ira

0

한 줄의 코드로 필요한 작업을 수행 할 수 있습니다.

    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%

예를 들어, % Date %를 사용하고 변수에 선행 0을 추가하여 선행 공간을 % Time %의 0으로 대체해야하는지 여부를 결정합니다.

    ::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    Echo Started on %Date$ at %TimeStamp%

    :: Insert what you are doing here...

    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    ECHO Finished on %Date% at %TimeStamp%

0

이렇게하면 정렬 가능한 타임 스탬프가 생성되고 두 번째 줄은 한 자리 시간 등을위한 공간이 없어서 스크립트에 사용할 수 있도록합니다.

set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%

산출:

2018.02.26__9.47.34


0

위에서 도움을 주셔서 감사합니다 ... 이것이 내가 사용하는 것입니다 :

C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43

그런 다음 Robocopy 작업에서 다음과 같이 로그가 생성됩니다.

이와 같은 많은 것들이 있습니다 :

Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt

이것으로 작업을 종료합니다 :

REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log

COMPLETE_LOG_2018-06-27_10_53_54.log 마지막에 생성 된 파일이며 파일 이름별로 정렬 할 수 있습니다.


0

Jesse의 답변은 시간 필드의 공간을 제거하여 파일 이름 바꾸기 문제를 해결했습니다. 이것이 내가 변수를 설정하는 방법입니다.

for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b

챔피언처럼 작동합니다. 어떤 이유로 날짜에 같은 치료가 필요하지는 않지만 지역 설정에 달려 있다고 생각합니다.


0
    @echo off



    call :PAD aaa,2,0,grw
    echo [[aaa=%aaa%]]
    pause




rem #### Function PAD ####
    goto :PADEND
    :PAD <var>,<length>,<padchar>,<string>
        set padtot=%~2
        set padchar=%~3
        set padString=%~4
        :StartPADLOOP
            call :len lenpadString,%padString%
            if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
            set padString=%padchar%%padString%
            goto :StartPADLOOP
        :EndPADLOOP
        set %~1=%padString%
    GOTO :EOF
    :PADEND


rem #### Function LEN ####
    goto :LENEND
    :LEN <var>,<string>
        set LENtempvar=%~2
        rem echo {{S:%LENtempvar%}}
        set LENCOUNT=0    
        :startLENLOOP
            if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
            rem echo {{A:%LENtempvar%}}
            set LENtempvar=%LENtempvar:~0,-1%
            rem echo {{B:%LENtempvar%}}
            set /a LENCOUNT=LENCOUNT+1
        goto :startLENLOOP
        :endLENLOOP
        set %~1=%LENCOUNT%
    GOTO :EOF
    :LENEND

-2
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y

15.06.2015-03h43m34s-5357

5357-%random%"

5
코드는 이해되지만 항상 함께 설명해야합니다. 오래 걸리지는 않지만 예상됩니다.
피터는 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.