web-dev-qa-db-de.com

Wie bekomme ich den Tag, Monat und Jahr eines Windows-cmd.exe-Skripts?

Wie bekomme ich den aktuellen Tag, Monat und Jahr aus einem Windows-Cmd-Skript heraus? Ich muss jeden Wert in eine separate Variable bringen.

30
Mossen

Eine Skriptvariante, die unabhängig vom Gebietsschema arbeitet. Legen Sie es in eine Textdatei mit der Erweiterung .cmd ein und führen Sie es aus.

::: Begin set date

for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date

:set_date
if "%1:~0,1%" gtr "9" shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof

:end_set_date
::: End set date

echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%

Die Variablen% dd%,% mm% und% yy% behalten jeweils den Tag (Format 'DD'), den Monat (Format 'MM') und das Jahr (Format 'YYYY').

21

Um das Jahr, den Monat und den Tag abzurufen, können Sie die Umgebungsvariable %date% und den Operator :~ verwenden. %date% erweitert sich auf etwas wie Do 08/12/2010 und :~ ermöglicht Ihnen, bestimmte Zeichen aus einer Variablen herauszuholen:

set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set filename=%year%_%month%_%day%

Verwenden Sie %time% auf ähnliche Weise, um das, was Sie benötigen, aus der aktuellen Zeit zu erhalten.

set /? gibt Ihnen weitere Informationen zur Verwendung spezieller Operatoren mit Variablen.

28
poke

Der folgende Batch-Code gibt die Komponenten des aktuellen Datums unabhängig von der Ländereinstellung zurück und speichert Tag, Monat und Jahr in den Variablen CurrDay, CurrMonth bzw. CurrYear:

for /F "skip=1 delims=" %%F in ('
    wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE
') do (
    for /F "tokens=1-3" %%L in ("%%F") do (
        set CurrDay=0%%L
        set CurrMonth=0%%M
        set CurrYear=%%N
    )
)
set CurrDay=%CurrDay:~-2%
set CurrMonth=%CurrMonth:~-2%
echo Current day  :  %CurrDay%
echo Current month:  %CurrMonth%
echo Current year :%CurrYear%

Es gibt zwei verschachtelte for /F-Schleifen, um ein Problem mit dem Befehl wmic zu umgehen, dessen Ausgabe im Unicode-Format vorliegt. Die Verwendung einer einzelnen Schleife führt zu zusätzlichen Wagenrücklaufzeichen, die sich auf die Erweiterung der richtigen Variablen auswirken.

Da Tag und Monat auch nur aus einer einzigen Ziffer bestehen können, habe ich eine führende Null 0 im Schleifenkonstrukt vorangestellt. Danach werden die Werte so getrimmt, dass sie immer aus zwei Ziffern bestehen.

20
aschipfl
echo %Date:~7,2% gets current day

7 ist die Startposition 2 Anzahl der anzuzeigenden Stellen

echo %Date:~7,2% gets current day

echo %Date:~4,2% gets current month

echo %Date:~10,4% gets current year
12
Ashraf

SPRACHE UNABHÄNGIGKEIT:

Die Lösung von Andrei Coscodan ist sprachabhängig. Um dies zu beheben, sollten Sie alle Tags für jedes Feld reservieren: Jahr, Monat und Tag in den Zielsprachen. Betrachten Sie Portugiesisch und Englisch, nachdem Sie das Parsing abgeschlossen haben:

set Year=%yy%%aa%
set Month=%mm%
set Day=%dd%

Suchen Sie nach der Jahreszeit, ich habe beide Tags aus dem Englischen und dem Portugiesischen verwendet. Es hat für mich in Brasilien funktioniert, wo diese beiden Sprachen in Windows-Installationen am häufigsten verwendet werden. Ich gehe davon aus, dass dies auch für einige Sprachen mit lateinischem Ursprung wie Französisch, Spanisch usw. funktionieren wird.

Nun, das vollständige Skript könnte sein:

@echo off
setlocal enabledelayedexpansion

:: Extract date fields - language dependent
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (
        set v1=%%i& set v2=%%j& set v3=%%k
        if "%%i:~0,1%%" gtr "9" (set v1=%%j& set v2=%%k& set v3=%%l)

        for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo.^|date') do (
            set %%m=!v1!& set %%n=!v2!& set %%o=!v3!
    )
)

:: Final set for language independency (English and Portuguese - maybe works for Spanish and French)
set year=%yy%%aa%
set month=%mm%
set day=%dd%


:: Testing
echo Year:[%year%] - month:[%month%] - day:[%day%]

endlocal
pause

Ich hoffe, dass dies jemandem hilft, der sich mit anderen Sprachen beschäftigt.

8
Luciano

Die einzige zuverlässige Methode, die ich kenne, ist die Verwendung von VBScript, um die schwere Arbeit für Sie zu erledigen. Es gibt keine tragbare Möglichkeit, das aktuelle Datum in einem verwendbaren Format zu erhalten, wenn nur eine Batchdatei verwendet wird. Die folgende VBScript-Datei

Wscript.Echo("set Year=" & DatePart("yyyy", Date))
Wscript.Echo("set Month=" & DatePart("m", Date))
Wscript.Echo("set Day=" & DatePart("d", Date))

und dieses Batch-Snippet

for /f "delims=" %%x in ('cscript /nologo date.vbs') do %%x
echo %Year%-%Month%-%Day%

sollte aber funktionieren.

Während Sie das aktuelle Datum in einer Batchdatei entweder mit date /t oder mit der %date%-Pseudovariable abrufen können, folgen beide dem aktuellen Gebietsschema in der Anzeige. Das bedeutet, dass Sie das Datum in einem möglichen beliebigen Format erhalten, und Sie haben keine Möglichkeit, das zu analysieren. 

6
Joey

Diese Variante funktioniert für alle Lokalisierungen:

@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 "%%B" NEQ "" (
        SET /A FDATE=%%F*10000+%%D*100+%%A
    )
)
@echo on
echo date=%FDATE%
echo year=%FDATE:~2,2%
echo month=%FDATE:~4,2%
4
vitperov

Ich denke, die Antwort von Andrei Coscodan ist die beste, wenn man nicht viele Annahmen treffen kann. Aber manchmal ist es schön, ein one-liner zu haben, wenn Sie einige Annahmen treffen können. Diese Lösung geht davon aus, dass "Datum\t" eines von zwei Formaten zurückgibt. Unter WindowsXP gibt Datum/t "23.11.2011" zurück, unter Windows7 jedoch "Mi 23.11.2011".

FOR /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mm=%%a&set dd=%%b&set yyyy=%%c& (if "%%a:~0,1" gtr "9" set mm=%%b&setdd=%%c&set yyyy=%%d))
:: Test results
echo day in 'DD' format is '%dd%'; month in 'MM' format is '%mm%'; year in 'YYYY' format is '%yyyy%'

Dank an Andrei Consodans Antwort, um mir bei dieser einzeiligen Lösung zu helfen.

2
JeffJak
  • Für eine Zeile!

Versuchen Sie es mit einer Schleife mit 2 Begrenzern (gleich + Punkt): =.:

@for /f "tokens=2delims==." %i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do @cmd/v/c "set _date=%i &&echo/ year: !_date:~0,4!&&echo/month:   !_date:~4,2!&&echo/  day:   !_date:~6,2!"

Befehlszeilenergebnisse:


 year: 2019
month:   06
  day:   12
  • Funktioniert in jeder Sprache/Region und auch ohne Benutzereinstellungen im Ausgabe-Layout.

Für Fledermausfeile:


@for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do @cmd/v/c "set _date=%%i &&echo/ year: !_date:~0,4!&&echo/month:   !_date:~4,2!&&echo/  day:   !_date:~6,2!"

1
It Wasn't Me

Ich habe in meinen Skripten zu diesem Zweck auf die Verwendung von Powershell-Aufrufen umgestellt. Es erfordert die Berechtigung zur Skriptausführung und ist bei weitem die langsamste Option. Es ist jedoch auch unabhängig von der Lokalisierung, sehr einfach zu schreiben und zu lesen, und es ist viel einfacher, Anpassungen des Datums wie Addition/Subtraktion vorzunehmen oder den letzten Tag des Monats usw. zu erhalten.

Hier erfahren Sie, wie Sie Tag, Monat und Jahr ermitteln

for /f %%i in ('"powershell (Get-Date).ToString(\"dd\")"') do set day=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"MM\")"') do set month=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"yyyy\")"') do set year=%%i

Oder hier ist das gestrige Datum im Format JJJJ-MM-TT

for /f %%i in ('"powershell (Get-Date).AddDays(-1).ToString(\"yyyy-MM-dd\")"') do set yesterday=%%i

Wochentag

for /f %%d in ('"powershell (Get-Date).DayOfWeek"') do set DayOfWeek=%%d

Aktuelle Zeit plus 15 Minuten

for /f %%i in ('"powershell (Get-Date).AddMinutes(15).ToString(\"HH:mm\")"') do set time=%%i

0
Jason

Auszug Tag, Monat und Jahr

Die am höchsten gewählte Funktion und die akzeptierte Funktion arbeiten NICHT unabhängig vom Gebietsschema, da auch der Befehl DATE der Lokalisierung unterliegt. Zum Beispiel (der akzeptierte): Auf Englisch haben Sie JJJJ für ein Jahr und in Holland ist es JJJJ. Das ist also ein No-Go. Das folgende Skript übernimmt die Lokalisierung der Benutzer aus der Registrierung, die unabhängig vom Gebietsschema ist. 

@echo off

::: Begin set date
setlocal EnableExtensions EnableDelayedExpansion

:: Determine short date format (independent from localization) from registry
for /f "skip=1 tokens=3-5 delims=- " %%L in ( '2^>nul reg query "HKCU\Control Panel\International" /v "sShortDate"' ) do ( 

    :: Since we can have multiple (short) date formats we only use the first char from the format in a new variable
    set "_L=%%L" && set "_L=!_L:~0,1!" && set "_M=%%M" && set "_M=!_M:~0,1!" && set "_N=%%N" && set "_N=!_N:~0,1!"

    :: Now assign the date values to the new vars
    for /f "tokens=2-4 delims=/-. " %%D in ( "%date%" ) do ( set "!_L!=%%D" && set "!_M!=%%E" && set "!_N!=%%F" )
)


:: Print the values as is
echo.
echo This is the original date string --^> %date%
echo These are the splitted values    --^> Day: %d%, Month:%m%, Year: %y%.
echo.

endlocal

Extrahiere nur das Jahr

Für ein Drehbuch, das ich schrieb, wollte ich nur das Jahr herausfiltern (unabhängig vom Gebietsschema). Daher kam ich zu diesem Oneliner, da ich keine Lösung finden konnte. Es verwendet die Variable 'DATE', mehrere Trennzeichen und prüft, ob eine Zahl größer als 31 ist. Das ist dann das aktuelle Jahr. Im Gegensatz zu einigen anderen Lösungen sind die Ressourcen gering.

@echo off

setlocal EnableExtensions

for /f " tokens=2-4 delims=-./ " %%D in ( "%date%" ) do ( if %%D gtr 31 ( set "_YEAR=%%D" ) else ( if %%E gtr 31 ( set "_YEAR=%%E" ) else ( if %%F gtr 31 ( set "_YEAR=%%F" ) ) ) )

echo And the year is... %_YEAR%.
echo.

endlocal
0
FifthAxiom
powershell Set-Date -Da (Get-Date -Y 1980 -Mon 11 -Day 17)
0
STTR