Bagaimana cara menyimpan tanggal saat ini dalam format YYYY-MM-DD ke dalam beberapa variabel di file Windows .bat?
Analog shell Unix:
today=`date +%F`
echo $today
Bagaimana cara menyimpan tanggal saat ini dalam format YYYY-MM-DD ke dalam beberapa variabel di file Windows .bat?
Analog shell Unix:
today=`date +%F`
echo $today
Jawaban:
Anda bisa mendapatkan tanggal hari ini dengan cara lokal-agnostik menggunakan
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
Kemudian Anda dapat mengekstrak setiap bagian menggunakan substring:
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%
Cara lain, di mana Anda mendapatkan variabel yang berisi bagian-bagian individual, adalah:
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
Jauh lebih bagus daripada mengutak-atik substring, dengan mengorbankan namespace variabel Anda.
Jika Anda membutuhkan UTC, bukan waktu lokal, perintahnya kurang lebih sama:
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
for /f
mengembalikan dua baris, yang terakhir kosong. Anda dapat menyelesaikannya dengan menggunakan set MyDate=
di antaranya. Saya rasa itulah yang tersandung oleh user2023861.
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%
adalah jawaban yang tidak valid: mengembalikan satu digit bulan dan hari. Bagaimana cara mendapatkan bantalan kiri 2 digit dengan string nol bulan dan hari ke tanggal?
Jika Anda ingin mencapai ini menggunakan perintah MS-DOS standar dalam file batch, maka Anda dapat menggunakan:
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
Saya yakin ini dapat ditingkatkan lebih jauh tetapi ini memberikan tanggal menjadi 3 variabel untuk Hari (hh), Bulan (mm) dan Tahun (yyyy). Anda kemudian dapat menggunakan ini nanti di skrip batch sesuai kebutuhan.
SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%
Meskipun saya memahami bahwa jawaban telah diterima untuk pertanyaan ini, metode alternatif ini dapat dihargai oleh banyak orang yang ingin mencapai ini tanpa menggunakan konsol WMI, jadi saya berharap ini menambah nilai pada pertanyaan ini.
Gunakan date /T
untuk menemukan format pada command prompt.
Jika format tanggal Thu 17/03/2016
digunakan seperti ini:
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%
Dua cara lagi yang tidak bergantung pada pengaturan waktu (keduanya diambil dari Cara mendapatkan data / waktu independen dari lokalisasi ). Dan keduanya juga mendapatkan hari dalam seminggu dan tidak ada yang memerlukan izin admin !:
MAKECAB - akan bekerja pada SETIAP sistem Windows (cepat, tetapi membuat file sementara kecil) (skrip foxidrive):
@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 - ini bukan perintah asli untuk Windows XP dan Windows Server 2003 , tetapi dapat diunduh dari situs Microsoft . Tapi itu built-in dalam segala hal mulai dari Windows Vista dan yang lebih baru:
@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
Dan tiga cara lagi yang menggunakan bahasa skrip Windows lainnya. Mereka akan memberi Anda lebih banyak fleksibilitas misalnya Anda bisa mendapatkan minggu dalam setahun, waktu dalam milidetik dan seterusnya.
JScript / BATCH hybrid (perlu disimpan sebagai .bat
). JScript tersedia di setiap sistem dari Windows NT dan di atasnya, sebagai bagian dari Windows Script Host ( meskipun dapat dinonaktifkan melalui registri, ini jarang terjadi ):
@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 ( Apakah mungkin untuk menyematkan dan mengeksekusi VBScript dalam file batch tanpa menggunakan file sementara? ) Kasus yang sama seperti jscript, tetapi hibridisasi tidak begitu sempurna:
: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 - dapat diinstal di setiap mesin yang memiliki .NET - unduh dari Microsoft ( v1 , v2 , dan v3 (hanya untuk Windows 7 dan yang lebih baru)). Diinstal secara default pada semua bentuk Windows 7 / Win2008 dan yang lebih baru:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
Jscript.net/batch yang dikompilasi sendiri (Saya belum pernah melihat mesin Windows tanpa .NET jadi saya pikir ini cukup portabel):
@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"));
Tukang tebang kayu Ini tidak bisa mendapatkan tahun dan hari dalam seminggu. Ini relatif lambat, juga membuat file temp dan didasarkan pada stempel waktu yang dimasukkan logman ke file log-nya. Akan bekerja dari Windows XP dan yang lebih baru. Ini mungkin tidak akan pernah digunakan oleh siapa pun - termasuk saya - tetapi itu satu cara lagi ...
@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
Informasi lebih lanjut tentang fungsi Get-Date .
Saya sangat menyukai metode Joey, tetapi saya pikir saya akan mengembangkannya sedikit.
Dalam pendekatan ini, Anda dapat menjalankan kode beberapa kali dan tidak perlu khawatir tentang nilai tanggal lama yang "bertahan" karena sudah ditentukan.
Setiap kali Anda menjalankan file batch ini, ini akan mengeluarkan representasi tanggal dan waktu gabungan yang kompatibel dengan ISO 8601.
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%
Dalam versi ini, Anda harus berhati-hati untuk tidak menyalin / menempelkan kode yang sama ke beberapa tempat dalam file karena akan menyebabkan label ganda. Anda dapat memiliki label terpisah untuk setiap salinan, atau cukup memasukkan kode ini ke dalam file batch-nya sendiri dan memanggilnya dari file sumber Anda jika diperlukan.
Sesuai jawaban oleh @ProVi, ubah saja agar sesuai dengan format yang Anda butuhkan
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
akan kembali
yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11
EDIT Sesuai komentar @Jeb, siapa yang benar format waktu di atas hanya akan berfungsi jika perintah DATE / T Anda kembali
ddd dd/mm/yyyy
Thu 17/09/2015
Namun, mudah untuk mengedit agar sesuai dengan lokal Anda, dengan menggunakan pengindeksan setiap karakter dalam string yang dikembalikan oleh variabel lingkungan% DATE% yang relevan, Anda dapat mengekstrak bagian-bagian string yang Anda butuhkan.
misalnya. Menggunakan% DATE ~ 10,4% akan memperluas variabel lingkungan DATE, dan kemudian hanya menggunakan 4 karakter yang dimulai pada karakter ke-11 (offset 10) dari hasil yang diperluas
Misalnya jika menggunakan tanggal bergaya AS maka hal berikut ini berlaku
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
Periksa ini..
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
Jika Anda telah menginstal Python, Anda dapat melakukannya
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"
Anda dapat dengan mudah menyesuaikan string format dengan kebutuhan Anda.
python -c "import datetime;print(datetime.date.today())"
, karena __str__
metode date
kelas hanya memanggil isoformat()
.
Dimungkinkan untuk menggunakan PowerShell dan mengarahkan outputnya ke variabel lingkungan dengan menggunakan loop.
Dari baris perintah ( 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
Dalam file batch, Anda mungkin lolos %a
sebagai%%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
jadi gunakan MM atas untuk bulan dan garis miring terbalik untuk menghindari karakter literal.
Karena format tanggal dan waktu adalah info spesifik lokasi, mengambilnya dari variabel% date% dan% time% akan membutuhkan upaya ekstra untuk mengurai string dengan transformasi format menjadi pertimbangan. Ide yang bagus adalah menggunakan beberapa API untuk mengambil struktur data dan mengurai sesuai keinginan. WMIC adalah pilihan yang bagus. Contoh di bawah ini menggunakan Win32_LocalTime . Anda juga dapat menggunakan Win32_CurrentTime atau Win32_UTCTime .
@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
Hasil:
2018-04-25_10: 03: 11
Ini adalah perpanjangan dari jawaban Joey dengan memasukkan waktu dan mengisi bagian dengan 0.
Misalnya, hasilnya adalah 2019-06-01_17-25-36. Perhatikan juga bahwa ini adalah waktu UTC.
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%
Saya menggunakan yang berikut ini:
set iso_date=%date:~6,4%-%date:~3,2%-%date:~0,2%
Atau dalam kombinasi dengan nama file log 'MyLogFileName':
set log_file=%date:~6,4%-%date:~3,2%-%date:~0,2%-MyLogFileName
Jika Anda tidak keberatan dengan investasi satu kali 10 hingga 30 menit untuk mendapatkan solusi yang andal (yang tidak bergantung pada pengaturan wilayah Windows), silakan baca terus.
Mari bebaskan pikiran kita. Apakah Anda ingin menyederhanakan skrip agar terlihat seperti ini? (Asumsikan Anda ingin menyetel variabel LOG_DATETIME)
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
Kamu bisa. Cukup buat FormatNow.exe dengan C # .NET dan tambahkan ke PATH Anda.
Catatan:
Manfaat:
Kode sumber FormatNow.exe yang saya buat dengan Visual Studio 2010 (Saya lebih suka membuatnya sendiri untuk menghindari risiko mengunduh program yang tidak dikenal, mungkin berbahaya). Cukup salin dan tempel kode di bawah, buat program sekali, dan kemudian Anda memiliki pemformat tanggal yang andal untuk semua penggunaan di masa mendatang.
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());
}
}
}
}
Secara umum, ketika berurusan dengan logika yang rumit, kita dapat membuatnya lebih sederhana dengan membuat program yang sangat kecil dan memanggil program untuk menangkap keluaran kembali ke variabel skrip batch sebagai gantinya. Kami bukan siswa dan kami tidak mengikuti ujian yang mengharuskan kami mengikuti aturan hanya skrip batch untuk menyelesaikan masalah. Dalam lingkungan kerja nyata, metode (legal) apa pun diperbolehkan. Mengapa kita harus tetap berpegang pada kemampuan buruk skrip batch Windows yang memerlukan solusi untuk banyak tugas sederhana? Mengapa kami harus menggunakan alat yang salah untuk pekerjaan itu?