webentwicklung-frage-antwort-db.com.de

So hängen Sie ein Datum in Batchdateien an

Ich habe die folgende Zeile in einer Batch-Datei (die auf einer alten Windows 2000 Box läuft):

7z a QuickBackup.Zip *.backup

Wie füge ich das Datum an die QuickBackup.Zip-Datei an? Wenn ich also die Batchdatei heute ausführen würde, wäre die Datei idealerweise QuickBackup20090514.Zip.

Gibt es eine Möglichkeit, dies zu tun?

41
AngryHacker

Bernhards Antwort brauchte einige Optimierungsarbeiten für mich, da die Umgebungsvariable% DATE% in einem anderen Format ist (wie anderswo kommentiert). Außerdem fehlte eine Tilde (~).

Anstatt:

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:0,2%

Ich musste verwenden:

set backupFilename=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%

für das Datumsformat:

c:\Scripts> Echo% DATE%

Do 15.05.2009 

55
Chris

Wenn Sie wissen, dass sich Ihre regionalen Einstellungen nicht ändern, können Sie dies wie folgt tun:

  • wenn Ihr kurzes Datumsformat TT/MM/JJJJ ist:

    SET MYDATE =% DATE: ~ 3,2 %% DATE: ~ 0,2 %% DATE: ~ 8,4%

  • wenn Ihr kurzes Datumsformat MM/TT/JJJJ ist:

    SET MYDATE =% DATE: ~ 0,2 %% DATE: ~ 3,2 %% DATE: ~ 8,4%

Es gibt jedoch keine generelle Methode, die unabhängig von Ihren regionalen Einstellungen ist.

Ich würde nicht empfehlen, sich für alles, was in einer Produktionsumgebung verwendet wird, auf regionale Einstellungen zu verlassen. Stattdessen sollten Sie die Verwendung einer anderen Skriptsprache in Betracht ziehen - PowerShell, VBScript, ...

Wenn Sie beispielsweise eine VBS-Datei yyyymmdd.vbs in demselben Verzeichnis wie Ihre Stapeldatei mit folgendem Inhalt erstellen:

' yyyymmdd.vbs - outputs the current date in the format yyyymmdd
Function Pad(Value, PadCharacter, Length)
    Pad = Right(String(Length,PadCharacter) & Value, Length)
End Function

Dim Today
Today = Date
WScript.Echo Pad(Year(Today), "0", 4) & Pad(Month(Today), "0", 2) & Pad(Day(Today), "0", 2)

dann können Sie es aus Ihrer Batchdatei aufrufen:

FOR /F %%i IN ('cscript "%~dp0yyyymmdd.vbs" //Nologo') do SET MYDATE=%%i
echo %MYDATE%

Natürlich wird es irgendwann einen Punkt geben, an dem das Umschreiben Ihrer Batchdatei in eine leistungsfähigere Skriptsprache sinnvoller ist, als sie auf diese Weise mit VBScript zu mischen.

12
Joe

Dies funktioniert für das Nicht-US-Datumsformat (dd/MM/yyyy):

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
7z a QuickBackup%backupFilename%.Zip *.backup
11
@SETLOCAL ENABLEDELAYEDEXPANSION

@REM Use WMIC to retrieve date and time
@echo off
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF NOT "%%~F"=="" (
        SET /A SortDate = 10000 * %%F + 100 * %%D + %%A
        set YEAR=!SortDate:~0,4!
        set MON=!SortDate:~4,2!
        set DAY=!SortDate:~6,2!
        @REM Add 1000000 so as to force a prepended 0 if hours less than 10
        SET /A SortTime = 1000000 + 10000 * %%B + 100 * %%C + %%E
        set HOUR=!SortTime:~1,2!
        set MIN=!SortTime:~3,2!
        set SEC=!SortTime:~5,2!
    )
)
@echo on
@echo DATE=%DATE%, TIME=%TIME%
@echo HOUR=!HOUR! MIN=!MIN! SEC=!SEC!
@echo YR=!YEAR! MON=!MON! DAY=!DAY! 
@echo DATECODE= '!YEAR!!MON!!DAY!!HOUR!!MIN!' 

Ausgabe:

DATE=2015-05-20, TIME= 1:30:38.59
HOUR=01 MIN=30 SEC=38
YR=2015 MON=05 DAY=20
DATECODE= '201505200130'
7

Sie können das Datum auch über die Variable %DATE% aufrufen.

Beim Testen meines Systems erzeugt %DATE% ddd dd/mm/yyyy

sie können Teilzeichenoperatoren verwenden, um das gewünschte Format zu erzeugen

dh. läuft am MON 11/12/2018 mit den regionalen Einstellungen der USA ab

%DATE:~3,3% %DATE:~0,3% %DATE:~7,2%

Erzeugt eine Ausgabe:

11 Mon 12

die Unterzeichenfolge-Argumente sind
%*variable*:~*startpos*,*numberofchars*%

5
ShoeLace

Dies ist alles umständlich und nicht von den lokalen Einstellungen unabhängig. Mach es so:

%CYGWIN_DIR%\bin\date +%%Y%%m%%d_%%H%%M% > date.txt
for /f "delims=" %%a in ('type "date.txt" 2^>NUL') do set datetime=%%a
echo %datetime%
del date.txt

Ja, benutze Cygwin date und alle deine Probleme sind weg!

Sicher.

FOR %%A IN (%Date:/=%) DO SET Today=%%A
7z a QuickBackup%TODAY%.Zip *.backup

Das ist das Format DDMMYYYY.

Hier ist YYYYDDMM:

FOR %%A IN (%Date%) DO (
    FOR /F "tokens=1-3 delims=/-" %%B in ("%%~A") DO (
        SET Today=%%D%%B%%C
    )
)
7z a QuickBackup%TODAY%.Zip *.backup
2
Dmitri Farkov

Wenn Sie WSL aktiviert haben (nur Windows 10), können Sie dies mit bash neutral tun.

set dateFile=%TEMP%\currentDate.txt
bash -c "date +%Y%m%d" > %dateFile%
set /p today=<%dateFile%

Fühlen Sie sich frei, die Dateiumleitung durch ein "for" -Objekt zu ersetzen, das in anderen Antworten hier und in Windows vorgeschlagen wird. Stapeln Sie die Ausgabe eines Programms einer Variablen .

1
Raven

Sairam Mit den oben angegebenen Beispielen habe ich das Skript ausprobiert, das ich wollte. Die in anderen Beispielen erwähnten Positionsparameter ergaben unterschiedliche Ergebnisse. Ich wollte eine Batch-Datei erstellen, um die Oracle-Datensicherung (Datenexport) täglich durchzuführen, wobei verschiedene DMP-Dateien mit Datum und Uhrzeit als Teil des Dateinamens erhalten bleiben. Hier ist das Skript, das gut funktioniert hat:

cls
set dt=%date:~0,2%%date:~3,2%%date:~6,4%-%time:~0,2%%time:~3,2%
set fn=backup-%dt%.DMP
echo %fn%
pause A
exp user/password file=D:\DATA_DMP\%fn%
1
Udayshankar K P

Wie bereits erwähnt, ist die Analyse des Datums und der Uhrzeit nur nützlich, wenn Sie wissen, welches Format vom aktuellen Benutzer verwendet wird (z. B. MM/TT/JJ oder TT-MM-JJJJ, nur um 2 zu nennen). Dies könnte bestimmt werden, aber wenn Sie all das Stress und Parsen erledigen, werden Sie immer noch mit einer Situation konfrontiert sein, in der ein unerwartetes Format verwendet wird und weitere Anpassungen erforderlich sein werden.

Sie können auch ein externes Programm verwenden, das ein Datumsfenster in Ihrem bevorzugten Format zurückgibt. Dies hat jedoch den Nachteil, dass Sie das Dienstprogramm mit Ihrem Skript/Stapel verteilen müssen.

es gibt auch Batch-Tricks, die die CMOS - Uhr auf eine ziemlich rohe Art und Weise verwenden, aber das ist für die meisten Leute zu nah an den blanken Drähten und auch nicht immer der bevorzugte Ort, um Datum und Uhrzeit abzurufen.

Nachfolgend finden Sie eine Lösung, die die oben genannten Probleme vermeidet. Ja, es führt einige andere Probleme ein, aber für meine Zwecke habe ich festgestellt, dass dies die einfachste, übersichtlichste und tragbarste Lösung zum Erstellen eines Datumsstempels in .bat-Dateien für moderne Windows-Systeme ist. Dies ist nur ein Beispiel, aber ich denke, Sie werden sehen, wie Sie andere Datums- und/oder Uhrzeitformate usw. ändern können.

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM the following may be needed to be sure cache is clear before using the new setting
reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
1
jph

Ich habe die Umgebungsvariablen-Technik verwendet, die hier behandelt wird: http://cwashington.netreach.net/depo/view.asp?Index=19

http://cwashington.netreach.net/depo/default.asp?topic=repository&move=last&ScriptType=command&SubType=Misc

Hier ist der Code von dieser Site:

::~~Author~~.          Brett Middleton
::~~Email_Address~~. [email protected]
::~~Script_Type~~.   nt command line batch
::~~Sub_Type~~. Misc
::~~Keywords~~. environment variables

::~~Comment~~.
::Sets or clears a group of environment variables containing components of the current date extracted from the string returned by the DATE /T command.  These variables can be used to name files, control the flow of execution, etc.

::~~Script~~.

@echo off

::-----------------------------------------------------------------------------
::  SetEnvDate1.CMD                                                     6/30/98
::-----------------------------------------------------------------------------
::  Description  :  Sets or clears a group of environment variables containing
::               :  components of the current date extracted from the string
::               :  returned by the DATE /T command.  These variables can be
::               :  used to name files, control the flow of execution, etc.
::               :
::  Requires     :  Windows NT with command extensions enabled
::               :
::  Tested       :  Yes, as demonstration
::               :
::  Contact      :  Brett Middleton <[email protected]>
::               :  Animal and Dairy Science Department
::               :  University of Georgia, Athens
::-----------------------------------------------------------------------------
::  USAGE
::
::  SetEnvDate1 can be used as a model for coding date/time routines in
::  other scripts, or can be used by itself as a utility that is called
::  from other scripts.
::  
::  Run or call SetEnvDate1 without arguments to set the date variables.
::  Variables are set for the day abbreviation (DT_DAY), month number (DT_MM),
::  day number (DT_DD) and four-digit year (DT_YYYY).
::
::  When the variables are no longer needed, clean up the environment by
::  calling the script again with the CLEAR argument.  E.g.,
::
::       call SetEnvDate1 clear
::-----------------------------------------------------------------------------
::  NOTES
::
::  A time variable could be added by parsing the string returned by the
::  built-in TIME /T command.  This is left as an exercise for the reader. B-)
::
::  This script illustrates the following NT command extensions:
::
::  1.  Use of the extended IF command to do case-insensitive comparisons.
::
::  2.  Use of the extended DATE command.
::
::  3.  Use of the extended FOR command to parse a string returned by a
::      command or program.
::
::  4.  Use of the "()" conditional processing symbols to group commands
::      for conditional execution.  All commands between the parens will
::      be executed if the preceeding IF or FOR statement is TRUE.
::-----------------------------------------------------------------------------

if not "%1" == "?" goto chkarg
echo.
echo Sets or clears date/time variables in the command environment.
echo.
echo    SetEnvDate1 [clear]
echo.
echo When called without arguments, the variables are created or updated.
echo When called with the CLEAR argument, the variables are deleted.
echo.
goto endit

::-----------------------------------------------------------------------------
::  Check arguments and select SET or CLEAR routine.  Unrecognized arguments
::  are ignored and SET is assumed.
::-----------------------------------------------------------------------------

:chkarg

if /I "%1" == "CLEAR" goto clrvar
goto setvar

::-----------------------------------------------------------------------------
::  Set variables for the day abbreviation (DAY), month number (MM), 
::  day number (DD) and 4-digit year (YYYY). 
::-----------------------------------------------------------------------------

:setvar

for /F "tokens=1-4 delims=/ " %%i IN ('date /t') DO (
set DT_DAY=%%i
set DT_MM=%%j
set DT_DD=%%k
set DT_YYYY=%%l)

goto endit

::-----------------------------------------------------------------------------
::  Clear all variables from the environment.
::-----------------------------------------------------------------------------

:clrvar
for %%v in (DT_DAY DT_MM DT_DD DT_YYYY) do set %%v=
goto endit

:endit
1
Cade Roux

Es gibt ein technisches Rezept here , das zeigt, wie es in MMDDYYYY formatiert wird. Sie sollten es an Ihre Bedürfnisse anpassen können.

echo on
@REM Seamonkey’s quick date batch (MMDDYYYY format)
@REM Setups %date variable
@REM First parses month, day, and year into mm , dd, yyyy formats and then combines to be MMDDYYYY
FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%

echo %date%

BEARBEITEN: Der Grund, warum es vorher nicht funktioniert hat, war auf "smartquotes" im Originaltext zurückzuführen. Ich habe sie behoben und die Batch-Datei funktioniert, wenn sie von dieser Seite ausgeschnitten und eingefügt wird.

1
Andre Miller

Aufbauend auf Joes Idee folgt eine Version, die einen eigenen (.js) Helfer und eine unterstützende Zeit aufbaut:

@echo off

set _TMP=%TEMP%\_datetime.tmp

echo var date = new Date(), string, tmp;> "%_TMP%"
echo tmp = ^"000^" + date.getFullYear(); string = tmp.substr(tmp.length - 4);>> "%_TMP%"
echo tmp = ^"0^" + (date.getMonth() + 1); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getDate(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getHours(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getMinutes(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getSeconds(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo WScript.Echo(string);>> "%_TMP%"

for /f %%i in ('cscript //nologo /e:jscript "%_TMP%"') do set _DATETIME=%%i

del "%_TMP%"

echo YYYYMMDDhhmmss: %_DATETIME%
echo YYYY: %_DATETIME:~0,4%
echo YYYYMM: %_DATETIME:~0,6%
echo YYYYMMDD: %_DATETIME:~0,8%
echo hhmm: %_DATETIME:~8,4%
echo hhmmss: %_DATETIME:~8,6%
0
vszakats

Ich habe zwei Möglichkeiten gefunden, die unabhängig von den Datumseinstellungen funktionieren.

Auf meinem PC wird date/t zurückgegeben 2009-05-27

Sie können entweder auf die Registrierung zugreifen und die regionalen Einstellungen lesen (HKEY_CURRENT_USER\Control Panel\International)

Oder verwenden Sie ein vbscript . Dies ist der hässliche Batchdatei/vbscript-Hybrid, den ich vor einiger Zeit erstellt habe ....

@Echo Off
set rnd=%Random%
set randfilename=x%rnd%.vbs

::create temp vbscript file
Echo Dim DayofWeek(7) >  %temp%\%randfilename%
Echo DayofWeek(1)="Sun" >> %temp%\%randfilename%
Echo DayofWeek(2)="Mon" >> %temp%\%randfilename%
Echo DayofWeek(3)="Tue" >> %temp%\%randfilename%
Echo DayofWeek(4)="Wed" >> %temp%\%randfilename%
Echo DayofWeek(5)="Thu" >> %temp%\%randfilename%
Echo DayofWeek(6)="Fri" >> %temp%\%randfilename%
Echo DayofWeek(7)="Sat" >> %temp%\%randfilename%
Echo DayofWeek(0)=DayofWeek(Weekday(now)) >> %temp%\%randfilename%
Echo Mon=Left(MonthName(Month(now),1),3) >> %temp%\%randfilename%
Echo MonNumeric=right ( "00" ^& Month(now) , 2) >> %temp%\%randfilename%
Echo wscript.echo ( Year(Now) ^& " " ^& MonNumeric ^& " " ^& Mon ^& " "  _ >> %temp%\%randfilename%
Echo ^& right("00" ^& Day(now),2) ^& " "^& dayofweek(0) ^& " "^& _ >> %temp%\%randfilename%
Echo right("00" ^& Hour(now),2)) _ >> %temp%\%randfilename%
Echo ^&":"^& Right("00" ^& Minute(now),2) ^&":"^& Right("00" ^& Second(Now),2)  >> %temp%\%randfilename%

::set the output into vars
if "%1" == "" FOR /f "usebackq tokens=1,2,3,4,5,6" %%A in (`start /wait /b cscript //nologo %temp%\%randfilename%`) do Set Y2KYear=%%A& Set MonthNumeric=%%B& Set Month=%%C& Set Day=%%D& Set DayofWeek=%%E& Set Time=%%F
set year=%y2kyear:~2,2%

::cleanup
del %temp%\%randfilename%

Es ist nicht schön, aber es funktioniert.

0
Raymond Joyal