मैं एक .bat फ़ाइल में कुछ चर में YYYY-MM-DD प्रारूप में वर्तमान दिनांक को कैसे बचा सकता हूं?
यूनिक्स खोल एनालॉग:
today=`date +%F`
echo $today
मैं एक .bat फ़ाइल में कुछ चर में YYYY-MM-DD प्रारूप में वर्तमान दिनांक को कैसे बचा सकता हूं?
यूनिक्स खोल एनालॉग:
today=`date +%F`
echo $today
जवाबों:
आप वर्तमान तिथि का उपयोग कर स्थानीय-अज्ञेय तरीके से प्राप्त कर सकते हैं
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
फिर आप सबस्ट्रिंग का उपयोग करके अलग-अलग हिस्सों को निकाल सकते हैं:
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%
एक और तरीका है, जहाँ आपको वैरिएबल मिलते हैं जिनमें अलग-अलग हिस्से होते हैं:
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
अपने चर नाम स्थान को प्रदूषित करने की कीमत पर, सबस्ट्रिंग के साथ बहुत अच्छा है।
यदि आपको स्थानीय समय के बजाय UTC की आवश्यकता है, तो कमांड कमोबेश समान है:
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
for /f
दो लाइनें लौटाता है, जिनमें से उत्तर एक खाली है। आप set MyDate=
बीच में उपयोग करके इसे हल कर सकते हैं । मुझे लगता है कि क्या 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%
अमान्य उत्तर है: यह महीने और दिन में एक अंक देता है। 2 महीने के बाएं लेग को कैसे जीरो महीने और डेट टू डेट स्ट्रिंग के साथ रखा जाए?
यदि आप एक बैच फ़ाइल में मानक MS-DOS कमांड का उपयोग करके इसे प्राप्त करना चाहते हैं तो आप उपयोग कर सकते हैं:
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
मुझे यकीन है कि इसे और बेहतर बनाया जा सकता है लेकिन यह दिन (dd), महीना (मिमी) और वर्ष (yyyy) के लिए 3 चर में तारीख देता है। फिर आप बाद में अपनी बैच स्क्रिप्ट में आवश्यकतानुसार इनका उपयोग कर सकते हैं।
SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%
जब मैं समझता हूं कि इस प्रश्न के लिए एक उत्तर को स्वीकार कर लिया गया है, तो इस वैकल्पिक विधि को WMI कंसोल का उपयोग किए बिना इसे प्राप्त करने के लिए कई लोगों द्वारा सराहना की जा सकती है, इसलिए मुझे आशा है कि यह इस प्रश्न के लिए कुछ मूल्य जोड़ता है।
date /T
कमांड प्रॉम्प्ट पर प्रारूप खोजने के लिए उपयोग करें ।
यदि दिनांक प्रारूप Thu 17/03/2016
इस तरह उपयोग किया जाता है :
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%
दो और तरीके जो समय सेटिंग्स पर निर्भर नहीं करते हैं (दोनों को स्थानीयकरण से स्वतंत्र डेटा / समय कैसे मिलता है )। और दोनों को सप्ताह के दिन भी मिलते हैं और उनमें से किसी को भी व्यवस्थापक अनुमति की आवश्यकता नहीं है! "
MAKECAB - हर विंडोज सिस्टम पर काम करेगा (तेजी से, लेकिन एक छोटी सी अस्थायी फ़ाइल बनाता है) (फॉक्सड्राइव स्क्रिप्ट):
@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 - यह विंडोज एक्सपी के लिए एक देशी कमांड नहीं है और विंडोज सर्वर 2003 के , लेकिन इसे माइक्रोसॉफ्ट साइट से डाउनलोड किया जा सकता है । लेकिन यह विंडोज़ विस्टा और इसके बाद के संस्करण की सभी चीजों में अंतर्निहित है:
@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
और तीन और तरीके जो अन्य विंडोज स्क्रिप्ट भाषाओं का उपयोग करते हैं। वे आपको अधिक लचीलापन देंगे जैसे कि आप वर्ष के सप्ताह, मिलिसेकंड में समय और इतने पर प्राप्त कर सकते हैं।
JScript / BATCH हाइब्रिड (के रूप में सहेजा जाना चाहिए .bat
)। विंडोज स्क्रिप्ट होस्ट के एक भाग के रूप में, विंडोज एनटी और उससे ऊपर के हर सिस्टम पर JScript उपलब्ध है ( हालांकि रजिस्ट्री के माध्यम से इसे दुर्लभ रूप से अक्षम किया जा सकता है ):
@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 हाइब्रिड ( क्या अस्थायी फ़ाइल का उपयोग किए बिना बैच फ़ाइल के भीतर VBScript को एम्बेड और निष्पादित करना संभव है? ) ऐसा ही मामला jscript के रूप में है, लेकिन संकरण इतना सही नहीं है:
: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 - प्रत्येक मशीन पर स्थापित किया जा सकता है जिसमें .NET है - Microsoft से डाउनलोड करें ( v1 , v2 , और v3 (केवल विंडोज 7 और इसके बाद के संस्करण के लिए))। Windows 7 / Win2008 और इसके बाद के संस्करण पर डिफ़ॉल्ट रूप से इंस्टॉल किया गया:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
स्व-संकलित jscript.net/batch (मैंने कभी भी बिना .NET के विंडोज मशीन नहीं देखी है, इसलिए मुझे लगता है कि यह एक बहुत ही पोर्टेबल है):
@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"));
लकड़हारा यह सप्ताह का वर्ष और दिन नहीं मिल सकता है। यह तुलनात्मक रूप से धीमा है, एक अस्थायी फ़ाइल भी बनाता है और यह उस समय टिकटों पर आधारित है जो लॉगमैन अपनी लॉग फ़ाइलों पर रखता है। विंडोज एक्सपी और इसके बाद के संस्करण से सब कुछ काम करता है। यह शायद कभी किसी के द्वारा उपयोग नहीं किया जाएगा - मेरे सहित - लेकिन यह एक और तरीका है ...
@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
Get-Date फ़ंक्शन के बारे में अधिक जानकारी ।
मुझे वास्तव में जॉय की विधि पसंद आई, लेकिन मुझे लगा कि मैं इस पर थोड़ा विस्तार करूंगा।
इस दृष्टिकोण में, आप कोड को कई बार चला सकते हैं और पुरानी तिथि मान के बारे में चिंता न करें "चारों ओर चिपके हुए" क्योंकि यह पहले से ही परिभाषित है।
हर बार जब आप इस बैच फ़ाइल को चलाते हैं, तो यह आईएसओ 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%
इस संस्करण में, आपको सावधान रहना होगा कि फ़ाइल में कई स्थानों पर एक ही कोड को कॉपी / पेस्ट न करें क्योंकि इससे डुप्लिकेट लेबल का कारण होगा। आप या तो प्रत्येक प्रतिलिपि के लिए एक अलग लेबल रख सकते हैं, या बस इस कोड को अपनी बैच फ़ाइल में डाल सकते हैं और जहाँ भी आवश्यक हो, अपनी स्रोत फ़ाइल से कॉल कर सकते हैं।
@ProVi द्वारा दिए गए उत्तर के अनुसार बस आपको आवश्यक फ़ॉर्मेटिंग के अनुरूप बदलना होगा
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
वापस होगा
yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11
EDIT @Jeb टिप्पणी के अनुसार, उपरोक्त समय प्रारूप सही है जो केवल तभी काम करेगा जब आपका DATE / T कमांड वापस आएगा
ddd dd/mm/yyyy
Thu 17/09/2015
हालाँकि, अपने स्थान के अनुरूप होना संपादित करना आसान है, लेकिन संबंधित% DATE% परिवेश चर द्वारा लौटाए गए स्ट्रिंग में प्रत्येक वर्ण के अनुक्रमण का उपयोग करके आप अपनी आवश्यकता के स्ट्रिंग के हिस्सों को निकाल सकते हैं।
जैसे। % DATE ~ 10,4% का उपयोग DATE वातावरण चर का विस्तार करेगा, और फिर विस्तारित परिणाम के 11 वें (ऑफसेट 10) वर्ण पर शुरू होने वाले केवल 4 वर्णों का उपयोग करेगा
उदाहरण के लिए यदि यूएस स्टाइल वाली तारीखों का उपयोग किया जाता है तो निम्नलिखित लागू होता है
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
इसे जाँचें..
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
यदि आपके पास पायथन स्थापित है, तो आप कर सकते हैं
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"
आप अपनी आवश्यकताओं के लिए आसानी से प्रारूप स्ट्रिंग को अनुकूलित कर सकते हैं।
python -c "import datetime;print(datetime.date.today())"
, क्योंकि कक्षा __str__
का तरीका date
सिर्फ कहता है isoformat()
।
पॉवरशेल का उपयोग करना संभव है और एक लूप का उपयोग करके इसके उत्पादन को पर्यावरण चर पर पुनर्निर्देशित करना संभव है।
कमांड लाइन से ( 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
एक बैच फ़ाइल में आप बच सकता है %a
के रूप में %%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
ताकि महीने के लिए ऊपरी एमएम का उपयोग करें और शाब्दिक पात्रों से बचने के लिए बैकस्लैश करें।
दिनांक और समय प्रारूप के कारण स्थान विशिष्ट जानकारी होती है, उन्हें% दिनांक% और% समय चर से पुनर्प्राप्त करना स्ट्रिंग को विचार में बदलने के साथ स्ट्रिंग को पार्स करने के लिए अतिरिक्त प्रयास की आवश्यकता होगी। एक अच्छा विचार डेटा संरचना और पार्स को पुनः प्राप्त करने के लिए कुछ एपीआई का उपयोग करना है। WMIC एक अच्छा विकल्प है। नीचे उदाहरण Win32_LocalTime का उपयोग करें । आप Win32_CurrentTime या 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
परिणाम:
2018-04-25_10: 03: 11
यह जॉय के उत्तर का एक विस्तार है जिसमें समय शामिल है और 0 के साथ भागों को पैड किया गया है।
उदाहरण के लिए, परिणाम 2019-06-01_17-25-36 होगा। यह भी ध्यान दें कि यह यूटीसी समय है।
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%
मैं निम्नलिखित का उपयोग कर रहा हूं:
set iso_date=%date:~6,4%-%date:~3,2%-%date:~0,2%
या लॉगफ़ाइल नाम 'MyLogFileName' के साथ संयोजन में:
set log_file=%date:~6,4%-%date:~3,2%-%date:~0,2%-MyLogFileName
यदि आपको एक विश्वसनीय समाधान प्राप्त करने के लिए 10 से 30 मिनट के एक बार के निवेश पर कोई आपत्ति नहीं है (जो कि विंडोज की क्षेत्र सेटिंग्स पर निर्भर नहीं करता है), तो कृपया इसे चालू करें।
हमारे मन को मुक्त करो। क्या आप स्क्रिप्ट को सरल बनाने के लिए सिर्फ इस तरह दिखना चाहते हैं? (मान लें कि आप 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
आप ऐसा कर सकते हैं। बस C # .NET के साथ एक FormatNow.exe बनाएँ और इसे अपने पेट में जोड़ें।
टिप्पणियाँ:
लाभ:
FormatNow.exe का स्रोत कोड जिसे मैंने विज़ुअल स्टूडियो 2010 के साथ बनाया था (मैं अज्ञात, संभवतः दुर्भावनापूर्ण प्रोग्राम को डाउनलोड करने के जोखिम से बचने के लिए इसे स्वयं बनाना पसंद करता हूं)। बस नीचे दिए गए कोड को कॉपी और पेस्ट करें, एक बार प्रोग्राम का निर्माण करें, और फिर आपके पास भविष्य के सभी उपयोगों के लिए एक विश्वसनीय तारीख फ़ॉर्मेटर है।
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());
}
}
}
}
सामान्य तौर पर, जब जटिल लॉजिक्स के साथ काम करते हैं, तो हम बहुत छोटे प्रोग्राम का निर्माण करके और आउटपुट को वापस एक बैच स्क्रिप्ट चर पर कब्जा करने के लिए प्रोग्राम को कॉल करके इसे सरल बना सकते हैं। हम छात्र नहीं हैं और हम समस्याओं को हल करने के लिए हमें बैच-स्क्रिप्ट-केवल नियम का पालन करने के लिए परीक्षा की आवश्यकता नहीं ले रहे हैं। वास्तविक काम के माहौल में, किसी भी (कानूनी) विधि की अनुमति है। हमें अभी भी विंडोज बैच स्क्रिप्ट की खराब क्षमताओं से क्यों चिपके रहना चाहिए जो कई सरल कार्यों के लिए वर्कअराउंड की आवश्यकता है? हमें नौकरी के लिए गलत उपकरण का उपयोग क्यों करना चाहिए?