Wie speichere ich das aktuelle Datum im Format JJJJ-MM-TT in einer Variablen in einer Windows-BAT-Datei?
Unix-Shell-Analogon:
today=`date +%F`
echo $today
Wie speichere ich das aktuelle Datum im Format JJJJ-MM-TT in einer Variablen in einer Windows-BAT-Datei?
Unix-Shell-Analogon:
today=`date +%F`
echo $today
Antworten:
Sie können das aktuelle Datum auf eine länderunabhängige Weise mit abrufen
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
Anschließend können Sie die einzelnen Teile mit Teilzeichenfolgen extrahieren:
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%
Eine andere Möglichkeit, Variablen zu erhalten, die die einzelnen Teile enthalten, wäre:
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
Viel schöner als mit Teilzeichenfolgen herumzuspielen, auf Kosten der Verschmutzung Ihres variablen Namespace.
Wenn Sie UTC anstelle der Ortszeit benötigen, ist der Befehl mehr oder weniger derselbe:
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
for /f
zwei Zeilen zurückgegeben werden, von denen die letztere leer ist. Sie können das lösen, indem Sie set MyDate=
dazwischen verwenden. Ich denke, darüber ist user2023861 gestolpert.
Year
, Month
, Day
, Hour
, Minute
, Second
, Quarter
, WeekInMonth
,DayOfWeek
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%
ist eine ungültige Antwort: Es wird ein einstelliger Monat und Tag zurückgegeben. Wie wird eine zweistellige Linke mit einer Zeichenfolge von null Monat und Tag bis Datum aufgefüllt?
Wenn Sie dies mit Standard-MS-DOS-Befehlen in einer Batch-Datei erreichen möchten, können Sie Folgendes verwenden:
FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C
Ich bin sicher, dass dies weiter verbessert werden kann, aber dies gibt das Datum in 3 Variablen für Tag (TT), Monat (MM) und Jahr (JJJJ). Sie können diese später nach Bedarf in Ihrem Batch-Skript verwenden.
SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%
Obwohl ich verstehe, dass eine Antwort auf diese Frage akzeptiert wurde, wird diese alternative Methode von vielen geschätzt, die dies ohne Verwendung der WMI-Konsole erreichen möchten. Ich hoffe, dass sie dieser Frage einen Mehrwert verleiht.
Verwenden Sie date /T
diese Option , um das Format an der Eingabeaufforderung zu ermitteln.
Wenn das Datumsformat Thu 17/03/2016
wie folgt verwendet wird:
set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%
SELECT CONVERT(VARCHAR(16), GETDATE(), 112)
".
%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
Zwei weitere Möglichkeiten, die nicht von den Zeiteinstellungen abhängen (beide stammen aus Wie Daten / Zeit unabhängig von der Lokalisierung erhalten werden ). Und beide erhalten auch den Wochentag und keiner von ihnen benötigt Administratorrechte!:
MAKECAB - funktioniert auf JEDEM Windows-System (schnell, erstellt jedoch 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
ROBOCOPY - Es ist kein nativer Befehl für Windows XP und Windows Server 2003 , kann jedoch von der Microsoft-Website heruntergeladen werden . Aber es ist in alles von Windows Vista und höher integriert:
@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 andere Windows-Skriptsprachen verwenden. Sie geben Ihnen mehr Flexibilität, z. B. können Sie die Woche des Jahres, die Zeit in Millisekunden usw. abrufen.
JScript / BATCH- Hybrid (muss gespeichert werden als .bat
). JScript ist auf jedem System ab Windows NT und höher als Teil von Windows Script Host verfügbar ( kann jedoch in seltenen Fällen über die Registrierung deaktiviert werden ):
@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());
VBScript / BATCH- Hybrid ( Ist es möglich, VBScript in eine Batch-Datei einzubetten und auszuführen, ohne eine temporäre Datei zu verwenden? ) Der gleiche Fall wie bei jscript, aber die Hybridisierung ist nicht so perfekt:
: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), ", ", "-")
PowerShell - kann auf jedem Computer mit .NET installiert werden - Download von Microsoft ( v1 , v2 und v3 (nur für Windows 7 und höher)). Standardmäßig unter Windows 7 / Win2008 und höher installiert:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
Selbst kompiliertes jscript.net/batch (Ich habe noch nie einen Windows-Computer ohne .NET gesehen, daher denke ich, dass dies ein ziemlich portables Gerät 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"));
Logman Dies kann nicht das Jahr und den Tag der Woche abrufen . Es ist vergleichsweise langsam, erstellt auch eine temporäre Datei und basiert auf den Zeitstempeln, die logman auf seine Protokolldateien legt. Funktioniert unter Windows XP und höher. Es wird wahrscheinlich nie von irgendjemandem benutzt werden - auch nicht von mir - aber es 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
Weitere Informationen zur Get-Date-Funktion .
Ich mochte Joeys Methode wirklich, aber ich dachte, ich würde sie ein bisschen erweitern.
Bei diesem Ansatz können Sie den Code mehrmals ausführen, ohne sich Gedanken über den alten Datumswert machen zu müssen, da dieser bereits definiert ist.
Jedes Mal, wenn Sie diese Batchdatei ausführen, wird eine ISO 8601-kompatible kombinierte Datums- und Zeitdarstellung ausgegeben.
FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%
In dieser Version müssen Sie darauf achten, dass Sie denselben Code nicht an mehreren Stellen in der Datei kopieren / einfügen, da dies zu doppelten Beschriftungen führen würde. Sie können entweder für jede Kopie ein separates Etikett haben oder diesen Code einfach in eine eigene Batchdatei einfügen und ihn bei Bedarf aus Ihrer Quelldatei aufrufen.
Laut Antwort von @ProVi ändern Sie einfach die gewünschte Formatierung
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
wird zurückkehren
yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11
EDIT Wie pro @Jeb Kommentar, der korrekt ist das obige Zeitformat funktioniert nur, wenn Ihr DATE / T Befehl gibt
ddd dd/mm/yyyy
Thu 17/09/2015
Es ist jedoch einfach zu bearbeiten, um es an Ihr Gebietsschema anzupassen. Mithilfe der Indizierung jedes Zeichens in der Zeichenfolge, die von der entsprechenden Umgebungsvariablen% DATE% zurückgegeben wird, können Sie die Teile der Zeichenfolge extrahieren, die Sie benötigen.
z.B. Die Verwendung von% DATE ~ 10,4% würde die Umgebungsvariable DATE erweitern und dann nur die 4 Zeichen verwenden, die am 11. Zeichen (Versatz 10) des erweiterten Ergebnisses beginnen
Wenn Sie beispielsweise Daten im US-Stil verwenden, gilt Folgendes
ddd mm/dd/yyyy
Thu 09/17/2015
echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11
Überprüfen Sie dieses ..
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 "MS=%dt:~15,3%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
Wenn Sie Python installiert haben, können Sie dies tun
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"
Sie können die Formatzeichenfolge einfach an Ihre Bedürfnisse anpassen.
python -c "import datetime;print(datetime.date.today())"
, da die __str__
Methode der date
Klasse nur aufruft isoformat()
.
Es ist möglich, PowerShell zu verwenden und seine Ausgabe mithilfe einer Schleife in eine Umgebungsvariable umzuleiten.
Über die Befehlszeile ( cmd
):
for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%a
echo %td%
2016-25-02+17:25
In einer Batchdatei können Sie %a
als %%a
:
for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%%a
FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a
so sein, verwenden Sie das obere MM für Monat und Backslash, um wörtliche Zeichen zu umgehen.
Aufgrund des Datums- und Zeitformats handelt es sich um ortsspezifische Informationen. Das Abrufen aus den Variablen% date% und% time% erfordert zusätzlichen Aufwand, um die Zeichenfolge unter Berücksichtigung der Formattransformation zu analysieren. Eine gute Idee ist es, eine API zu verwenden, um die Datenstruktur abzurufen und nach Ihren Wünschen zu analysieren. WMIC ist eine gute Wahl. Im folgenden Beispiel verwenden Sie Win32_LocalTime . Sie können auch Win32_CurrentTime oder Win32_UTCTime verwenden .
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%x in ('wmic path Win32_LocalTime get /format:list ^| findstr "="') do set %%x
set yyyy=0000%Year%
set mmmm=0000%Month%
set dd=00%Day%
set hh=00%Hour%
set mm=00%Minute%
set ss=00%Second%
set ts=!yyyy:~-4!-!mmmm:~-2!-!dd:~-2!_!hh:~-2!:!mm:~-2!:!ss:~-2!
echo %ts%
ENDLOCAL
Ergebnis:
2018-04-25_10: 03: 11
Dies ist eine Erweiterung von Joeys Antwort, um die Zeit einzuschließen und die Teile mit Nullen aufzufüllen.
Das Ergebnis ist beispielsweise 2019-06-01_17-25-36. Beachten Sie auch, dass dies die UTC-Zeit ist.
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set Month=0%Month%
set Month=%Month:~-2%
set Day=0%Day%
set Day=%Day:~-2%
set Hour=0%Hour%
set Hour=%Hour:~-2%
set Minute=0%Minute%
set Minute=%Minute:~-2%
set Second=0%Second%
set Second=%Second:~-2%
set TimeStamp=%Year%-%Month%-%Day%_%Hour%-%Minute%-%Second%
Ich benutze folgendes:
set iso_date=%date:~6,4%-%date:~3,2%-%date:~0,2%
Oder in Kombination mit einem Protokolldateinamen 'MyLogFileName':
set log_file=%date:~6,4%-%date:~3,2%-%date:~0,2%-MyLogFileName
Wenn Ihnen eine einmalige Investition von 10 bis 30 Minuten nichts ausmacht, um eine zuverlässige Lösung zu erhalten (die nicht von den Regionseinstellungen von Windows abhängt), lesen Sie bitte weiter.
Befreien wir unseren Geist. Möchten Sie die Skripte so vereinfachen, dass sie einfach so aussehen? (Angenommen, Sie möchten die Variable LOG_DATETIME festlegen.)
FOR /F "tokens=* USEBACKQ" %%F IN (`FormatNow "yyyy-MM-dd"`) DO (
Set LOG_DATETIME=%%F
)
echo I am going to write log to Testing_%LOG_DATETIME%.log
Sie können. Erstellen Sie einfach eine FormatNow.exe mit C # .NET und fügen Sie sie Ihrem PATH hinzu.
Anmerkungen:
Leistungen:
Quellcode von FormatNow.exe, den ich mit Visual Studio 2010 erstellt habe (ich ziehe es vor, ihn selbst zu erstellen, um das Risiko des Herunterladens eines unbekannten, möglicherweise schädlichen Programms zu vermeiden). Kopieren Sie einfach die folgenden Codes und fügen Sie sie ein, erstellen Sie das Programm einmal und Sie haben einen zuverlässigen Datumsformatierer für alle zukünftigen Verwendungen.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace FormatNow
{
class Program
{
static void Main(string[] args)
{
try
{
if (args.Length < 1)
{
throw new ArgumentException("Missing format");
}
string format = args[0];
Console.Write(DateTime.Now.ToString(format, CultureInfo.InvariantCulture.DateTimeFormat));
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
Wenn es um komplizierte Logiken geht, können wir dies im Allgemeinen vereinfachen, indem wir ein sehr kleines Programm erstellen und das Programm aufrufen, um die Ausgabe stattdessen in einer Batch-Skriptvariablen zu erfassen. Wir sind keine Studenten und legen keine Prüfungen ab, bei denen wir die Batch-Script-Only-Regel befolgen müssen, um Probleme zu lösen. In einer realen Arbeitsumgebung ist jede (legale) Methode zulässig. Warum sollten wir uns immer noch an die schlechten Funktionen des Windows-Batch-Skripts halten, das Problemumgehungen für viele einfache Aufgaben erfordert? Warum sollten wir das falsche Werkzeug für den Job verwenden?