Bagaimana cara mendapatkan tanggal dalam file batch dalam format yang dapat diprediksi?

17

Dalam file batch saya perlu mengekstrak bulan, hari, tahun dari perintah tanggal. Jadi saya menggunakan yang berikut, yang pada dasarnya mem-parsing perintah Date untuk mengekstrak sub-stringnya menjadi variabel:

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

Ini semua hebat, tetapi jika saya menyebarkan file batch ini ke mesin dengan pengaturan regional / negara yang berbeda, itu gagal karena bulan, hari dan tahun di lokasi yang berbeda.

Bagaimana saya bisa mengekstrak bulan, hari dan tahun terlepas dari format tanggal?

AngryHacker
sumber
1
Apakah Anda benar-benar dibatasi untuk Batch? Hal seperti itu jauh lebih sederhana di VBScript / WSH dan / atau PowerShell ...
Adrien
@ Adrien, Ya terbatas pada batch - itu bagian dari langkah pasca-pembangunan VS2008.
AngryHacker
mengganti% tanggal% dengan% tanggal: ~ 6,4% -% tanggal: ~ 3,2% -% tanggal: ~ 0,2% berhasil
MagTun

Jawaban:

14

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

Metode 2 (cmd tunggal)

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

masukkan deskripsi gambar di sini


Metode 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
sumber
1
Ah ha, cara yang sangat rapi untuk menemukan tanggal pemesanan lokal. ss64 memang memiliki komunitas pengguna cmd.exe yang bagus.
Nicholi
Saya menyertakan kedua skrip dari tautan sumber Anda. Semoga tidak apa-apa untuk Anda
nixda
@nixda Tidak masalah, apa pun yang pengguna bantu.
Tex Hex
Jika Anda perlu mempertahankan detik di "Metode 2" di atas, tambahkan Set _second=00%%Kketika mengekstraksi dari wmicdan pad dengan nol depan seperti yang lain.
Tim Parenti
12

Windows XP dan yang lebih baru

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%

Keluaran

masukkan deskripsi gambar di sini

and31415
sumber
+1 untuk jawaban paling ringkas. Saya juga menyarankan diakhiri dengan ECHO %year%-%month%-%day%yang ISO dan format filesystem yang kompatibel (belum lagi secara otomatis mengurutkan berdasarkan tahun-bulan-hari). :-).
Zephan Schroeder
3

Saya tahu itu bukan apa yang Anda minta, tapi saya menggunakan port Windows dari dateaplikasi Linux dari perintah di dalam file batch dan kemudian menetapkan hasilnya ke variabel.

Saya belum menemukan cara untuk mendapatkan tanggal dengan andal hanya dengan menggunakan perintah batch.

Hydaral
sumber
2

Gunakan file batch ini untuk format YYYY-MM-DD. Itu menggunakan alat instrumentasi jendela yang harus hadir di semua versi Windows terbaru untuk mendapatkan string datetime yang independen dari pengaturan regional.

Simpan ke file batch ke path (misalnya) c: \ windows \ rdate.bat kemudian akses dengan CALL RDATE.BAT untuk mengatur variabel. Bergantian, salin kode ke file batch Anda.

Format tanggal ini cocok untuk nama file dan pencatatan. Jenisnya benar. Variabel logtime menambahkan variabel tanggal + waktu sebagai YYYY-MM-DD-HHMMSS yang cocok untuk digunakan dalam mencatat aktivitas file batch pada akurasi kedua.

Sesuaikan format tanggal (dan waktu) sesuai keinginan. REM layar gema dalam produksi. Dua angka dalam setiap pemilihan teks adalah indeks karakter awal berbasis nol dan jumlah karakter untuk disalin, misalnya,% datetime: ~ 0,4% mengambil substring 4 karakter mulai dari posisi 0.

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
sumber
1
Hampir sama dengan jawaban and31415 . Kedua skrip menggunakanwmic os get localdatetime
nixda
0

Apakah Anda mencoba menggunakan NET TIME \\%ComputerName%bukan DATE? Saya pikir itu NET TIMEseharusnya menyediakan data dalam format yang konsisten terlepas dari lokal.

Gereja
sumber
Tidak, tidak.
AngryHacker
Menarik, saya baru mencobanya, beralih antara format AU dan AS, dan net timeselalu menampilkan dalam format m / d / yyyy. @AngryHacker, dengan pengaturan apa tidak berfungsi untuk Anda?
Hydaral
1
Saya beralih bahasa Prancis (Belgia) dan memberi saya 2011-07-27. AS memberikan
07/27/2011
0

Berkat posting Shekhar ini berfungsi sesuai kebutuhan dan nol waktu.

@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%

Output: LogFile-20151113-0901.txt

Trifused
sumber
-1

Ini mungkin agak di luar topik, tetapi di sini ada file .bat yang saya tulis untuk backup terjadwal saya dan juga panggilan dari tindakan postbuild di visual studio. Saya harap beberapa orang akan merasakan manfaatnya.

Simpan yang berikut ini ke file .bat

--------------------------------------------------
**:: 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
sumber
1
tl; dr, Anda dapat menambahkan penjelasan tentang apa yang dilakukan skrip. karena itu tidak muncul sebagai solusi segera. Mungkin juga lebih berguna, jika Anda dapat menghapus bit kode yang tidak relevan
Shekhar
1
Seluruh skrip kumpulan bergantung pada variabel %date%dan %time%, yang sadar lokal, dan tidak dapat benar-benar diuraikan dengan cara yang dapat diprediksi seperti yang diminta OP.
and31415