it-swarm.com.de

Erstellen eines Dateinamens als Zeitstempel in einem Stapeljob

Wir haben einen Batch-Job, der jeden Tag ausgeführt wird und eine Datei in einen Abholordner kopiert. Ich möchte auch eine Kopie dieser Datei erstellen und sie in einem Archivordner mit dem Dateinamen ablegen

 yyyy-MM-dd.log

Was ist der einfachste Weg, dies bei einem Windows-Stapelverarbeitungsvorgang zu tun?

Im Grunde suche ich ein Äquivalent dieses Unix-Befehls:

cp source.log `date +%F`.log
75
Eoin Campbell
CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log

Aber es ist abhängig von der Umgebung. Ich bin nicht sicher, ob %DATE% lokalisiert ist oder von dem für das kurze Datum in Windows festgelegten Format abhängt.

Hier ist eine vom Gebietsschema unabhängige Methode, um das aktuelle Datum aus dieser Antwort zu extrahieren, aber es hängt von WMIC und FOR /F ab:

FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO @SET B=%%A
CP source.log %B:~0,4%-%B:~4,2%-%B:~6,2%.log
94
opello

Dies funktionierte für mich und war eine Dateiname-sichere Lösung (obwohl ein MM-TT-JJJJ-Format generiert wird):

C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%
C:\ set SAVESTAMP=%SAVESTAMP:,=.%.jpg
C:\ echo %SAVESTAMP%
[email protected]

Der erste Befehl nimmt ein DATE und ersetzt / durch -, nimmt die TIME und ersetzt : durch - und fügt sie im Format DATE @ TIME zusammen. Die zweite set-Anweisung entfernt alle Leerzeichen, und die dritte set ersetzt , durch . und fügt die Erweiterung .jpg hinzu.

Der obige Code wird in einem kleinen Skript verwendet, das Bilder von einer IP-Sicherheitskamera zur weiteren Verarbeitung abruft:

:while
set SAVESTAMP=%DATE:/=-%@%TIME::=-%
set SAVESTAMP=%SAVESTAMP: =%
set SAVESTAMP=%SAVESTAMP:,=.%.jpg
wget-1.10.2.exe --tries=0 -O %SAVESTAMP% http://admin:<password>@<ip address>:<port>/snapshot.cgi
timeout 1
GOTO while
43

NUR für French Locale (France) , seien Sie vorsichtig, da / im Datum erscheint:

echo %DATE%
08/09/2013

Für unser Problem der Protokolldatei ist hier mein Vorschlag für French Locale ONLY :

SETLOCAL
set LOGFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set LOGFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set LOGFILE=log-%LOGFILE_DATE%-%LOGFILE_TIME%.txt
rem log-2014.05.19-22.18.txt
command > %LOGFILE%
15
Aubin

Hier ist eine von der Gebietsschema unabhängige Lösung (in eine Datei mit dem Namen SetDateTimeComponents.cmd kopieren):

@echo off
REM This script taken from the following URL:
REM http://www.winnetmag.com/windowsscripting/article/articleid/9177/windowsscripting_9177.html

REM Create the date and time elements.
for /f "tokens=1-7 delims=:/-, " %%i in ('echo exit^|cmd /q /k"Prompt $d $t"') do (
   for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
      set dow=%%i
      set %%a=%%j
      set %%b=%%k
      set %%c=%%l
      set hh=%%m
      set min=%%n
      set ss=%%o
   )
)

REM Let's see the result.
echo %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss%

Ich habe alle meine .cmd-Skripts im selben Ordner abgelegt (% SCRIPTROOT%); Jedes Skript, das Datums-/Uhrzeitwerte benötigt, ruft SetDateTimeComponents.cmd wie im folgenden Beispiel auf:

setlocal

@echo Initializing...
set SCRIPTROOT=%~dp0
set ERRLOG=C:\Oopsies.err

:: Log start time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : Start === >> %ERRLOG%

:: Perform some long running action and log errors to ERRLOG.

:: Log end time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : End === >> %ERRLOG%

Wie das Beispiel zeigt, können Sie SetDateTimeComponents.cmd immer dann aufrufen, wenn Sie die Datums-/Uhrzeitwerte aktualisieren müssen. Wenn Sie das Skript zur Zeitanalyse in seiner eigenen SetDateTimeComponents.cmd-Datei ausblenden, können Sie die unschönen Details ausblenden und Tippfehler vermeiden.

10
totorocat

Dadurch wird sichergestellt, dass die Ausgabe einen zweistelligen Wert hat. Sie können die Ausgabe nach Ihren Wünschen neu anordnen und testen, indem Sie den Diagnoseabschnitt auskommentieren. Genießen!

(Ich habe mir viel von anderen Foren geliehen ...)

:: ------------------ Date and Time Modifier ------------------------

@echo off
setlocal

:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP FOR USE IN APPENDING FILENAMES

:: CREATE VARIABLE %TIMESTAMP%

for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"Prompt $D $T"') do (
   for /f "tokens=2-4 skip=1 delims=/-,()" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)

:: ensure that hour is always 2 digits

if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09


:: --------- TIME STAMP DIAGNOSTICS -------------------------

:: Un-comment these lines to test output

:: echo dayOfWeek = %dow%
:: echo year = %yy%
:: echo month = %mm%
:: echo day = %dd%
:: echo hour = %hh%
:: echo minute = %min%
:: echo second = %sec%
:: echo hundredthsSecond = %hsec%
:: echo.
:: echo Hello! 
:: echo Today is %dow%, %mm%/%dd%. 
:: echo.
:: echo. 
:: echo.
:: echo.
:: pause

:: --------- END TIME STAMP DIAGNOSTICS ----------------------

:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "

endlocal & set timeStamp=%yy%%mm%%dd%_%hh%-%min%-%sec%
echo %timeStamp%
6
Rick Rubino

Ich benutze dies häufig und gebe alles in einen einzigen Kopierbefehl. Die folgende Datei beispiel.txt kopiert als example_YYYYMMDD_HHMMSS.txt und Sie können sie natürlich an Ihr bevorzugtes Format anpassen. Die Anführungszeichen sind nur erforderlich, wenn die Dateispezifikation Leerzeichen enthält. Wenn Sie denselben Datums-/Zeitstempel wieder verwenden möchten, müssen Sie ihn in einer Variablen speichern.

copy "{path}\example.txt" "{path}\_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
5
BeConcise

Da die Idee, %DATE% und %TIME% auseinander zu reißen und wieder zusammenzumachen, anscheinend fragil erscheint, haben wir hier eine Alternative, bei der ein PowerShell-Oneliner verwendet wird:

for /f %i in ('powershell -c "get-date -format yyyy-MM-dd--HH-mm-ss"') do @set DATETIME=%i
set LOGFILE=my-script-%DATETIME%.txt

Referenz für get-date ist hier , mit Formatoptionen für .NET-Stil und UNIX-Stil.

3
tboz203

Erstellen Sie eine Datei mit dem aktuellen Datum als Dateiname (z. B. 2008-11-08.dat)

echo hello > %date%.dat    

Mit dem aktuellen Datum aber ohne "-" (zB 20081108.dat)

echo hello > %date:-=%.dat   
2
RealHowTo

Ich weiß, dass dies ein alter Beitrag ist, aber es gibt eine weit einfachere Antwort (obwohl es vielleicht nur in neueren Versionen von Windows funktioniert). Verwenden Sie einfach den Parameter/t für die Dosierungsbefehle DATE und TIME, um nur das Datum oder die Uhrzeit anzuzeigen und nicht um die Einstellung, wie folgt:

@echo off
echo Starting test batch file > testlog.txt
date /t >> testlog.txt
time /t >> testlog.txt
2
Dean

Sie können einfach das aktuelle lokale Format ermitteln und das Datum in Ihrem Format abrufen. Beispiel:

::for 30.10.2016 dd.MM.yyyy
if %date:~2,1%==. set d=%date:~-4%%date:~3,2%%date:~,2%
::for 10/30/2016 MM/dd/yyyy
if %date:~2,1%==/ set d=%date:~-4%%date:~,2%%date:~3,2%
::for 2016-10-30 yyyy-MM-dd
if %date:~4,1%==- set d=%date:~,4%%date:~5,2%%date:~-2%
::variable %d% have now value: 2016103 (yyyyMMdd)
set t=%time::=%
set t=%t:,=%
::variable %t% have now time without delimiters
cp source.log %d%_%t%.log
2
Adam Silenko

Ich habe ein kleines C-Programm zusammengestellt, um den aktuellen Zeitstempel auszudrucken (locale-safe, keine schlechten Zeichen ...). Dann verwende ich den Befehl FOR, um das Ergebnis in einer Umgebungsvariablen zu speichern:

:: Get the timestamp
for /f %%x in ('@timestamp') do set TIMESTAMP=%%x

:: Use it to generate a filename
for /r %%x in (.\processed\*) do move "%%~x" ".\archived\%%~nx-%TIMESTAMP%%%~xx"

Hier ist ein Link:

https://github.com/HarryPehkonen/dos-timestamp

2
Harry Pehkonen

Vielleicht kann das helfen:

echo off
@Prompt set date=$d$_ set time=$t$h$h$h
echo some log >> %date% %time%.log
exit

oder

echo off
set v=%date%.log
echo some log >> %v%
2
Secko

1) Sie können GNU coreutils herunterladen, das mit dem Datum GNU geliefert wird

2) Sie können VBScript verwenden, um die Datumsverarbeitung in Windows zu vereinfachen:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\test"
Set objFolder = objFS.GetFolder(strFolder)
current = Now
mth = Month(current)
d = Day(current)
yr = Year(current)
If Len(mth) <2 Then
    mth="0"&mth
End If
If Len(d) < 2 Then
    d = "0"&d
End If
timestamp=yr & "-" & mth &"-"& d
For Each strFile In objFolder.Files
    strFileName = strFile.Name
    If InStr(strFileName,"file_name_here") > 0 Then
        BaseName = objFS.GetBaseName(strFileName)
        Extension = objFS.GetExtensionName(strFileName)
        NewName = BaseName & "-" & timestamp & "." & Extension
        strFile.Name = NewName
    End If
Next

Führen Sie das Skript aus als:

c:\test> cscript /nologo myscript.vbs
1
ghostdog74

Ich weiß, dass dieser Thread alt ist, aber ich möchte das hier nur hinzufügen, weil er mir dabei geholfen hat, alles herauszufinden und es ist sauber. Das Schöne daran ist, Sie könnten es in eine Schleife für eine ständig laufende Batch-Datei setzen. Protokoll der Server-Betriebszeit oder so etwas. Dafür benutze ich es sowieso. Ich hoffe das hilft jemandem eines Tages.

@setlocal enableextensions enabledelayedexpansion
@echo off

call :timestamp freshtime freshdate
echo %freshdate% - %freshtime% - Some data >> "%freshdate - Somelog.log"

:timestamp
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
set FreshTime=%hour%:%min%:%secs%

set year=%date:~-4%
set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~7,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
set FreshDate=%month%.%day%.%year%
1
Haxslie

Für große ZIP-Dateien für die Bereitstellung verwende ich Viertelstunden. Niemand sonst auf dieser Seite hatte es zuvor erwähnt, deshalb werde ich mein kleines Skript hier einfügen:

set /a "quarter_hours=%time:~0,2%*4 + %time:~3,2% / 15"
set "Zip_file=release_%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%.%quarter_hours%.Zip"

Es gibt noch keine Viertelstundenstunden von Mitternacht bis 5 Uhr morgens, aber es ist immer noch möglich, so dass Sie mehrmals am Tag mit wenigen Kollisionen eine gestempelte Freigabe erhalten können.

Hoffentlich hilft das.

0
phyatt

Dies funktioniert gut mit (meinem) deutschen Gebietsschema, sollte es möglich sein, es an Ihre Bedürfnisse anzupassen ...

forfiles /p *PATH* /m *filepattern* /c "cmd /c ren @file 
%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%[email protected]"
0
Martin