Windows बैच: स्वरूपित दिनांक को चर में


105

मैं एक .bat फ़ाइल में कुछ चर में YYYY-MM-DD प्रारूप में वर्तमान दिनांक को कैसे बचा सकता हूं?

यूनिक्स खोल एनालॉग:

today=`date +%F`
echo $today



1
adarshr, उस प्रश्न का उत्तर इससे निपटने का एक बहुत ही भयानक और त्रुटि-युक्त तरीका उपयोग करता है। मैं इसे इस्तेमाल न करने की सलाह दूंगा।
जॉय

नीचे दिए गए उत्तरों को समझने के लिए यह लिंक सहायक है। ss64.com/nt/for_f.html
smwikipedia

जवाबों:


151

आप वर्तमान तिथि का उपयोग कर स्थानीय-अज्ञेय तरीके से प्राप्त कर सकते हैं

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%

1
@ user2023861 यह प्रतीत होता है कि भले ही मैं कमांड प्रॉम्प्ट खोलता हूं, मुझे कमांड के आह्वान के समय हमेशा सही तिथि / समय मिलता है, न कि जब मैंने कमांड प्रॉम्प्ट खोला था।
ADTC

5
ध्यान दें कि यदि आप उपरोक्त लाइन को कई बार चलाते हैं तो आपको प्रत्येक मंगलाचरण के लिए एक नई तारीख नहीं मिलेगी, क्योंकि यह चर के अपरिभाषित होने की जाँच करता है। इसकी आवश्यकता है क्योंकि for /fदो लाइनें लौटाता है, जिनमें से उत्तर एक खाली है। आप set MyDate=बीच में उपयोग करके इसे हल कर सकते हैं । मुझे लगता है कि क्या user2023861 पर ठोकर खाई है।
जॉय

1
@CharlesWood, कम से कम मैं अपने स्वयं के बैच फ़ाइलों में मजबूती के लिए प्रयास करता हूं, हालांकि इन दिनों मैं अक्सर इसके बजाय पावरशेल का उपयोग करता हूं।
जॉय

1
चर कि निर्धारित किया जाएगा: Year, Month, Day, Hour, Minute, Second, Quarter, WeekInMonth,DayOfWeek
उपयोगकर्ता

2
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day% अमान्य उत्तर है: यह महीने और दिन में एक अंक देता है। 2 महीने के बाएं लेग को कैसे जीरो महीने और डेट टू डेट स्ट्रिंग के साथ रखा जाए?
एंड्रस

39

यदि आप एक बैच फ़ाइल में मानक 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 कंसोल का उपयोग किए बिना इसे प्राप्त करने के लिए कई लोगों द्वारा सराहना की जा सकती है, इसलिए मुझे आशा है कि यह इस प्रश्न के लिए कुछ मूल्य जोड़ता है।


3
मैंने पाया कि मुझे इसे विंडोज़ 7 बॉक्स पर थोड़ा बदलने की जरूरत है। टोकन को एक से बढ़ाना आवश्यक है: ... For / F "TOKENS = 2,3,4 eol = / DELIMS = /" ...
जो जॉन्सटन


34

date /Tकमांड प्रॉम्प्ट पर प्रारूप खोजने के लिए उपयोग करें ।

यदि दिनांक प्रारूप Thu 17/03/2016इस तरह उपयोग किया जाता है :

set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%

1
यह पूछे गए प्रश्न का निकटतम उत्तर है। एक साधारण एक-लाइनर की मुझे ज़रूरत थी, एक कार्यक्रम की नहीं।
DCookie

2
माना। यहां कुछ उत्तर लगभग "MS SQL सर्वर स्थापित करें, SQL क्लाइंट से कनेक्ट करें और कमांड निष्पादित करें" जैसे दिखते हैं SELECT CONVERT(VARCHAR(16), GETDATE(), 112)
isapir

2
ISO-8601 प्रारूप में तारीख-समय है%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
isapir

3
अन्य प्रतिक्रियाओं को एक कार्यक्रम की तरह देखने का कारण यह है कि यह उत्तर, हालांकि सरल है, विफल हो जाएगा यदि आपकी विंडोज क्षेत्रीय सेटिंग्स इस तरह से कॉन्फ़िगर नहीं की गई हैं कि यह कोड उम्मीद करता है (अर्थात यह कोड हर विंडोज सिस्टम पर काम नहीं करेगा )
डैनियल स्कॉट

20

दो और तरीके जो समय सेटिंग्स पर निर्भर नहीं करते हैं (दोनों को स्थानीयकरण से स्वतंत्र डेटा / समय कैसे मिलता है )। और दोनों को सप्ताह के दिन भी मिलते हैं और उनमें से किसी को भी व्यवस्थापक अनुमति की आवश्यकता नहीं है! "

  1. 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
    
  2. 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
    

    और तीन और तरीके जो अन्य विंडोज स्क्रिप्ट भाषाओं का उपयोग करते हैं। वे आपको अधिक लचीलापन देंगे जैसे कि आप वर्ष के सप्ताह, मिलिसेकंड में समय और इतने पर प्राप्त कर सकते हैं।

  3. 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());
    
  4. 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), ", ", "-")
    
  5. PowerShell - प्रत्येक मशीन पर स्थापित किया जा सकता है जिसमें .NET है - Microsoft से डाउनलोड करें ( v1 , v2 , और v3 (केवल विंडोज 7 और इसके बाद के संस्करण के लिए))। Windows 7 / Win2008 और इसके बाद के संस्करण पर डिफ़ॉल्ट रूप से इंस्टॉल किया गया:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    
  6. स्व-संकलित 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"));
    
  7. लकड़हारा यह सप्ताह का वर्ष और दिन नहीं मिल सकता है। यह तुलनात्मक रूप से धीमा है, एक अस्थायी फ़ाइल भी बनाता है और यह उस समय टिकटों पर आधारित है जो लॉगमैन अपनी लॉग फ़ाइलों पर रखता है। विंडोज एक्सपी और इसके बाद के संस्करण से सब कुछ काम करता है। यह शायद कभी किसी के द्वारा उपयोग नहीं किया जाएगा - मेरे सहित - लेकिन यह एक और तरीका है ...

    @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 फ़ंक्शन के बारे में अधिक जानकारी



8

मुझे वास्तव में जॉय की विधि पसंद आई, लेकिन मुझे लगा कि मैं इस पर थोड़ा विस्तार करूंगा।

इस दृष्टिकोण में, आप कोड को कई बार चला सकते हैं और पुरानी तिथि मान के बारे में चिंता न करें "चारों ओर चिपके हुए" क्योंकि यह पहले से ही परिभाषित है।

हर बार जब आप इस बैच फ़ाइल को चलाते हैं, तो यह आईएसओ 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%

इस संस्करण में, आपको सावधान रहना होगा कि फ़ाइल में कई स्थानों पर एक ही कोड को कॉपी / पेस्ट न करें क्योंकि इससे डुप्लिकेट लेबल का कारण होगा। आप या तो प्रत्येक प्रतिलिपि के लिए एक अलग लेबल रख सकते हैं, या बस इस कोड को अपनी बैच फ़ाइल में डाल सकते हैं और जहाँ भी आवश्यक हो, अपनी स्रोत फ़ाइल से कॉल कर सकते हैं।


5

बस %date%चर का उपयोग करें :

echo %date%

5
वर्तमान में कॉन्फ़िगर की गई लघु तिथि प्रारूप में यह तारीख वापस आ जाएगी। यह शायद ही कभी आईएसओ -8601 है।
जॉय

@ जॉय सहमत - मैं यहाँ हूँ क्योंकि यह बहुत अच्छा नहीं है पर भरोसा करने के लिए।
स्टीवकिन

5

@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

यह केवल कुछ लोगों के लिए एक समाधान है, क्योंकि यह दुनिया के कुछ स्थानों पर केवल आपकी तिथि / समय प्रारूप सेटिंग्स के आधार पर काम करता है
jeb

3

मैंने ऐसा करने के लिए संख्यात्मक प्रारूप में एक पर्यावरण चर को वांछित मान पर सेट किया है:

FOR /F "tokens=1,2,3,4 delims=/ " %a IN ('echo %date%') DO set DateRun=%d-%b-%c

2

इसे जाँचें..

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

2

यदि आपके पास पायथन स्थापित है, तो आप कर सकते हैं

python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"

आप अपनी आवश्यकताओं के लिए आसानी से प्रारूप स्ट्रिंग को अनुकूलित कर सकते हैं।


2
किस तरह से कह रहा है "अजगर का उपयोग करें" सवाल का जवाब?
रॉस प्रेसर

3
MAKECAB, ROBOCOPY, VBSCRIPT, POWERSHELL लोगमैन और अन्य सुझावों का उपयोग उसी तरह से करें जैसे आप कमांड लाइन पर कर सकते हैं?
कोडकिड

इसे सरल बनाया जा सकता है python -c "import datetime;print(datetime.date.today())", क्योंकि कक्षा __str__का तरीका dateसिर्फ कहता है isoformat()
onewhaleid

2

पॉवरशेल का उपयोग करना संभव है और एक लूप का उपयोग करके इसके उत्पादन को पर्यावरण चर पर पुनर्निर्देशित करना संभव है।

कमांड लाइन से ( 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

1
मुखौटा इस तरह होना चाहिए FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a ताकि महीने के लिए ऊपरी एमएम का उपयोग करें और शाब्दिक पात्रों से बचने के लिए बैकस्लैश करें।
जिसका

1

दिनांक और समय प्रारूप के कारण स्थान विशिष्ट जानकारी होती है, उन्हें% दिनांक% और% समय चर से पुनर्प्राप्त करना स्ट्रिंग को विचार में बदलने के साथ स्ट्रिंग को पार्स करने के लिए अतिरिक्त प्रयास की आवश्यकता होगी। एक अच्छा विचार डेटा संरचना और पार्स को पुनः प्राप्त करने के लिए कुछ एपीआई का उपयोग करना है। 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


1

यह जॉय के उत्तर का एक विस्तार है जिसमें समय शामिल है और 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%


0

मैं निम्नलिखित का उपयोग कर रहा हूं:

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

2
लेकिन आपका जवाब अन्य 16 की तुलना में अलग या बेहतर कहां है? और पहले से ही पर्याप्त संकेत हैं, कि यह समाधान केवल आपके स्थानीयकरण के लिए काम करता है
jeb

0

यदि पॉवरशेल उपलब्ध है, तो आप नीचे दिए गए कोड का उपयोग कर सकते हैं:

# get date
$BuildDate=(get-date -format "yyMMdd")
echo BuildDate=$BuildDate

# get time
$BuildTime=(get-date -format "hhmmss")
echo BuildTime=$BuildTime

यहाँ परिणाम है:

BuildDate=200518
BuildTime=115919

-2

यदि आपको एक विश्वसनीय समाधान प्राप्त करने के लिए 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 बनाएँ और इसे अपने पेट में जोड़ें।

टिप्पणियाँ:

  1. आप किसी भी Visual Studio संस्करण, जैसे Visual Studio Express, का उपयोग कर सकते हैं FormatNow.exe बनाने के लिए।
  2. विज़ुअल स्टूडियो में, "कंसोल एप्लिकेशन" C # प्रोजेक्ट चुनें, न कि "विंडोज फॉर्म एप्लीकेशन" प्रोजेक्ट।
  3. सामान्य ज्ञान: निर्मित FormatNow.exe को चलाने के लिए .NET फ्रेमवर्क की आवश्यकता होगी।
  4. सामान्य ज्ञान: PATH चर में FormatNow.exe जोड़ने के बाद, आपको प्रभावी होने के लिए CMD को पुनरारंभ करना होगा। यह पर्यावरण चर में किसी भी परिवर्तन पर भी लागू होता है।

लाभ:

  1. यह धीमा नहीं है (0.2 सेकंड के भीतर खत्म)।
  2. कई प्रारूप समर्थित हैं https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx उदा। FormatNow "ddd" केवल सप्ताह का दिन पाने के लिए, FormatNow "yyyy" केवल पाने के लिए वर्ष
  3. यह विंडोज की क्षेत्र सेटिंग्स पर निर्भर नहीं करता है, इसलिए इसका आउटपुट बहुत अधिक विश्वसनीय है। दूसरी ओर,% तारीख% विभिन्न कंप्यूटरों पर एक सुसंगत प्रारूप नहीं देता है, और विश्वसनीय नहीं है।
  4. आपको इतने सारे CMD वैरिएबल बनाने और वैरिएबल नेमस्पेस को प्रदूषित करने की आवश्यकता नहीं है।
  5. प्रोग्राम को लागू करने और परिणाम प्राप्त करने के लिए बैच स्क्रिप्ट में 3 लाइनों की आवश्यकता होगी। यह काफी कम होना चाहिए।

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());
            }
        }

    }
}

सामान्य तौर पर, जब जटिल लॉजिक्स के साथ काम करते हैं, तो हम बहुत छोटे प्रोग्राम का निर्माण करके और आउटपुट को वापस एक बैच स्क्रिप्ट चर पर कब्जा करने के लिए प्रोग्राम को कॉल करके इसे सरल बना सकते हैं। हम छात्र नहीं हैं और हम समस्याओं को हल करने के लिए हमें बैच-स्क्रिप्ट-केवल नियम का पालन करने के लिए परीक्षा की आवश्यकता नहीं ले रहे हैं। वास्तविक काम के माहौल में, किसी भी (कानूनी) विधि की अनुमति है। हमें अभी भी विंडोज बैच स्क्रिप्ट की खराब क्षमताओं से क्यों चिपके रहना चाहिए जो कई सरल कार्यों के लिए वर्कअराउंड की आवश्यकता है? हमें नौकरी के लिए गलत उपकरण का उपयोग क्यों करना चाहिए?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.