webentwicklung-frage-antwort-db.com.de

Dateinamen-Zeitstempel im Windows CMD-Stapelskript

Ich habe ein Batch-Skript, das eine Datei ausgibt, und ich versuche sicherzustellen, dass bei jeder Ausführung des Skripts keine vorhandenen Dateien überschrieben werden. Daher versuche ich, einen Zeitstempel darauf zu setzen.

Momentan habe ich folgendes:

set  stamp=%DATE:/=-%_%TIME::=-%

Aber wenn die Zeit zwischen 1 und 9 Uhr morgens liegt, ergibt sich Folgendes:

13-06-2012_ instead of a full 13-06-2012_12-39-37.28

Wie kann ich das beheben?

Ich verwende Windows 7 und die Ausgabe von echo %date% %time% in einem Befehlszeilenfenster lautet (mein Uhrzeitformat für 'kurzes Datum' ist auf 3-Buchstaben-Monate eingestellt):

03-Sep-12 9:06:21.54

Edit: Ich benutze den folgenden Zeitstempel nun schon eine Weile, funktioniert gut.

set timestamp=%DATE:/=-%_%TIME::=-%
set timestamp=%timestamp: =%

Es erzeugte einen Zeitstempel wie: 18-03-2013_13-37-43.26, indem er / und : in %TIME% und %DATE% ersetzt und dann Leerzeichen entfernt wurde. Der Leerraum war in meiner ursprünglichen Frage wirklich das Problem.

17
bryc

Dank einer Antwort auf die Stack Overflow-Frage Das Erstellen eines Dateinamens als Zeitstempel in einem Stapeljob ergab, dass es sich um ein Leerzeichen handelt, das den Dateinamen beendet.

0
bryc

In den ersten vier Zeilen dieses Codes erhalten Sie zuverlässige Variablen unter XP Pro und höher mit WMIC.

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
15
foxidrive

Siehe Stapelüberlauf-Frage Wie erhalte ich die aktuelle Datums-/Uhrzeitangabe in der Windows-Befehlszeile in einem geeigneten Format für die Verwendung in einem Dateinamen?.

Erstellen Sie eine Datei, date.bat:

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a-%%b-%%c)
set mytime=%mytime: =% 
echo %mydate%_%mytime%

Führen Sie date.bat aus:

C:\>date.bat
2012-06-14_12-47-PM

AKTUALISIEREN:

Du kannst es auch mit einer Zeile wie dieser machen:

for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g

10

Hier ist ein Batch-Skript, das ich erstellt habe, um einen Zeitstempel zurückzugeben. Ein optionales erstes Argument kann angegeben werden, um als Feldbegrenzer verwendet zu werden. Beispiel:

c:\sys\tmp> timestamp.bat
20160404_144741
c:\sys\tmp> timestamp.bat -
2016-04-04_14-45-25
c:\sys\tmp> timestamp.bat:
2016: 04: 04_14: 45: 29

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
:: put your desired field delimiter here.
:: for example, setting DELIMITER to a hyphen will separate fields like so:
:: yyyy-MM-dd_hh-mm-ss
::
:: setting DELIMITER to nothing will output like so:
:: yyyyMMdd_hhmmss
::
SET DELIMITER=%1

SET DATESTRING=%date:~-4,4%%DELIMITER%%date:~-7,2%%DELIMITER%%date:~-10,2%
SET TIMESTRING=%TIME%
::TRIM OFF the LAST 3 characters of TIMESTRING, which is the decimal point and hundredths of a second
set TIMESTRING=%TIMESTRING:~0,-3%

:: Replace colons from TIMESTRING with DELIMITER
SET TIMESTRING=%TIMESTRING::=!DELIMITER!%

:: if there is a preceeding space substitute with a zero
echo %DATESTRING%_%TIMESTRING: =0%
2
kapu

Name der Windows-Batchprotokolldatei im Format 2018-02-08_14.32.06.34.log:

setlocal
set d=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%
set t=%time::=.% 
set t=%t: =%
set logfile="%d%_%t%.log"

ping localhost -n 11>%1/%logfile%
endlocal
1
beloblotskiy

In der Vergangenheit habe ich ein .cmd-Skript verwendet, das ich im Internet gefunden habe. Ich hasse die Art und Weise, wie die Lokalisierung normalerweise mit Datumsangaben durcheinander kommt. Wann immer Sie Datumsangaben in Dateinamen haben (oder irgendwo anders, wenn ich so fett sein darf), möchte ich, dass Sie sie im ISO 8601-Format haben möchten:

2015-02-19T14: 54: 51Z

oder etwas anderes, das Y M D H M in dieser Reihenfolge hat, wie z

2015-02-19 14:54

weil es die MDY/DMY-Mehrdeutigkeit behebt und weil es als Text sortierbar ist.

Ich weiß nicht, wo ich das .cmd-Skript erhalten habe, aber es war vielleicht http://ss64.com/nt/syntax-getdate.html , was auf meinem YYYY-MM-DD Windows 8.1 wunderbar funktioniert und bei einer M/D/YYYY Vanilla-Installation von Windows 7. Beide geben dasselbe Format an:

2015-02-09 04:43

0
Mathieu K.

Es will die volle Zeit in DD-MM-YYYY_HH-MM-SS.TT, wobei TT die Ticks ist. Die Ausnahme sagt alles.

0
Cole Johnson
for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time: =0%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g
echo %DateNtime%

Oder von der Befehlszeile aus:

for /f "tokens=2-8 delims=.:/ " %a in ("%date% %time: =0%") do echo %c-%a-%b_%d-%e-%f.%g 

BEARBEITEN: Gemäß den Angaben von Bryce NichtstandardZeit-/Datumsangaben. (03-Sep-12 9:06:21.54)

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-7 delims=.:/- " %%a in ("%date% %time%") do (
  if "%%b"=="Jan" set MM=01
  if "%%b"=="Feb" set MM=02
  if "%%b"=="Mar" set MM=03
  if "%%b"=="Apr" set MM=04
  if "%%b"=="May" set MM=05
  if "%%b"=="Jun" set MM=06
  if "%%b"=="Jul" set MM=07
  if "%%b"=="Aug" set MM=08
  if "%%b"=="Sep" set MM=09
  if "%%b"=="Oct" set MM=10
  if "%%b"=="Nov" set MM=11
  if "%%b"=="Dec" set MM=12
  set HH=0%%d
  set HH=!HH:~-2!
  echo 20%%c-!MM!-%%a_!HH!-%%e-%%f.%%g
)
endlocal
0
James K