Wie kann ich in einem Dateinamen für die Verwendung von aktuellen Datetime auf der Windows-Kommandozeile, in einem geeigneten Format bekommen?

StackOverflow https://stackoverflow.com/questions/203090

Frage

Update: Nun, da es 2016, das ich Powershell dafür verwenden würde, es sei denn, ein wirklich zwingender rückwärtskompatibel Grund dafür ist, vor allem wegen des regionalen Einstellungen Problems mit date verwenden. Siehe @ npocmaka https://stackoverflow.com/a/19799236/8479


Was ist eine Windows-Befehlszeile-Anweisung (n) ich verwenden kann, die aktuelle Datetime in einem Format zu erhalten, die ich in einen Dateinamen setzen kann?

Ich mag eine .bat-Datei haben, das ein Verzeichnis in ein Archiv mit dem aktuellen Datum und Zeit als Teil des Namen Reißverschluss bis zum Beispiel Code_2008-10-14_2257.zip. Gibt es eine einfache Weise, die ich dies tun kann, unabhängig von den regionalen Einstellungen der Maschine?

Ich weiß nicht wirklich über das Datumsformat etwas dagegen, im Idealfall würde es yyyy-mm-dd sein, aber alles ist einfach in Ordnung.

Bisher habe ich das habe, was auf meinem Rechner gibt mir Tue_10_14_2008_230050_91:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code

Ich kann damit leben, aber es scheint ein bisschen klobig. Im Idealfall würde es sein briefer und hat das Format bereits erwähnt.

Ich bin mit Windows Server 2003 und Windows XP Professional. Ich möchte nicht, zusätzliche Dienstprogramme zu installieren, dies zu erreichen (obwohl ich weiß, dass es einige gibt, die schöne Datumsformatierung übernommen werden kann).

War es hilfreich?

Lösung

Siehe Windows-Batch-Datei (.bat) aktuelles Datum in MMTTJJJJ Format zu bekommen :

@echo off
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 /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

Wenn Sie die Zeit im 24-Stunden / Militär-Format bevorzugen, können Sie die zweite für Zeile mit dieser ersetzen:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
  

C:> \ date.bat
.   2008-10-14_0642

Wenn Sie das Datum unabhängig von der Region Tag / Monat bestellen möchten, können Sie „WMIC os GET Local“ verwenden als Quelle, da es in der ISO-Reihenfolge ist:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]
  

C:> test.cmd
  Lokale Datum ist [2012-06-19 10: 23: 47,048]

Andere Tipps

Regional unabhängiges Datum Zeit Parsen

Das Ausgabeformat von %DATE% und des dir Befehl ist regional abhängig und somit weder robust noch klug. date.exe (Teil von UnxUtils ) liefert alle Datums- und Zeitinformationen in jedem denkbaren Format. Sie können auch das Datum / Uhrzeit Informationen aus einer beliebigen Datei mit date.exe extrahieren.

Beispiele: (in einem cmd-Skript verwendet %% statt%)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18.55.03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: Jeder Text

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Text: 09/12/22 ein beliebiger Text-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18.55.03" `

Die Datum / Uhrzeit Informationen aus einer Referenzdatei:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

es in einem CMD-Skript verwenden zu erhalten Jahr, Monat, Tag, Uhrzeit Informationen:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

es in einem CMD-Skript Mit einem Zeitstempel in jedem gewünschten Format zu erhalten:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Extrahieren von Datum / Uhrzeit Informationen aus beliebiger Referenzdatei.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

in eine Datei Hinzufügen seines Datum / Uhrzeit:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe ist Teil der freien GNU-Tools , die keine Installation benötigen.

. HINWEIS: Kopieren date.exe in ein beliebiges Verzeichnis, das im Suchpfad ist, kann andere Skripte dazu führen, dass die Windows-nicht verwenden integrierte in date Befehl

Zwei weitere Möglichkeiten, die über die Zeiteinstellungen nicht abhängen (beide genommen von : Wie Daten / Zeit unabhängig von Lokalisierung erhalten: ). Und beide auch den Tag der Woche bekommen und keiner von ihnen erfordert Admin-Berechtigungen:

  1. MakeCab - wird auf jedem Windows-System arbeitet (schnell, aber erzeugt eine kleine temporäre Datei) (das foxidrive Skript):

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
       set "current-date=%%e-%%b-%%c"
       set "current-time=%%d"
       set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    

    Mehr Informationen über get-date-Funktion .

  2. ROBOCOPY - es ist nicht nativen Befehl für Windows XP und Windows Server 2003, aber es kann von Microsoft-Website heruntergeladen . Aber ist eingebaut in alles von Windows Vista und höher:

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
     set "dow=%%D"
     set "month=%%E"
     set "day=%%F"
     set "HH=%%G"
     set "MM=%%H"
     set "SS=%%I"
     set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

    Und drei weitere Möglichkeiten, die anderen Windows-Script-Sprachen verwendet. Sie werden Ihnen mehr Flexibilität, zum Beispiel Sie können Woche des Jahres, die Zeit in Millisekunden bekommen und so weiter.

  3. JScript / batch Hybrid (müssen als .bat gespeichert werden). JScript ist auf jedem System Form NT verfügbar und oben, als ein Teil der Windows Script Host ( kann jedoch über die Registrierung deaktiviert werden, es ist ein seltener Fall ):

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
            // Today date time which will used to set as default date.
            var todayDate = new Date();
            todayDate = todayDate.getFullYear() + "-" +
                           ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                           ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                           ("0" + todayDate.getMinutes()).slice(-2);
    
            return todayDate;
        }
    
    WScript.Echo(GetCurrentDate());
    
  4. VSCRIPT / BATCH hybrid ( Ist es möglich, VBScript innerhalb einer Batch-Datei einbetten und ausführen, ohne eine temporäre Datei mit? ) gleichen Fall wie JScript , aber die Hybridisierung nicht so perfekt ist:

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date,1),", ","-")
    
  5. Powershell - kann auf jedem Rechner installiert werden, die .NET hat - Download von Microsoft ( v1 , v2 , v3 (nur für Windows 7 und über)). Es ist standardmäßig auf allem von der Installation von Windows 7 / Windows Server 2008 und höher:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    Um es aus einer Batch-Datei:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Selbst zusammengestellt jscript.net/batch (nie einen Windows-Rechner ohne .NET zu sehen, so dass ich denke, das ist ein ziemlich tragbar ist):

    @if (@X)==(@Y) @end /****** silent line that start JScript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    
    :: Searching the latest installed .NET framework
    for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Logman Das kann nicht das Jahr und den Tag der Woche. Es ist vergleichsweise langsam und schafft auch eine temporäre Datei und basiert auf den Zeitstempel, der setzt auf seine Protokolldateien LogMan. Es wird von Windows XP auf alles funktioniert und darüber. Es wird wahrscheinlich nie von jedermann verwendet werden - darunter auch ich - aber ist eine weitere Möglichkeit, ...

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    
  8. Eine weitere Möglichkeit, mit WMIC , die auch Woche des Jahres und dem Tag der Woche gibt, nicht aber die Millisekunden (für Millisekunden überprüfen foxidrive Antwort):

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. Mit Typeperf mit einigen Anstrengungen schnell sein und kompatibel mit verschiedenen Spracheinstellungen und so schnell wie möglich:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA ermöglicht in # demonstriert JavaScript-Methoden ähnlich dem JScript-Methode aufrufen 3 oben. Beachten Sie, dass von JavaScript Date-Objekt-Eigenschaften Einbeziehung Monat Werte von nummerierten 0-11, nicht mehr als 1 bis 12. So ein Wert von 9 bedeutet Oktober.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    

Hier ist eine Variante von alt.msdos.batch.nt die lokale unabhängig arbeitet.

Setzen Sie diese in einer Textdatei, z.B. getDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

Um den Code zu bekommen sans arbeiten Fehler msg ist, nach stderr Ich hatte die einfachen Anführungszeichen die Variablenzuweisungen für %% a %% b und c %% arount hinzuzufügen. Mein locale (PT) verursacht Fehler zu einem bestimmten Zeitpunkt in dem Looping / Parsen wo Sachen wie „set = 20“ ausgeführt wurden zu werden. Die Zitate ergeben einen Token (wenn auch leer) für die linke Seite der Zuweisungsanweisung.

Der Nachteil ist die chaotisch locale Variablennamen: ‚JJ‘, ‚mm‘ und ‚dd‘. Aber hey, wer sich interessiert!

Ich benutze diese (wieder nicht Region unabhängig (UK))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%

Leider ist dies für die regionalen Einstellungen nicht immun, aber es tut, was Sie wollen.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Erstaunlich das Material, das Sie auf Wikipedia finden.

Die ersten vier Zeilen dieses Codes finden Sie zuverlässige YY MM DD YYYY HH Min Sec Variablen in Windows XP Professional geben und höher.

@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

Bitte verwenden Sie das folgende Skript, um den aktuellen Tag in der Befehlszeile zu erhalten:

echo %Date:~0,3%day

Eine weitere Möglichkeit ( Kredit ):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Beachten Sie, dass sowohl meine Antworten hier noch darauf angewiesen, in der Größenordnung von Tag und Monat sind durch regionale Einstellungen festgelegt -. Nicht sicher, wie um daran zu arbeiten

"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip

Das ist nicht wirklich kürzer, aber vielleicht eine flexiblere Art und Weise ( Kredit ):

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%

Hier ist eine Art und Weise Datum Zeit in einer einzigen Zeile zu bekommen:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

In den USA erhalten Sie folgende Ausgabe "yyyy-mm-dd hhmm". Verschiedene regionale Einstellungen in verschiedenen% date% Ausgaben führen werden, aber Sie können die Token Reihenfolge ändern.

Wenn Sie ein anderes Format wollen, ändern Sie die Echo-Anweisung durch die Token neu anordnen oder mit unterschiedlichen (oder keine) Separatoren.

Nur diese Zeile verwenden:

PowerShell -Command "get-date"

Kurze Antwort:

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Lange Antwort

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE

Und hier ist eine ähnliche Batch-Datei für den Zeitabschnitt.

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

- jeroen

Ich änderte die Antwort mit der Batch-Datei von vMax so ist es mit der niederländischen Sprache funktioniert auch.
Die niederländische - persistent, wie wir sind -. Haben ein paar Änderungen in der %date%, date/t und date, die die ursprüngliche Batch-Datei brechen

Es wäre schön, wenn einige Leute dies auch gegen andere Windows-locales überprüfen und die Ergebnisse berichten.
Wenn die Batch-Datei an Ihrem Standort ausfällt, dann bitte auf den Ausgang dieser beiden Aussagen über die Eingabeaufforderung enthalten:
echo:^|date
date/t

Dies ist ein Beispiel für die Ausgabe sollten Sie aus der Batch-Datei erhalten:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Hier ist der überarbeitete Code mit Kommentaren, warum:

:: https://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by jeroen@pluimers.com for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

- jeroen

Matthew Johnson Einzeiler Lösung Einzeiler Datum und Zeit zu erhalten ist, eloquent und nützlich.

Es braucht jedoch eine einfache Modifikation aus einer Batch-Datei zu arbeiten:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e

Eine Funktion, die auf wmic basiert:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

Upside: Region unabhängig. Nachteil: Nur Systemadministratoren können wmic.exe ausführen

.

Verbrauch:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

Diese Echos eine Zeichenfolge wie folgt:

2014-01-22 12:51:53

Beachten Sie, dass Funktionsparameter out-Parameter sind -. Das heißt, müssen Sie Variablennamen anstelle von Werten liefern

Alle Parameter sind optional, so call:Now Y M ist ein gültiger Anruf, wenn Sie Jahr und Monat erhalten möchten.

Ich hatte ein ähnliches Problem. Ich habe einen automatischen täglichen Download von einem FTP-Server von einer verschlüsselten Datei. Ich wollte die Datei mit GPG, benennen Sie die Datei auf das aktuelle Datum (YYYYMMDD-Format), und legen Sie die entschlüsselte Datei in einen Ordner für die richtige Abteilung entschlüsseln.

ging ich zum Umbenennen der Datei mehrere Vorschläge durch Datum nach und hatte kein Glück, bis ich auf diese einfache Lösung gestolpert.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

Es funktioniert perfekt (das heißt, kommt der Dateiname, wie "2011-06-14.txt").

(Quelle)

Das ist, was ich verwende:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

Wenn Sie weitere Ideen wollen für Backups bis 7-Zip-Archive zu automatisieren, ich habe ein Free / Open Projekt, das Sie für Ideen verwenden oder bewerten können: http://wittman.org/ziparcy/

http://sourceforge.net/projects/unxutils/files/

Ansehen der ZIP-Datei für etwas namens „Date.exe“ und benennen Sie sie „DateFormat.exe“ (um Konflikte zu vermeiden).

Legen Sie es in Ihrem Windows-System32 Ordner befindet.

Es hat eine Menge von "date Ausgabe" Optionen.

Für Hilfe Gebrauch DateFormat.exe --h

Ich bin mir nicht sicher, wie Sie die Ausgabe in eine Umgebungsvariable setzen würden ... SET verwendet wird.

Regional unabhängige Lösung, die das ISO-Datumsformat zu erzeugen:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

Was könnte noch optimiert werden: Andere Verfahren könnten verwirrt werden, wenn das Datumsformat in der kurzen Zeit nicht verwendet, während es geändert wird. So Parsen der Ausgabe an den vorhandenen Formatstring nach könnte ‚sicherer‘ - aber komplizierter sein

:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 adolfo.dimare@gmail.com
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

:: Use WMIC.exe to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF "%%~L"=="" goto  _WMIC_done_
        set _yyyy=%%L
        set _mm=00%%J
        set _dd=00%%G
        set _hour=00%%H
        set _minute=00%%I
        set _second=00%%K
)
:_WMIC_done_

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd

eine bekannte Örtlichkeit Gegeben, als Referenz in funktioneller Form. Der ECHOTIMESTAMP Aufruf zeigt, wie der Zeitstempel in eine Variable erhalten (DTS in diesem Beispiel).

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

Und die Datei gesichert, timestamp.bat, hier ist die Ausgabe:

Mit Windows 7 Dieser Code funktioniert für mich:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%

Ich ziehe es so kurz wie möglich zu tun, also ohne Monat und Jahr ist Anzug genug für die tägliche Aktualisierung

SET date=%DATE:~0,2%
SET hour=%TIME:~0,2%
SET minute=%TIME:~3,2%
IF "%date:~0,1%"==" " SET date=0%DATE:~1,1%
IF "%hour:~0,1%"==" " SET hour=0%TIME:~1,1%
IF "%minute:~0,1%"==" " SET minute=0%TIME:~1,1%
SET VERSION=%date%%hour%%minute%
ECHO VERSION=%date%%hour%%minute%
VERSION=140105

Wenn es um die Version einer Anwendung kommt implementieren in frisch von den täglichen Aktualisierung mit einem Builder

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140105-fresh']
timeout: "300s"

Damit wird es leichter sein, die gesamte Anwendung zu aktualisieren, indem Sie sich automatisch

sed -e "s/-[0-9]\{1,\}-fresh/-%VERSION%-local/g" cloudbuild.yaml > tmp.txt 
mv -f tmp.txt cloudbuild.yaml

Output-Datei wird für die lokale Update bereit sein, ohne seine Dateinamen zu berühren

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140117-local']
timeout: "300s"

Ich weiß, dass es bereits zahlreiche Möglichkeiten erwähnt sind. Aber hier ist meine Art, es zu brechen, zu verstehen, wie es gemacht wird. Wir hoffen, es ist nützlich für jemanden, der Schritt-Methode Schritt möchten.

:: Check your local date format
echo %date%

    :: Output is Mon 08/15/2016

:: get day (start index, number of characters)
::         (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
    :: output is Mon 

:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
    :: output is 08

:: get date 
set mydate=%DATE:~7,2% 
echo %mydate%
    :: output is 15

:: get year
set myyear=%DATE:~10,4%
echo %myyear%
    :: output is 2016

Ich nehme zur Kenntnis, dass die o / p hat nicht bitten um eine Region unabhängige Lösung. Meine Lösung ist jedoch für das Vereinigte Königreich.

Dies ist die einfachste mögliche Lösung, eine 1-Line-Lösung für den Einsatz in einer Batch-Datei:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top