it-swarm.com.de

Generieren Sie im Batch-Skript einen eindeutigen Dateinamen mit Zeitstempel

In meiner .bat-Datei möchte ich einen eindeutigen Namen für Dateien/Verzeichnisse basierend auf Datum und Uhrzeit generieren.

z.B.

Build-2009-10-29-10-59-00

Das Problem ist, dass %TIME% nicht geeignet ist, da es Zeichen enthält, die im Dateinamen unzulässig sind (z. B. :).

Gibt es so etwas wie tr in Batch-Dateien?

Irgendwelche anderen Ideen, wie Sie dieses Problem lösen können (für das außer dem Batch-Interpreter keine zusätzlichen Befehlszeilen-Dienstprogramme erforderlich sind)?

36
Assaf Lavie

BEARBEITEN: Besser ist es, eine Datums-/Zeitzeichenfolge zu verwenden, die ein definiertes und unverändertes Format hat, anstatt die vom Gebietsschema definierten Werte von %date% und %time% zu verwenden. Sie können Folgendes verwenden, um es zu erhalten:

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x

Es ergibt so etwas wie 20120730203126.530000+120 und Sie können dies verwenden, um Ihre Dateinamen zu erstellen.


(Alte Antwort unten)

Sie können das beleidigende Zeichen einfach durch eine leere Zeichenfolge ersetzen:

echo %time::=%

Die Syntax %var:str1=str2% nimmt die Umgebungsvariable (oder im Fall von %TIME% Pseudovariable) und ersetzt str1 durch str2. Wenn nach dem Gleichheitszeichen nichts folgt, wird str1 einfach gelöscht.

In Ihrem speziellen Fall würden Sie wahrscheinlich Folgendes wünschen:

rem cut off fractional seconds
set t=%time:~0,8%
rem replace colons with dashes
set t=%t::=-%
set FileName=Build-%date%-%t%

Eine etwas brutalere Methode, falls Sie nicht wissen, ob Doppelpunkte verwendet werden (die Reihenfolge wäre jedoch dieselbe):

set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%

Bei allen vorangehenden Dingen wird jedoch davon ausgegangen, dass Sie das Standard-Datumsformat ISO 8601 verwenden, d. H. e. 2009-10-29. Ich gehe davon aus, dass dies ganz normal ist, aber manche Leute verwenden andere Formate, seien Sie also vorsichtig. Aber da Sie nicht nach dem Datum gefragt haben, ging ich davon aus, dass Sie dort kein Problem hatten.

41
Joey

Folgen Sie den Antworten von @ Joey und @Kees, um sie sofort nutzbar zu machen.

In der Kommandozeile:

FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

In einer BAT-Datei:

@echo off
REM See http://stackoverflow.com/q/1642677/1143274
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%

Beispielausgabe:

2014-10-21_16-28-52
17
Evgeni Sergeev

Ich benutze dies, um einen eindeutigen Dateinamen für die Ausführung der Batchdatei zu erstellen.

REM ****Set up Logging ****
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="PCCU_%mydate%_%mytime%.log"
Echo.  >>%Logname% 2>>&1
Echo.=================== >>%Logname% 2>>&1

Ich musste die Zeile hinzufügen

set mytime=%mytime: =0%

da ich das gleiche Problem hatte, als vor 10 Uhr ein Leerzeichen eingegeben wurde, bekomme ich jetzt 09 statt 9. Ich verwende auch die Variablen% mydate% und% mytime% für andere Dateien, die ich mit diesem Skript erstellt habe, damit sie alle haben der gleiche Datumszeitstempel.

3
Ben

Diese Routine, eigentlich nur eine Zeile, funktioniert auf jedem System, das auf ein beliebiges Datums- oder Zeitformat eingestellt ist.
Die Ausgabe von Zeile 1 hat das Format 20140725095527.710000 + 120

Das tatsächliche Datums-/Zeitformat, das Sie benötigen, wird in Zeile 2 festgelegt. Sie können es beliebig formatieren.
Fügen Sie einfach die resultierende DateTime-Variable zu Ihrem Dateinamen hinzu. Dateiname_% DateTime% .log

::=======================================================================
::== CREATE UNIQUE DateTime STRING IN FORMAT YYYYMMDD-HHMMSS
::=======================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a

SET DateTime=%DTS:~0,8%-%DTS:~8,6% | REM OUTPUT = 20140725-095527
2
Kees

Ich habe dieses universell gemacht. Will funktioniert in jeder Umgebung, in der das Datumsformat unterschiedlich sein kann.

echo off
if not exist "C:\SWLOG\" mkdir C:\SWLOG
cd C:\SWLOG\
cmd /c "powershell get-date -format ^"{yyyyMMdd-HHmmss}^""> result.txt
REM echo %time% > result.txt
type result.txt > result1.txt
set /p filename=<result1.txt
echo %filename%
del C:\SWLOG\result.txt
del C:\SWLOG\result1.txt
2
Ariful Huq

Damit der Code im vorherigen Beispiel funktioniert, musste ich mich leicht anpassen. Ich vermute, das liegt daran, dass mein PC ein britisches Datumsformat verwendet. Um "2014-04-19" in mydate zurück zu bekommen, brauchte ich:

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)

Unten habe ich mein gesamtes Skript eingefügt und ein Beispiel für die Verwendung des Dateinamens gegeben

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%

set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log"
Robocopy  \\sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee 

Hoffe das hilft!

1
Stewart

Wenn Sie garantieren können, dass auf dem Computer eine bestimmte Version von Python installiert ist und auf die PATH des Systems zugegriffen werden kann, können Sie diese Lösung verwenden:

FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print 
datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO (
SET TIMESTAMP=%%F
)
ECHO %TIMESTAMP%

Dadurch wird die aktuelle lokale ISO-8601 (ish) -Datendarstellung in eine %TIMESTAMP%-Variable geschrieben und wie folgt ausgegeben:

2017-05-25T14:54:37

Ich habe replace(':', '-') nach isoformat() gesetzt, damit die resultierende Zeichenfolge in einem Dateinamen oder Verzeichnis verwendet werden kann, da : ein verbotenes Zeichen im Windows-Dateisystem ist.

0
Colin Basnett