Wie erhält man das Datum in einer Batch-Datei in einem vorhersehbaren Format?

17

In einer Batchdatei muss ich einen Monat, einen Tag und ein Jahr aus dem Datumsbefehl extrahieren. Daher habe ich Folgendes verwendet, das den Date-Befehl im Wesentlichen analysiert, um seine Unterzeichenfolgen in eine Variable zu extrahieren:

set Day=%Date:~3,2%
set Mth=%Date:~0,2%
set Yr=%Date:~6,4%

Das ist alles großartig, aber wenn ich diese Batchdatei auf einem Computer mit anderen regionalen / Ländereinstellungen bereitstelle, schlägt dies fehl, da sich Monat, Tag und Jahr an verschiedenen Orten befinden.

Wie kann ich Monat, Tag und Jahr unabhängig vom Datumsformat extrahieren?

AngryHacker
quelle
1
Sind Sie absolut auf Batch beschränkt? So etwas ist in VBScript / WSH und / oder PowerShell viel einfacher ...
Adrien
@Adrien, Ja, beschränkt auf Batch - dies ist Teil des VS2008-Postbuild-Schritts.
AngryHacker
Ersetzen von% date% durch% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% gearbeitet
MagTun

Antworten:

14

Quelle: http://ss64.com/nt/syntax-getdate.html

Methode 2 (einzelnes cmd)

GetDate.cmd

@Echo off
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

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

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%

:: Display the date/time in ISO 8601 format:
Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute%
Echo %_isodate%
pause

Bildbeschreibung hier eingeben


Methode 1 (cmd + vb)

GetDate.cmd

@Echo off
For /f %%G in ('cscript /nologo getdate.vbs') do set _dtm=%%G
Set _yyyy=%_dtm:~0,4%
Set _mm=%_dtm:~4,2%
Set _dd=%_dtm:~6,2%
Set _hh=%_dtm:~8,2%
Set _nn=%_dtm:~10,2%
Echo %_yyyy%-%_mm%-%_dd%T%_hh%:%_nn%

getdate.vbs

Dim dt
dt=now
'output format: yyyymmddHHnn
wscript.echo ((year(dt)*100 + month(dt))*100 + day(dt))*10000 + hour(dt)*100 + minute(dt)
Tex Hex
quelle
1
Ah ha, sehr gute Möglichkeit, die Datumsbestellung des Gebietsschemas zu finden. ss64 hat eine raffinierte Community von cmd.exe-Benutzern.
Nicholi
Ich habe beide Skripte aus Ihrem Quelllink eingefügt. Hoffe, es ist in
Ordnung
@nixda Kein Problem, was auch immer der Benutzer hilft.
Tex Hex
Wenn Sie die Sekunden in "Methode 2" oben beibehalten müssen, fügen Sie wie die anderen Set _second=00%%Kbeim Extrahieren von wmicund Auffüllen mit führenden Nullen hinzu.
Tim Parenti
12

Windows XP und höher

getDate.cmd

@echo off
for /f "tokens=2 delims==" %%G in ('wmic os get localdatetime /value') do set datetime=%%G

set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%

echo %year%/%month%/%day%

Ausgabe

Bildbeschreibung hier eingeben

und31415
quelle
+1 für die prägnanteste Antwort. Ich würde auch vorschlagen, mit ECHO %year%-%month%-%day%welchem ​​ISO- und Dateisystem-kompatiblen Format zu enden (ganz zu schweigen von der automatischen Sortierung nach Jahr-Monat-Tag). :-).
Zephan Schroeder
3

Ich weiß, es ist nicht genau das, wonach Sie gefragt haben, aber ich verwende den Windows-Port der Linux- dateAnwendung über einen Befehl in der Batch-Datei und ordne das Ergebnis einer Variablen zu.

Ich habe noch keine Möglichkeit gefunden, das Datum nur mit Batch-Befehlen zuverlässig zu ermitteln.

Hydaral
quelle
2

Verwenden Sie diese Batchdatei für das Format JJJJ-MM-TT. Es verwendet das Fensterinstrumentationstool, das in allen neueren Windows-Versionen vorhanden sein sollte, um eine Datums- / Uhrzeitzeichenfolge abzurufen, die von den regionalen Einstellungen unabhängig ist.

Speichern Sie in einer Batch-Datei den Pfad (z. B.) c: \ windows \ rdate.bat und greifen Sie dann mit CALL RDATE.BAT auf die Variable (n) zu. Kopieren Sie alternativ den Code in Ihre Batch-Datei.

Dieses Datumsformat eignet sich für Dateinamen und Protokollierung. Es sortiert richtig. Die Variable logtime fügt eine Datums- und Zeitvariable als JJJJ-MM-TT-HHMMSS hinzu, die zur sekundengenauen Protokollierung von Batch-Datei-Aktivitäten geeignet ist.

Passen Sie die Datums- (und Uhrzeit-) Formate nach Ihren Wünschen an. REM das Bildschirmecho in der Produktion. Die beiden Zahlen in jeder Textauswahl sind der auf Null basierende Startzeichenindex und die Anzahl der zu kopierenden Zeichen, z. B.% datetime: ~ 0,4% nimmt eine Teilzeichenfolge mit 4 Zeichen ab Position 0 an.

echo off
rem First, get the locality-invariant datetime
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
rem echo %datetime%

rem Build the reverse date string YYYY-MM-DD
set rdate=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%
echo rdate=%rdate%

rem Built a datetime string YYYY-MM-DD-hhmmss
set logtime=%rdate%-%datetime:~8,6% 
echo logtime=%logtime%
Jim Birch
quelle
1
Fast das Gleiche wie die Antwort von and31415 . Beide Skripte verwendenwmic os get localdatetime
Nixda
0

Haben Sie versucht, NET TIME \\%ComputerName%statt zu verwenden DATE? Ich denke, NET TIMEdas soll die Daten in einem einheitlichen Format unabhängig vom Gebietsschema bereitstellen.

Kirche
quelle
Nein, tut es nicht.
AngryHacker
Interessant, ich habe es nur ausprobiert, zwischen AU- und US-Format net timegewechselt und immer im Format M / T / JJJJ ausgegeben. @AngryHacker, mit welchen Einstellungen hat es bei dir nicht geklappt?
Hydaral
1
Ich habe Französisch (Belgisch) gewechselt und es gab mir 2011-07-27. Die USA geben 27.07.2011
AngryHacker
0

Dank Shekhars Post funktioniert dies nach Bedarf und ohne Auffüllen der Zeit.

@Echo Off

for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%%date:~4,2%%date:~7,2%-%%d%%e

set datetimestr=%var: =0%

set logfile=LogFile-%datetimestr%.txt

echo %logfile%

Ausgabe: LogFile-20151113-0901.txt

Trifused
quelle
-1

Dies mag ein wenig vom Thema abweichen, aber hier ist eine .bat-Datei, die ich für meine eigenen geplanten Sicherungen und auch für Aufrufe von Postbuild-Aktionen in Visual Studio geschrieben habe. Ich hoffe, dass einige es nützlich finden.

Speichern Sie Folgendes in eine .bat-Datei

--------------------------------------------------
**:: The following is Copyright © 2012 ShopNetNuke Corp.  All rights reserved.
::  and released under the GNU General Public License (GPLv3)**

:: The following section retrieves the current date and time and formats it into the '%var%' variable
:: This format always ensures that the Date and Time are fixed length to avoid the situation of
:: having a value of '12/ 1/2012 rather than '12/01/2012'
echo off
for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
set var=%var: =0%
echo Beginning my valuable Backup Set:  Backup--%var%

:: If you wanted to request the user input a filename prefix, 
:: then we would use something similar to this
:: set /p nameprefix= Enter the file name prefix?
:: Get the Current Date and Time
::for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
:: set var=%var: =0%
:: echo Beginning my valuable Backup Set:  Backup--%var%_%nameprefix%

Pause

echo Starting SQL Server Database Backup Job...
:: The following line initiates the Backup job within SqlServer Agent.
:: Change 'MyBackupNameInSqlAgent' to the name of the job you want executed
:: Change the directory paths to those relevant to your current system installation directories
:: SqlAgent will not return a value if the backup action succeed, 
:: however, in the event an error is encountered, it will be echoed onto the screen
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe" -S SQLSERVERNAME\INSTANCENAME -Q "execute msdb.dbo.sp_start_job @job_name = 'MyBackupNameInSqlAgent'"
:: An error will be returned if the Backup job is not found or has already been triggered by another process

echo Starting My Valuable Source Code Directory Backup...

echo ...backing up files and folders in "C:\Source\MyPreciousProjectDirectory\"...
:: The following line will execute the 7zip command to create a .7z file of the directory named in 'MyPreciousProjectDirectory'
:: and tells it to put the archive in the 'MyPreciousBackupDirectory'.  The compression level will be defined by the 7zip default settings
:: The -p flag tells 7zip to password protect the archive, in this case, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectory\%var%\MyPreciousProject--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 

echo Source Code Directory Backups complete.

echo Archiving Database Backups now...
:: The following line will execute the 7zip command to archive the Database backup.
:: The '*' could be replaced by the actual backup name.
:: The '*' indicates all files of type '.bak'
:: The -p flag tells 7zip to password protect the archive, in this case, again, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z  C:\MyPreciousBackupDirectory\%var%\MyPreciousProject-Database-%var%.7z -p%var% -mhe "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLDEV08\MSSQL\Backup\*.bak"

echo Database Backup Archival process complete.

:: If you wanted to place both the previous backups into one single combination archive,
:: you could do something like the following
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var%\MyPreciousProjectBackupSourceAndDatabase--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 


echo Now attempting to copy archives to Network Server...
:: The following line will use xcopy to copy the arechives to the server backup directory and place them in a directory named by the DateTime variable %var%
xcopy /S /I /J /Y C:\MyPreciousBackupDirectory\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%
:: Or if the combination above was used then copy that...
xcopy /S /I /J /Y C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%


echo 7z Archive files transferred to MyPreciousBackupServerName successfully
echo  ||
echo \||/
echo  \/
echo ---------------------------------------------------
echo ----- BACKUP SET "%var%" COMPLETE ------
echo ---------------------------------------------------
pause
JC
quelle
1
tl; dr, Sie könnten eine Erklärung hinzufügen, was das Skript macht. weil es nicht sofort als Lösung herauskommt. Es könnte auch nützlicher sein, wenn Sie die nicht relevanten Code-
Teile
1
Das gesamte Stapelskript basiert auf den Variablen %date%und %time%, die für das Gebietsschema relevant sind und nicht wirklich vorhersehbar analysiert werden können, wie vom OP gefordert.
And31415