Windows बैच स्क्रिप्ट में दिनांक और समय प्रारूपित करें


192

एक विंडोज़ (विंडोज एक्सपी) बैच स्क्रिप्ट में मुझे फ़ाइलों के नाम आदि में बाद की तारीख के लिए वर्तमान तिथि और समय को प्रारूपित करने की आवश्यकता होती है।

यह स्टैक ओवरफ्लो प्रश्न के समान है । बैच फ़ाइलों में किसी तिथि को कैसे जोड़ा जाए , लेकिन समय के साथ-साथ।

मेरे पास अभी तक यह है:

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

जो देता है:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

क्या कोई तरीका है जो मैं% TIME% में एकल अंक घंटे की अनुमति दे सकता हूं, इसलिए मुझे निम्नलिखित मिल सकता है?

2009_07_28__08_36_01



आप अपने datetimefचर पर खाली स्थान बदल सकते हैं , और 0 के बजाय रख सकते हैं। अपने उदाहरण पर:SET datetimef=%datetimef: =0%
सेबागरा

जवाबों:


148

मैं इस स्क्रिप्ट के साथ समाप्त हुआ:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: Win2008R2 पर जैसे मुझे आपका 'सेट महीना =% दिनांक: ~ 3,2%' नीचे की तरह बनाने की आवश्यकता है: अन्यथा 00 MONTH के लिए प्रकट होता है

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%

11
FYI करें, विंडोज सर्वर 2003 और विंडोज 7 पर, इस स्क्रिप्ट ने मुझे "201200Mo_085806" (सही वर्ष और समय) दिया।
सफूका

50
Google (मेरे जैसे) से यहां आने वाले किसी व्यक्ति के लिए ध्यान दें: यह स्थानीय निर्भर है, इसलिए इसे गैर-अंग्रेजी विंडोज पर काम करने के लिए ट्वीक्स की आवश्यकता हो सकती है!
पियोट्र्क

मैंने इसे इस तरह से किया: समय / टी> Time.dat सेट / P ftime = <Time.dat सेट fDate =% दिनांक: ~ 6 %% दिनांक: ~ 3,2 %% दिनांक: ~ 0,2 %% समय: ~ 0,2 %% ftime: ~ 3,2% गूंज% fDate% -> 201310170928
बर्फ

% समय क्या है: ~ 0,2% कहाँ पर कुछ प्रलेखन है: ~,% ​​संरचना?
user1605665

6
यह सब साधारण स्ट्रिंग प्रतिस्थापन का उपयोग करके केवल 2 लाइनों में किया जा सकता है: stackoverflow.com/a/23558738/1879699
एंड्रियास

71
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE

2
विंडोज सर्वर 2003 और विंडोज 7 पर, इसने मुझे सही स्ट्रिंग दिया। अतीत में मैंने जो भी निर्माण किया है, उससे कहीं अधिक सुरुचिपूर्ण, इसलिए धन्यवाद!
सूफूका

3
यह वही है जो मुझे विंडोज 7 में रूसी लोकेल के साथ देता है। वर्तमान समय 2013-05-03T02: 22: 51 है, लेकिन स्क्रिप्ट प्रिंट करती है: "2013-5.-01_02_22_51"
रात का खाना

7
% तारीख% अलग-अलग लोकेल के साथ अलग-अलग स्ट्रिंग देगा।
अचोइलियू

2
20146.0._173502 मेरे पास (चेक लोकल)
मुफ्लिक्स

2
win7 64bit अंतिम, गलत समय: 20140.01_131612, (
2014.10.26_131612

66

यहां बताया गया है कि मैं एक लॉग फाइल नाम कैसे उत्पन्न करता हूं ( http://ss64.com/nt/syntax-getdate.html पर आधारित ):

@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
      SET _second=00%%K
)
:s_done

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

Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump

:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_

:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...

5
बैच में स्थानीय स्वतंत्र टाइमस्टैम्प पीढ़ी के बारे में प्रश्नों के लिए SO पर सर्वोत्तम उत्तर।
माइक कैंपबेल

2
बहुत बढ़िया! समाधान के रूप में इसे चिह्नित करने का एक तरीका होना चाहिए
राडो

48

जब भी मुझे एक तारीख / समय की आवश्यकता होती है, तो मैं इसे आमतौर पर करता हूं:

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%

यह जर्मन दिनांक / समय प्रारूप (dd.mm.yyyy hh: mm: ss) के लिए है। मूल रूप से मैं सब्सट्रेट को समेटता हूं और अंत में सभी रिक्त स्थान को शून्य से बदल देता हूं।

संक्षारण कैसे काम करते हैं इसकी संक्षिप्त व्याख्या:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

तो "२ ९ .०३.२०१ year" जैसी तारीख से सिर्फ साल पाने के लिए उपयोग करें:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 

7
अब तक सबसे सुरुचिपूर्ण समाधान जब आपको सिर्फ एक साफ टाइमस्टैम्प (कोई रिक्त स्थान या अन्य वर्ण) की आवश्यकता नहीं होती है
jvdneste

1
Mrt साझा करने के लिए @jvdneste धन्यवाद के साथ अधिक सहमत नहीं हो सका
.323272243

1
बिल्कुल महान - और काम करता है [वाक्यविन्यास की आवश्यकता बहुत भ्रामक है, लेकिन यह शायद ही पोस्टर की समस्या है]
जोसेफोग्गी

38

यदि PowerShell स्थापित है, तो आप आसानी से और मज़बूती से किसी भी प्रारूप में दिनांक / समय प्राप्त कर सकते हैं, उदाहरण के लिए:

for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"

बेशक आजकल PowerShell हमेशा स्थापित है, लेकिन Windows XP पर आप शायद केवल इस तकनीक का उपयोग करना चाहते हैं यदि आपका बैच स्क्रिप्ट किसी ज्ञात वातावरण में उपयोग किया जा रहा है जहां आप जानते हैं कि PS उपलब्ध है (या अपने बैच फ़ाइल में जांचें यदि PowerShell उपलब्ध है ...)

आप यथोचित रूप से पूछ सकते हैं: यदि आप डेट / समय प्राप्त करने के लिए पॉवरशेल का उपयोग कर सकते हैं, तो सभी पर एक बैच फ़ाइल का उपयोग क्यों करें, लेकिन मुझे लगता है कि कुछ स्पष्ट कारण हैं: (ए) आप पॉवरशेल से परिचित नहीं हैं और फिर भी सबसे अधिक करना पसंद करते हैं बैच फ़ाइलों या (बी) के साथ पुराने जमाने की चीजें आप एक पुरानी स्क्रिप्ट को अपडेट कर रहे हैं और पूरी बात को पीएस में पोर्ट नहीं करना चाहते हैं।


(ए) मेरे मामले में, और यह पूरी तरह से काम करता है (बल्ले केवल मेरे पर्यावरण के लिए है लेकिन मेरे पास विभिन्न पीसी पर मिश्रित स्थान हैं)। धन्यवाद!
ccalboni

30

मैं आज इस समस्या के साथ आया और इसे हल किया:

SET LOGTIME=%TIME: =0%

यह 0 के साथ रिक्त स्थान को प्रतिस्थापित करता है और मूल रूप से घंटे को शून्य-पैड करता है।

कुछ त्वरित खोज के बाद मुझे पता नहीं चला कि क्या इसके लिए कमांड एक्सटेंशन की आवश्यकता है (फिर भी सेटलेटल डिस्क्रिप्शन के साथ काम किया गया)।


ठीक है, चर में प्रतिस्थापन। अब - एक बृहदान्त्र ( :) कैसे स्थानापन्न करें ?
टॉमस गैंडर

@TomaszGandor यह मेरे लिए काम करता है: echo %TIME: =:%लेकिन अगर यह शायद :एक ^तरह echo %TIME: =^:%(जो मेरे लिए भी काम करता है) के साथ भागने की कोशिश नहीं कर रहा है ।
opello

1
सादगी के लिए +1। फ़ाइल नाम में कॉलोन मान्य नहीं हैं। सेट समय = = समय :: =% उन्हें हटाता है। क्या आप अंतरिक्ष के लिए 0 स्थानापन्न कर सकते हैं, कॉलोनों को हटा सकते हैं, और 6 वर्णों को काट सकते हैं (इस प्रकार दशमलव भाग को हटा सकते हैं) एक ही कथन में? अगर यह दो या तीन लाइनों में ले जाए तो यह बहुत बड़ी बात नहीं है। मैं सिर्फ उत्सुक हूँ।
राइडरबिल

वो नहीं जो मैं जानता हूँ। कृपया अनुवर्ती अगर आप एक मिल जाए!
ओपेलो

21

जैसा कि उल्लेख किया गया है, दिनांक और समय को पार्स करना केवल तभी उपयोगी होता है जब आप वर्तमान उपयोगकर्ता द्वारा उपयोग किए जा रहे प्रारूप को जानते हैं (उदाहरण के लिए, MM / dd / yy या dd-MM-yyyy सिर्फ दो नाम के लिए)। यह निर्धारित किया जा सकता है, लेकिन जब तक आप सभी तनावपूर्ण और पार्सिंग करते हैं, तब तक आप कुछ स्थिति के साथ समाप्त हो जाएंगे जहां एक अप्रत्याशित प्रारूप का उपयोग किया जाता है, और अधिक ट्विक्स आवश्यक होंगे।

आप कुछ बाहरी प्रोग्राम का भी उपयोग कर सकते हैं जो आपके पसंदीदा प्रारूप में एक तारीख स्लग लौटा देगा, लेकिन इससे आपकी स्क्रिप्ट / बैच के साथ उपयोगिता कार्यक्रम को वितरित करने की आवश्यकता का नुकसान होता है।

बहुत कच्चे तरीके से CMOS घड़ी का उपयोग करके बैच ट्रिक्स भी हैं, लेकिन यह अधिकांश लोगों के लिए नंगे तारों के करीब भी है, और हमेशा दिनांक / समय प्राप्त करने के लिए पसंदीदा स्थान नहीं है।

नीचे एक समाधान है जो उपरोक्त समस्याओं से बचा जाता है। हां, यह कुछ अन्य मुद्दों का परिचय देता है, लेकिन मेरे उद्देश्यों के लिए मैंने इसे आधुनिक विंडोज सिस्टम के लिए .bat फ़ाइलों में डेटास्टैम्प बनाने के लिए सबसे आसान, स्पष्ट, सबसे पोर्टेबल समाधान पाया। यह केवल एक उदाहरण है, लेकिन मुझे लगता है कि आप देखेंगे कि अन्य तिथि और / या समय के प्रारूप आदि के लिए कैसे संशोधित किया जाए।

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f

3
मुझे इसकी ही खोज थी। कुछ ऐसा जो हर लोकेल सेटिंग पर काम करता है। धन्यवाद!
लॉस्ट_डीएम

+1 "आधुनिक विंडोज सिस्टम" के लिए हमें सौदा करना है :) एक तरफ मजाक करना, यह बहुत सरल है, और जैसे आपने कहा, पोर्टेबल, मुद्दे से निपटने का तरीका।
जैच यंग

9
यह एक भयानक समाधान है। यदि यह विफल हो जाता है तो एक वैश्विक सेटिंग स्थायी रूप से बदल जाती है। यह अन्य अनुप्रयोगों के साथ दौड़ की स्थिति का भी परिचय देता है।
माइककूल

आप reg query "HKCU\Control Panel\International" /v sShortDateरजिस्ट्री सेटिंग (पाठक के लिए छोड़ दिया व्यायाम!) को बदले बिना भाग का उपयोग कर सकते हैं ।
त्रिकसेव

9

निम्नलिखित एक सीधा जवाब नहीं है, लेकिन एक करीबी हो सकता है?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

कम से कम यह प्रेरणादायक हो सकता है।


9

यदि आपको इस प्रारूप की आवश्यकता नहीं है:

2009_07_28__08_36_01

तब आप कोड की निम्न 3 पंक्तियों का उपयोग कर सकते थे जो% दिनांक% और% समय% का उपयोग करती है:

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

नोट: वर्ण /और :हटा दिए गए हैं और चरित्र .और स्थान को अंडरस्कोर से बदल दिया गया है।

उदाहरण आउटपुट (बुधवार को 8/5/15 को 12:49 बजे 50 सेकंड और 93 मिली सेकेंड के साथ)

echo %mytimestamp%
Wed_08052015_124950_93

जब घंटे 12 से कम हो, तो mydate =% दिनांक सेट करें: / =% सेट mytime =% समय :: =% सेट mytime =% mytime: = 0% सेट mytimestamp =% mydate: = _% _% mytime: = _। %
रैगच

8
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%

6

offset:lengthसाथ समर्थित स्वरूपण SETWindows में आदेश पैड करने के लिए आप की अनुमति नहीं होगी 0, जैसा कि आप में रुचि हो रहे हैं।

हालाँकि, आप एक BATCH स्क्रिप्ट को घंटे के हिसाब से चेक करने के लिए कोड कर सकते हैं 10और
एक अलग echoस्ट्रिंग के अनुसार पैड कर सकते हैं ।

आपको इस लिंक पर कमांड के बारे मेंSET कुछ जानकारी मिलेगी ।


आप यहां पहुंचने के लिए अन्य प्रोग्रामिंग विधियों में भी बदलाव कर सकते हैं।

यह यूनिक्स बैश में काफी सरल है (केवल विंडोज पर साइगविन के साथ उपलब्ध है),

date +%Y_%m_%d__%H_%M_%S

और, यह हमेशा सही ढंग से पैड करता है।


6

मैंने इसे इस तरह किया:

REM Generate FileName from date and time in format YYYYMMTTHHMM

Time /T > Time.dat
set /P ftime= < Time.dat

set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log

echo %FileName%

LogFile201310170928.log


यह अंग्रेजी सर्वर (ओएस नाम: माइक्रोसॉफ्ट (आर) विंडोज (आर) सर्वर 2003 मानक x64 संस्करण, ओएस संस्करण पर चलता है: 5.2.3790 सर्विस पैक 2 बिल्ड 3790)
बर्फ

1
और जर्मन सर्वर पर भी परीक्षण किया गया (Betriebssystemname: Microsoft® Windows Server® 2008 Enterprise, Betriebssystemversion: 6.0.6002 सर्विस पैक 2 बिल्ड 6002)
आइस

1
यहां तक ​​कि यह एक ठीक है: (Betriebssystemname: Microsoft Windows Server 2012 Standard, Betriebssystemversion: 6.2.9200 Nicht zutreffend Build 9200)
Ice

4
::========================================================================  
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
::======= ================================================================  
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%  

पहली पंक्ति हमेशा
टाइमज़ोन के इस प्रारूप में आउटपुट देती है: 20150515150941.077000 + 120
यह आपको अपनी इच्छाओं को पूरा करने के लिए आउटपुट स्वरूपण के साथ छोड़ देता है।


4

यह बल्ला फ़ाइल (डेटाेटिमेस्ट्र.बेट के रूप में सहेजें) डेटाइम स्ट्रिंग को 3 बार बनाता है: (1) सप्ताह और सेकंड के दिन के साथ लंबे डेटाइम स्ट्रिंग, और (2) उनके बिना शॉर्ट डेटाइम स्ट्रिंग और (3) कोड का संक्षिप्त संस्करण।

@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%

set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to 
REM replace semi-colons with hyphens (or any 
REM non-special character)
set t=%t::=%
set t=%t:.=%

set datetimestr=%d%_%t%
@echo  Long date time str = %datetimestr%

set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%


@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%

pause

उचित श्रेय देने के लिए, मैंने पीटर मॉर्टेंसन (21:02 पर जून 18 '14) और ओपेलो (14:27 बजे 25 अगस्त 11) से अवधारणाओं को मिला दिया।

आप इसे बहुत कम लिख सकते हैं, लेकिन यह लंबा संस्करण कोड को पढ़ना और समझना आसान बनाता है।


4

मैं वास्तव में बैच फ़ाइलों के लिए नया हूँ और यह मेरा कोड है !! (मुझे यकीन नहीं है कि क्यों, लेकिन मैं दिनांक / टी और समय / टी को एक साथ जोड़ नहीं सका और मैं % तिथि और % समय% का उपयोग सीधे एक चर के बिना नहीं कर सका ...)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

यह दूसरों से पुन: उपयोग किया जाता है (सवाल फ़ाइलनाम के रूप में उपयोग करने के लिए एक स्वरूपित समय-सारिणी प्राप्त करना था)।


4

इसे करने का एक और आसान तरीका है:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)

3

एक उत्पन्न करने के लिए YYYY-MM-DD hh:mm:ss(24 घंटे) टाइमस्टैम्प मैं उपयोग:

SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)

क्या यह एक विशेष क्षेत्रीय सेटिंग मानती है?
पीटर मोर्टेंसन

1
Ss64.com/nt/syntax-variables.html के अनुसार %TIME%और %DATE%चर क्रमशः TIMEऔर DATEकमांड के रूप में एक ही प्रारूप का उपयोग करते हैं। मेरे सिस्टम पर चर मेरी क्षेत्रीय सेटिंग्स से मेल नहीं खाते।
एम। डुडले

3

यह बैच स्क्रिप्ट ठीक वही करेगी जो ओपी चाहता है (विंडोज एक्सपी एसपी 3 पर परीक्षण)।

मैंने पहले भी "jph" द्वारा वर्णित उस चतुर रजिस्ट्री ट्रिक का उपयोग किया था जो IMHO "yyyy_MM_dd"किसी भी विंडोज सिस्टम पर नए या पुराने पर तारीख के 100% लगातार प्रारूपण करने का सबसे सरल तरीका है । ऐसा करने के लिए एक रजिस्ट्री मान में परिवर्तन तात्कालिक अस्थायी और तुच्छ है; यह केवल कुछ मिलीसेकंड तक रहता है इससे पहले कि यह तुरंत वापस लौट आए।

इंस्टेंट डेमो के लिए इस बैच फ़ाइल को डबल-क्लिक करें, कमांड प्रॉम्प्ट विंडो पॉप अप करेगी और आपकी टाइमस्टैम्प प्रदर्शित करेगी। । । । ।

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A

:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul

SET MYDATE=%date%

:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul

:: --- SPLIT THE TIME [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)

:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS        //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS        //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2% 

:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT, 
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)

:: --- GENERATE OUR WANTED TIMESTAMP
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%

:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO    Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO    Your timestamp is:    %TIMESTAMP%
ECHO.
ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT

विंडोज 2019 पर भी काम करता है। मैं आपके समाधान के आसपास रखूँगा, मुझे यह पसंद है :)
user225479

प्रश्न, मैंने अभी पता लगाया है कि आधी रात के बाद, आउटपुट में "0" गिर जाता है। किसी भी विचार क्यों? आपकी स्क्रिप्ट के साथ मेरा आउटपुट देता है: आपका टाइमस्टैम्प है: 2019_09_16__0_58_07 के बजाय ..00_58_07। लेकिन 1 बजे के बाद यह उम्मीद के मुताबिक काम करता है (और यह आउटपुट देगा: ..01_01_56)।
user225479

मैंने ELSE स्टेटमेंट में IF% HOUR% == 0 (SET HOUR = 00) जोड़ा है। मुझे इसे ठीक करना चाहिए, मुझे उम्मीद है :)
user225479

प्रतिक्रिया @ user225479 के लिए धन्यवाद। मैंने कोड तय कर लिया है। 24 घंटे प्रारूप में परिवर्तित HOUR चर के सभी संभावित क्रम अब सही ढंग से काम करेंगे। मैंने लेआउट को भी संशोधित किया है ताकि इसे पढ़ना आसान हो।
व्युत्पत्ति


2

"Search_files.bat" नामक एक फ़ाइल बनाएं और नीचे दी गई सामग्री को फ़ाइल में रखें। फिर इसे डबल क्लिक करें। अस्थायी% THH% चर को उचित रूप से AM को संभालने के लिए रखा गया था। यदि समय के पहले 2 अंकों में 0 है, तो Windows लॉग फ़ाइल के बाकी फ़ाइल नाम को अनदेखा करता है।

CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG

2

मुझे @ लॉरैक्स के शीर्ष पर छोटा संस्करण पसंद है, लेकिन अन्य भाषा सेटिंग्स के लिए यह थोड़ा अलग हो सकता है।

उदाहरण के लिए, जर्मन भाषा सेटिंग्स में (प्राकृतिक तिथि प्रारूप के साथ: dd.mm.yyyy) महीने की क्वेरी को 4,2 से 3,2 तक बदल दिया जाना है:

@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)

PAUSE

1

यह मेरे लिए 2 सेंट है datetime stringMM DD YYYYसिस्टम पर पहली और दूसरी %DATE:~प्रविष्टियाँ स्विच करें ।

    REM ====================================================================================
    REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
    REM ====================================================================================
    REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
    REM ====================================================================================
    REM CHECK for SHORTDATE dd DDxMMxYYYY 
    IF "%DATE:~0,1%" GTR "3" (
        SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    ) ELSE (
    REM ASSUMES SHORTDATE DDxMMxYYYY
        SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        )
    REM CORRECT FOR HOURS BELOW 10
    IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
    ECHO %DATETIME%

1

मैंने स्वीकृत उत्तर की कोशिश की और यह बहुत अच्छी तरह से काम करता है। दुर्भाग्य से यूएस टाइम फॉर्मेट H: MM: SS.CS प्रतीत होता है, और मोर्चे पर लापता 0 सुबह 10 बजे से पहले पार्स करने की समस्या पैदा कर रहा था। इस बाधा को खत्म करने के लिए और दुनिया के किसी भी समय के प्रारूप को पार्स करने की अनुमति दें, मैं इस सरल दिनचर्या के साथ आया था जो काफी अच्छी तरह से काम करती प्रतीत होती है।

:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF

इस दिनचर्या के साथ अच्छी बात यह है कि आप पहले पैरामीटर के रूप में टाइम स्ट्रिंग में पास हो जाते हैं और पर्यावरण चर का नाम जिसे आप समय (सेंटीसेकंड) में दूसरे पैरामीटर के रूप में शामिल करना चाहते हैं। उदाहरण के लिए:

CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%

(* क्रिस *)


1

शायद कुछ इस तरह:

@call:DateTime

@for %%? in (
    "Year   :Y"
    "Month  :M"
    "Day    :D"
    "Hour   :H"
    "Minutes:I"
    "Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_

:: OUTPUT
:: Year    : _DT_Y_ : 2014
:: Month   : _DT_M_ : 12
:: Day     : _DT_D_ : 17
:: Hour    : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35

@pause>nul

@goto:eof

:DateTime
    @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
    @if not errorlevel 1 (
        @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
    ) else (
        @set "_DT_T_=1234567890 "
    )
    @if errorlevel 1 (
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
        @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
    )
    @if errorlevel 1 (
        @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
        @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
    )
    @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
    @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b

1

इस तरह की स्थितियों में एक सरल, मानक प्रोग्रामिंग दृष्टिकोण का उपयोग करें: एक अज्ञात इकाई को पार्स करने के विशाल प्रयास के बजाय, बस वर्तमान कॉन्फ़िगरेशन को सहेजें, इसे एक ज्ञात स्थिति में रीसेट करें, जानकारी निकालें और फिर मूल स्थिति को पुनर्स्थापित करें। केवल मानक विंडोज संसाधनों का उपयोग करें।

विशेष रूप से, दिनांक और समय प्रारूप रजिस्ट्री कुंजी HKCU \ Control Panel \ International \ [MS परिभाषा] "मान": "sTimeFormat" और "sShortDate" में संग्रहीत किए जाते हैं। Reg सभी विंडोज संस्करणों के साथ शामिल कंसोल रजिस्ट्री संपादक है। उन्नत विशेषाधिकार HKCU कुंजी को संशोधित करने की आवश्यकता नहीं है

Prompt $N:$D $T$G

::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF

::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f

::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%

::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f

सरल, सीधा और सभी क्षेत्रों के लिए काम करना चाहिए।

जिन कारणों से मुझे समझ में नहीं आ रहा है, "sShortDate" मान को रीसेट करना तुरंत कंसोल विंडो में प्रभावी होता है, लेकिन बहुत समान "sTimeFormat" मान को रीसेट करने से नई कंसोल विंडो खुलने तक प्रभावी नहीं होता है। हालाँकि, केवल एक चीज परिवर्तनशील होती है - अंकों की स्थिति तय हो जाती है। "HH" टाइम टोकन को अग्रणी शून्य मानने के लिए माना जाता है, लेकिन ऐसा नहीं होता है। सौभाग्य से, workarounds आसान हैं।


-1 "एक अग्रणी शून्य जोड़ने के बजाय, आप मशीन कॉन्फ़िगरेशन को बाधित क्यों नहीं करते, इसे अपनी यादृच्छिक आवश्यकता में बदल दें और फिर अपनी बात करें?" यह दृष्टिकोण इस दुनिया से बाहर है, इसके लिए काफी मात्रा में प्रयास की आवश्यकता होती है और यह अवांछित परिणामों के एक अनंत संख्या में ले जा सकता है। और मैं पठनीयता और मानक अपेक्षित कोड व्यवहार पर चर्चा शुरू नहीं करना चाहता। प्रशंसा।
vititrafra

sTimeFormatसमय प्रारूप को रीसेट करना बेकार है । नहीं। जैसा कि यह बाद के कंसोल प्रांप्ट को प्रभावित करता है, इसका उपयोग करते हुए लागू करेंfor /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
जोसेफ जेड

1

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

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF

1

प्रारंभिक चर विस्तार से बचने के लिए एक अच्छी सिंगल-लाइन ट्रिक का उपयोग करना है cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%

0
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================

0

फ़ाइल नाम में उपयोग के लिए संख्यात्मक दिनांक के लिए एक बहुत ही सरल समाधान के लिए निम्नलिखित कोड का उपयोग करें:

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt

0

स्लैश द्वारा दिनांक कमांड के परिणामों को विभाजित करें, फिर आप प्रत्येक टोकन को उपयुक्त चर में स्थानांतरित कर सकते हैं।

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.