2009-10-29 19 views
33

में टाइमस्टैम्प के साथ अद्वितीय फ़ाइल नाम जेनरेट करें। मेरी .bat फ़ाइल में मैं दिनांक-समय के आधार पर फ़ाइलों/निर्देशिकाओं के लिए एक अद्वितीय नाम उत्पन्न करना चाहता हूं।बैच स्क्रिप्ट

उदा।

Build-2009-10-29-10-59-00 

समस्या यह है कि% TIME% ऐसा नहीं करेगा क्योंकि इसमें ऐसे वर्ण हैं जो फ़ाइल नाम में अवैध हैं (उदा। ':')।

क्या बैच फ़ाइलों में 'tr' जैसा कुछ है?

कोई अन्य विचार यह कैसे हल करें (जिसे बैच दुभाषिया से अलग अतिरिक्त कमांड लाइन उपयोगिता की आवश्यकता नहीं है)?

उत्तर

41

संपादित करें: ऐसा करने का एक बेहतर तरीका एक दिनांक/समय स्ट्रिंग लेना है जिसमें स्थानीय परिभाषित लोगों को %date% और %time% से उपयोग करने के बजाय एक परिभाषित और अपरिवर्तनीय प्रारूप है। आप इसे पाने के लिए निम्न का उपयोग कर सकते हैं:

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x 

यह 20120730203126.530000+120 की तरह कुछ पैदावार और आपको लगता है कि उपयोग कर सकते हैं तो अपने फ़ाइल नामों के निर्माण के लिए।


(ओल्ड नीचे जवाब)

आप बस एक खाली स्ट्रिंग के साथ हमलावर चरित्र की जगह ले सकता:

echo %time::=% 

वाक्य रचना %var:str1=str2% के मामले में वातावरण चर (या छद्म चर लेता है %TIME% और str1str2 द्वारा प्रतिस्थापित करता है। यदि बराबर चिह्न के बाद कुछ भी नहीं चलता है तो str1 बस हटा दिया जाता है।

अपने विशिष्ट मामले में मुझे लगता है कि आप निम्नलिखित चाहते हैं:

rem cut off fractional seconds 
set t=%time:~0,8% 
rem replace colons with dashes 
set t=%t::=-% 
set FileName=Build-%date%-%t% 

एक और अधिक मामले में जानवर बल जिस तरह से आप नहीं जानते कि क्या कोलन उपयोग किया जाता है (लेकिन समय के क्रम होगा वही):

set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2% 

सभी पिछली चीजें, मान लीजिए कि आप मानक आईएसओ 8601 दिनांक प्रारूप का उपयोग करते हैं, i। ई। 2009-10-29। मैं इसे सामान्य रूप से सामान्य मानता हूं, लेकिन कुछ लोग अन्य प्रारूपों का उपयोग करते हैं इसलिए सावधान रहें। लेकिन चूंकि आपने उस तारीख के बारे में नहीं पूछा था जिसे मैं मान रहा था कि आपको कोई समस्या नहीं है।

+1

हॉट डॉन, यह एक फैंसी चाल है। :) ठंडा –

+0

'tr' जितना शक्तिशाली नहीं है, शायद कई जरूरतों के लिए पर्याप्त है। – Joey

+0

% समय: ~ 0,2% -% समय: ~ 3,2% -% समय: ~ 6,2% 10:00 बजे से पहले व्हाइटस्पेस के साथ एक स्ट्रिंग बनाता है! – mcbainpc

3

मैं बैच फ़ाइल के निष्पादन के लिए एक अद्वितीय फ़ाइल नाम बनाने के लिए इसका उपयोग करता हूं।

REM ****Set up Logging **** 
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) 
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) 
set mytime=%mytime: =0% 

set Logname="PCCU_%mydate%_%mytime%.log" 
Echo. >>%Logname% 2>>&1 
Echo.=================== >>%Logname% 2>>&1 

मैं लाइन

set mytime=%mytime: =0% 

जोड़ने के लिए है क्योंकि मैं एक ही समस्या है, जहां एक खाली से पहले 10 पूर्वाह्न दर्ज किया जा रहा था, अब मैं मैं भी% mydate पुन: उपयोग 9. के बजाय 09 प्राप्त किया था % और% mytime% variable अन्य फ़ाइलों के लिए जो मैं इस स्क्रिप्ट के साथ बनाते हैं ताकि वे सभी एक ही दिनांक समय टिकट हो।

1

पिछले उदाहरण के काम में कोड बनाने के लिए, मुझे थोड़ा समायोजित करने की आवश्यकता थी। मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरा पीसी यूके डेट प्रारूप का उपयोग कर रहा है।mydate में वापस पाने के लिए "2014-04-19" मैं की जरूरत:

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) 

नीचे मैं अपने कुल स्क्रिप्ट चिपकाया है, और कैसे फ़ाइल नाम

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) 
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) 
set mytime=%mytime: =0% 

set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log" 
Robocopy \\sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee 

इस आशा का उपयोग करने का एक उदाहरण शामिल मदद करता है!

2

यह दिनचर्या, वास्तव में केवल एक पंक्ति, किसी भी दिनांक या समय प्रारूप में सेट प्रत्येक सिस्टम पर काम करती है।
लाइन 1 का आउटपुट प्रारूप 20140725095527.710000 + 120

आपको आवश्यक वास्तविक दिनांक/समय प्रारूप 2 लाइन में निर्धारित किया गया है। हालांकि आप इसे प्रारूपित कर सकते हैं।
बस परिणामी डेटटाइम वैरिएबल को अपने फ़ाइल नाम यानी में जोड़ें। Filename_% दिनांक समय% .log

::======================================================================= 
::== 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% | REM OUTPUT = 20140725-095527 
14

@ जोई की और @Kees के उत्तर तुरंत उन्हें प्रयोग करने योग्य बनाने के लिए पर बाद।

कमांड लाइन पर:

FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a 
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2% 
echo %DateTime% 

एक बैट फ़ाइल में:

@echo off 
REM See http://stackoverflow.com/q/1642677/1143274 
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a 
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2% 
echo %DateTime% 

उदाहरण आउटपुट:

2014-10-21_16-28-52 
0

तो आप कर सकते हैं गारंटी कि मशीन एक विशिष्ट है पाइथन का संस्करण उस पर स्थापित है और सिस्टम के 01 में सुलभ है

FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print 
datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO (
SET TIMESTAMP=%%F 
) 
ECHO %TIMESTAMP% 

यह वर्तमान स्थानीय ISO-8601 (ish) तिथि प्रतिनिधित्व एक %TIMESTAMP% चर में है, इसलिए की तरह डाल दिया है और इसे बाहर गूंज होगा:

2017-05-25T14:54:37 

मैं डाल दिया, तो आप इस समाधान का उपयोग कर सकते हैं replace(':', '-')isoformat() के बाद ताकि परिणामस्वरूप स्ट्रिंग को फ़ाइल नाम या निर्देशिका में उपयोग किया जा सके, क्योंकि : विंडोज फाइल सिस्टम में एक वर्जित चरित्र है।

संबंधित मुद्दे