Frage Benötige führende Null für Stapelskript mit% time% Variable


Ich bin in meinem DOS-Skript auf einen Fehler gestoßen, der Datums- und Uhrzeitdaten für die Dateibenennung verwendet. Das Problem war, dass ich mit einer Lücke endete, weil die Zeitvariable nicht automatisch die führende Null für die Stunde <10 lieferte. Also läuft> echo% time% gibt zurück: '9: 29: 17.88'.

Kennt jemand eine Möglichkeit, führende Nullen bedingt zu füllen, um das zu beheben?

Mehr Info: Mein Dateinamenssetzbefehl ist:

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

was schließlich lautet: C: \ Temp \ robolog_20100602_ 93208.log (für 9:23 Uhr morgens).

Diese Frage bezieht sich auf dieses.

Vielen Dank


22
2018-06-02 16:36


Ursprung


Es ist möglich, den gepolsterten Stundenwert zu erhalten ... FOR / F "TOKEN = 1 DELIMS =:" %% A IN ('ZEIT / T') DO SET HH = %% A dann% -Zeit ersetzen: ~ 0,2% Mit% HH% hatte ich auf eine kompaktere Lösung gehofft, aber das wird funktionieren. - Ira
Eine "kompaktere" Lösung wäre etwas in einer anderen Sprache (Powershell? Python? Perl? WSH?). - grawity
Geschaltet, um Jesses Antwort als die Lösung zu markieren, die ich verwende. Es funktioniert mit beiden Vor-Mittag Zeiten zu Pad w / führende 0 und auch nach dem Mittag militärische Zeit. - Ira


Antworten:


Ein sehr einfacher Weg ist, das führende Leerzeichen einfach durch Null zu ersetzen:
echo %TIME: =0%
Ausgänge:
09:18:53,45


57
2017-08-14 08:25



Es klappt! Das ist die einfachste Lösung, denke ich .. - aerobrain
Kann dies auch mit mehreren Charakteren gemacht werden? i.E. alle ',', '' und ':'. Momentan erstelle ich Zwischenvariablen, aber das funktioniert natürlich nur wegen der wenigen Ersatzzahlen. Für mehr wäre es umständlich. - Devolus
Ich verwende das in einem zweiten "Schritt", um die Stunden zu ändern: set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME% Siehe auch ss64.com/nt/syntax-replace.html - handle
+1 Dies ist die kürzeste / beste Antwort. Wie ich benutzt habe: set timestring=%TIME: =0% früh im Unterruf - dann arbeite einfach mit timestring stattdessen (oder welche Variable Sie verwenden). - bshea


Meine Lösung war die folgende Idee:

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

13
2018-01-10 00:02



Ich mag das. Einfach und intuitiv. - Ken
Funktioniert mit modernen Windows, gibt aber Syntaxfehler auf Server 2003! - Dr BDO Adams
Funktioniert tadellos auf 2008+, eleganteste Lösung. Vielen Dank. - bjoster
but gives syntax error on server 2003 - Warum interessiert dich das 2016? - Marcin Orlowski
Perfekt für Windows 10 Eingabeaufforderung - Mike Upjohn


Ähnliche Idee zu Dennis 'Antwort. Das Problem ist, dass die Breite von %time% ist immer gleich, also fügt es am Anfang ein Leerzeichen ein, anstatt eine kürzere Zeichenfolge zurückzugeben.

Sie können das mit loswerden for:

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

Der Rest ist mehr oder weniger dasselbe.


5
2018-06-06 23:43



Diese Lösung funktioniert für> 10 aber jetzt erstellt '010' für 10: ... - Devolus
Die Antwort von Jesse ist die richtige ... - Simon Sobisch
Dies ist eine sehr schlechte Antwort, es bricht zusammen, sobald zwei Ziffern in der Stunde sind. Ich kann nicht glauben, dass das OP es ausgewählt hat. - thebunnyrules


Mit Jesse's Contribution habe ich gerade eine Variable mit der modifizierten Ausgabe erstellt. Dann referenziere ich diese Variable, um den Stundenanteil aufzubauen.

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

Mit der ursprünglichen Quelle:

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

Danke Jesse. Ich hätte gewählt, wenn ich die Reputationspunkte hätte.


3
2018-04-18 17:39





Für die kompakteste Lösung, die alles oben implementiert, denke ich

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

würde hier funktionieren, ohne dem Skript neue Zeilen hinzuzufügen. Es ist vielleicht weniger elegant als mehrere Befehlslösungen, obwohl ..


1
2017-12-24 00:51





Das Folgende nimmt einige Zeilen mehr, ist aber klar und verständlich. Es speichert stdout und stderr zu separaten Dateien mit jeweils einem Zeitstempel. Der Zeitstempel enthält Jahr, Monat, Tag, Stunde, Minute und Sekunde in dieser Reihenfolge. Zeitstempel sollten immer die signifikanteste Datumskomponente (Jahr) und die letzte Komponente (Sekunden) haben. Dadurch können die Dateien in der richtigen Reihenfolge angezeigt werden. Ohne weiteres, hier ist meine Lösung.

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

1
2017-08-07 22:52





Dies bringt eine Null auf den Beginn der Zeit und nimmt die letzten zwei Ziffern der Stunde (die Minuten- und Sekundenstartpositionen werden um eins verschoben). So wird 3 Uhr morgens "03" und dann "03" und  Stunde 15 wird zu "015" und dann zu "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

Weniger lesbar:

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

0
2018-06-02 21:00



Ich bin mir nicht sicher, ob das funktioniert. Wenn ich 'set T = 0% time%' und es ist 9:38 Uhr, gibt Echo% T% zurück: '0 9: 38: 54.21', dann nimmt% T: ~ 1,2% erhält das Leerzeichen, keine führende 0. - Ira


Eine Codezeile wird tun, was Sie brauchen:

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

Zum Beispiel verwende ich% Date% und füge dann eine führende Null zu einer Variablen hinzu, die ich verwende, um zu bestimmen, ob ich das führende Leerzeichen durch eine Null für% Time% ersetzen muss.

    ::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
2017-08-09 18:39