% समय% चर का उपयोग करके बैच स्क्रिप्ट के लिए अग्रणी शून्य की आवश्यकता है


26

मैं अपने डॉस स्क्रिप्ट में एक बग भर में आया था जो फ़ाइल नामकरण के लिए दिनांक और समय डेटा का उपयोग करता है। समस्या मुझे एक अंतराल के साथ समाप्त हो गई थी क्योंकि समय चर स्वचालित रूप से घंटे के लिए अग्रणी शून्य प्रदान नहीं करता था <10. इसलिए चल रहा है> प्रतिध्वनि% समय% वापस देता है: '9: 29: 17.88'।

क्या कोई इसे ठीक करने के लिए सशर्त रूप से अग्रणी शून्य पैड करने का तरीका जानता है?

अधिक जानकारी: मेरा फ़ाइल नाम सेट आदेश है:

set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

जो समाप्त हो रहा है: C: \ Temp \ robolog_20100602_ 93208.log (सुबह 9:23 के लिए)।

इस सवाल से संबंधित है यह एक

धन्यवाद


गद्देदार घंटे का मूल्य प्राप्त करना संभव है ... For / F "TOKENS = 1 DELIMS =:" %% A IN ('TIME / T') DO HH = %% A तब% समय बदलें: ~ 0,2% % HH% के साथ मैं अधिक कॉम्पैक्ट समाधान की उम्मीद कर रहा था, लेकिन यह काम करेगा।
इरा

एक "अधिक कॉम्पैक्ट" समाधान दूसरी भाषा में कुछ होगा (पावरशेल? पायथन; पर्ल; डब्लूएसएच?)।
grawity

जेसी के जवाब को मेरे द्वारा उपयोग किए जाने वाले समाधान के रूप में चिह्नित करने के लिए स्विच किया गया। यह पूर्व-दोपहर के समय दोनों के साथ w / अग्रणी 0 पर काम करता है और दोपहर के बाद का सैन्य समय भी।
इरा

जवाबों:


60

एक बहुत ही सरल तरीका है कि आप अग्रणी स्थान को शून्य से बदलें:
echo %TIME: =0%
आउटपुट:
09:18:53,45


1
यह काम करता हैं! यह सबसे आसान उपाय है जो मुझे लगता है ..
एरोब्रेन

क्या यह भी कई पात्रों के साथ किया जा सकता है? iE सभी ',', '' और ':'। वर्तमान में मैं इंटरमीडिएट वैरिएबल बनाता हूं लेकिन निश्चित रूप से, यह केवल कुछ संख्याओं के प्रतिस्थापन के कारण काम करता है। अधिक के लिए यह बोझिल होगा।
देवोलस

1
मैं इसे घंटे को संशोधित करने के लिए एक दूसरे "चरण" में उपयोग कर रहा हूं: साथ set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%ही ss64.com/nt/syntax-replace.html
हैंडल करें

+1 यह सबसे छोटा / सर्वोत्तम उत्तर है। मैंने कैसे उपयोग किया: set timestring=%TIME: =0%उप कॉल में जल्दी - तो timestringइसके बजाय (या जो भी चर आप उपयोग करते हैं) के साथ काम करें।
bshea

14

मेरा समाधान निम्नलिखित विचार का उपयोग करना था:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

मुझें यह पसंद है। सरल और सहज।
केन

आधुनिक विंडो पर काम करता है, लेकिन सर्वर 2003 पर सिंटैक्स त्रुटि देता है!
डॉ। बीडीओ एडम्स

2008+, सबसे सुरुचिपूर्ण समाधान पर निर्दोष काम करता है। धन्यवाद।
bjoster 10

1
but gives syntax error on server 2003- 2016 में आपको इसकी परवाह क्यों है?
मार्सिन ऑर्लोव्स्की

विंडोज 10 कमांड प्रॉम्प्ट पर सही
माइक अपजोन

5

डेनिस के जवाब के समान विचार । समस्या यह है कि की चौड़ाई%time% हमेशा समान होती है, इसलिए यह छोटी स्ट्रिंग को वापस करने के बजाय शुरुआत में एक स्थान सम्मिलित करता है।

आप इससे छुटकारा पा सकते हैं for:

for /f "delims= " %x in ("%time%") do set T=0%x

बाकी भी कमोबेश यही स्थिति है।


2
यह समाधान> 10 के लिए काम करता है, लेकिन अब 10 के लिए '010' बनाता है: ...
Devolus

3
जेसी का उत्तर सही है ...
साइमन सोबिश

यह बहुत खराब उत्तर है, जैसे ही घंटे में दो अंक होते हैं, यह टूट जाता है। मैं नहीं चुन सकता ओपी ने इसे चुना है।
thebunnyrules

3

जेसी के योगदान का उपयोग करते हुए, मैंने बस संशोधित आउटपुट के साथ एक चर बनाया। फिर मैं उस हिस्से को घंटे के हिस्से का निर्माण करने के लिए संदर्भित करता हूं।

set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log 
pause

मूल स्रोत के साथ:

set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log

धन्यवाद जेसी। अगर मेरे पास प्रतिष्ठा के बिंदु होते तो मैं मतदान करता।


1

उपरोक्त सब कुछ को लागू करने वाले सबसे कॉम्पैक्ट समाधान के लिए, मुझे लगता है कि

For / F "TOKENS = 1-4 DELIMS = /" %% A IN ("% DATE%") DO / / F के लिए "TOKENS = 1-3 DELIMS =:" %% E IN ("% TIME: = 0%") लॉग सेटाइल = C: \ Temp \ robolog _ %% D %% C %% B _ %% E %% F %% G.log

स्क्रिप्ट में कोई नई रेखा जोड़े बिना यहां काम करेगा। यह शायद कई कमांड समाधानों की तुलना में कम सुरुचिपूर्ण है, हालांकि ..


1

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

:prepare time stamp 
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " "  set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%

:run the program 
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
               2> RunLogs\err.%timeStamp%

0

यह समय की शुरुआत में एक शून्य लेता है और घंटे के अंतिम दो अंक लेता है (मिनट और दूसरी शुरुआत के पदों को एक से स्थानांतरित कर दिया जाता है)। तो 3 AM "03" तब "03" और घंटे 15 "015" और फिर "15" बन जाता है।

set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log

कम आसानी से:

set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log

1
मुझे यकीन नहीं है कि यह काम करता है। अगर मैं 'सेट टी = 0% समय%' चलाता हूं और यह 9:38 बजे है, तो इको% टी% वापस देता है: '0 9: 38: 54.21', तो% T: ~ 1,2% को स्थान मिलता है, कोई अग्रणी नहीं 0.
इरा

0

कोड की एक पंक्ति वह करेगी जो आपको चाहिए:

    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%

उदाहरण के लिए, मैं% Date% का उपयोग करता हूं और फिर एक चर के लिए अग्रणी शून्य जोड़ता हूं जिसका उपयोग मैं यह निर्धारित करने के लिए करता हूं कि क्या मुझे अग्रणी स्थान को% Time% के लिए शून्य से बदलने की आवश्यकता है।

    ::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    Echo Started on %Date$ at %TimeStamp%

    :: Insert what you are doing here...

    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    ECHO Finished on %Date% at %TimeStamp%

0

यह एक छांटने योग्य टाइमस्टैम्प बनाता है और दूसरी पंक्ति यह सुनिश्चित करती है कि एकल अंकों के घंटे आदि के लिए कोई स्थान नहीं है, इसे बनाने के लिए:

set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%

आउटपुट:

2018.02.26__9.47.34


0

ऊपर से मदद करने के लिए धन्यवाद ... यह वही है जो मैं उपयोग कर रहा हूं:

C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43

मेरे पास तब लॉग होते हैं जिन्हें इस तरह से रोबोकॉपी नौकरियों में बुलाया जाता है:

इस तरह कई हैं:

Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt

इसके साथ काम समाप्त होता है:

REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log

COMPLETE_LOG_2018-06-27_10_53_54.log फ़ाइल अंत में निर्मित है और यह फ़ाइल नाम से छांटने योग्य है।


0

जेसी के जवाब ने घंटे क्षेत्र में स्थान को समाप्त करके मेरी फ़ाइल का नाम समस्या हल कर दिया। इस प्रकार मैंने अपने चर निर्धारित किए हैं:

for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b

यह एक विजेता की तरह काम करता है; किसी कारण से तारीख के लिए समान उपचार की आवश्यकता नहीं थी, लेकिन मुझे लगता है कि यह क्षेत्रीय सेटिंग्स के नीचे है।


0
    @echo off



    call :PAD aaa,2,0,grw
    echo [[aaa=%aaa%]]
    pause




rem #### Function PAD ####
    goto :PADEND
    :PAD <var>,<length>,<padchar>,<string>
        set padtot=%~2
        set padchar=%~3
        set padString=%~4
        :StartPADLOOP
            call :len lenpadString,%padString%
            if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
            set padString=%padchar%%padString%
            goto :StartPADLOOP
        :EndPADLOOP
        set %~1=%padString%
    GOTO :EOF
    :PADEND


rem #### Function LEN ####
    goto :LENEND
    :LEN <var>,<string>
        set LENtempvar=%~2
        rem echo {{S:%LENtempvar%}}
        set LENCOUNT=0    
        :startLENLOOP
            if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
            rem echo {{A:%LENtempvar%}}
            set LENtempvar=%LENtempvar:~0,-1%
            rem echo {{B:%LENtempvar%}}
            set /a LENCOUNT=LENCOUNT+1
        goto :startLENLOOP
        :endLENLOOP
        set %~1=%LENCOUNT%
    GOTO :EOF
    :LENEND

-2
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y

15.06.2015-03h43m34s-5357

5357-%random%"

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