Potrzebujesz wiodącego zera dla skryptu wsadowego przy użyciu zmiennej% time%


26

W skrypcie DOS natrafiłem na błąd, który używa danych daty i godziny do nazewnictwa plików. Problem polegał na tym, że skończyłem z luką, ponieważ zmienna czasu nie zapewniała automatycznie wiodącego zera dla godziny <10. Więc uruchomienie> echo% time% zwraca: „9: 29: 17.88”.

Czy ktoś zna sposób warunkowego wypełnienia zer wiodących, aby to naprawić?

Więcej informacji: Polecenie zestawu moich plików to:

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

co kończy się na: C: \ Temp \ robolog_20100602_ 93208.log (dla 9:23 rano).

To pytanie jest związane z tym .

Dzięki


Możliwe jest uzyskanie wartości godziny wypełnionej ... TOKENS FOR / F = 1 DELIMS =: "%% A IN ('TIME / T') DOSTAĆ GG = %% A, a następnie wymienić% czas: ~ 0,2% z% HH% liczyłem na bardziej kompaktowe rozwiązanie, ale to zadziała.
Ira

„Bardziej kompaktowym” rozwiązaniem byłoby coś w innym języku (powershell? Python? Perl? WSH?).
grawity

Przełączono, aby zaznaczyć odpowiedź Jesse jako rozwiązanie, którego używam. Działa zarówno z czasem przedpołudniowym, aby uzupełnić w / wiodącym 0, a także z czasem wojskowym po południu.
Ira

Odpowiedzi:


60

Bardzo prostym sposobem jest po prostu zastąpienie wiodącej przestrzeni spacją:
echo %TIME: =0%
wyjścia:
09:18:53,45


1
to działa! myślę, że to najprostsze rozwiązanie ..
aerobrain

Czy można to zrobić również z wieloma postaciami? tj. wszystkie „,”, „” i „:”. Obecnie tworzę zmienne pośrednie, ale oczywiście działa to tylko z powodu niewielkiej liczby zamienników. Więcej byłoby kłopotliwe.
Devolus

1
Używam tego w drugim „krok”, aby zmodyfikować godzinach: set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%Patrz także ss64.com/nt/syntax-replace.html
uchwyt

+1 To jest najkrótsza / najlepsza odpowiedź. Jak użyłem: na set timestring=%TIME: =0%początku wywołania podrzędnego - wtedy po prostu pracuj z nim timestring(lub dowolną zmienną, której używasz).
bshea,

14

Moje rozwiązanie polegało na zastosowaniu następującego pomysłu:

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

Lubię to. Prosty i intuicyjny.
Ken

Działa na nowoczesnych oknach, ale daje błąd składniowy na serwerze 2003!
Dr BDO Adams,

Działa bez zarzutu w 2008+, najbardziej eleganckim rozwiązaniu. Dziękuję Ci.
bjoster

1
but gives syntax error on server 2003- dlaczego dbasz o to w 2016 roku?
Marcin Orłowski

Idealny w wierszu polecenia systemu Windows 10
Mike Upjohn

5

Podobny pomysł do odpowiedzi Dennisa . Problem polega na tym, że szerokość %time%jest zawsze taka sama, więc wstawia spację na początku zamiast zwracać krótszy ciąg.

Możesz się tego pozbyć dzięki for:

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

Reszta jest mniej więcej taka sama.


2
To rozwiązanie działa dla> 10, ale teraz tworzy „010” dla 10: ...
Devolus

3
Odpowiedź Jessego jest prawidłowa ...
Simon Sobisch

To bardzo zła odpowiedź, psuje się, gdy tylko dwie cyfry w ciągu godziny. Nie mogę uwierzyć, że OP to wybrał.
thebunnyrules

3

Korzystając z Jesse's Contribution, właśnie utworzyłem zmienną ze zmodyfikowanym wyjściem. Następnie odwołuję się do tej zmiennej, aby zbudować porcję godzinową.

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

Z oryginalnym źródłem:

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

Dzięki Jesse. Głosowałbym, gdybym miał punkty reputacji.


1

Myślę, że w przypadku najbardziej kompaktowego rozwiązania wdrażającego wszystko powyżej

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

działałoby tutaj bez dodawania nowych wierszy do skryptu. Być może jest mniej elegancki niż wiele rozwiązań dowodzenia, jednak ...


1

Poniższe zawiera jeszcze kilka zdań, ale jest jasne i zrozumiałe. Oszczędza stdout i stderr do oddzielnych plików, każdy ze znacznikiem czasu. Sygnatura czasowa obejmuje rok, miesiąc, dzień, godzinę, minuty i sekundy w tej kolejności. Znaczniki czasu powinny zawsze mieć najistotniejszy składnik daty pierwszy (rok), a najmniej składnik (sekundy) ostatni. Dzięki temu lista plików może być uporządkowana w czasie. Bez zbędnych ceregieli, oto moje rozwiązanie.

: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

To oznacza zero na początku czasu i zajmuje dwie ostatnie cyfry godziny (minuta i druga pozycja początkowa są przesunięte o jedną). Tak więc 3 rano staje się „03”, a następnie „03”, a godzina 15 staje się „015”, a następnie „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

Mniej czytelne:

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
Nie jestem pewien, czy to działa. Jeśli uruchomię „set T = 0% time%” i jest godzina 9:38, echo% T% zwraca: „0 9: 38: 54,21”, a następnie pobranie% T: ~ 1,2% dostaje miejsce, bez wiodącego 0.
Ira

0

Jedna linia kodu zrobi to, czego potrzebujesz:

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

Na przykład używam% Date%, a następnie dodaję wiodące zero do zmiennej, której używam, aby ustalić, czy muszę zamienić wiodącą spację na zero dla% Time%.

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

Tworzy to sortowalny znacznik czasu, a drugi wiersz zapewnia, że ​​nie ma spacji dla jednocyfrowej godziny itp., Aby można go było używać w skryptach:

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

Wydajność:

2018.02.26__9.47.34


0

Dzięki pomocy z góry ... Właśnie tego używam:

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

Następnie mam dzienniki wywoływane w zadaniach Robocopy w następujący sposób:

Istnieje wiele takich:

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

Kończy pracę z tym:

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

COMPLETE_LOG_2018-06-27_10_53_54.log to plik utworzony na końcu i można go sortować według nazwy pliku.


0

Odpowiedź Jessego rozwiązała mój problem zmiany nazwy pliku, eliminując spację w polu godziny. Oto jak ustawiam moje zmienne:

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

Działa jak mistrz; z jakiegoś powodu data nie wymagała takiego samego traktowania, ale myślę, że to zależy od ustawień regionalnych.


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
Chociaż kod jest doceniany, zawsze powinien zawierać towarzyszące mu wyjaśnienie. To nie musi być długo, ale jest oczekiwane.
Peter mówi, że przywróć Monikę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.