विंडोज कमांड-लाइन: इसके नाम की वर्तमान तिथि के साथ एक फ़ाइल बनाएं


19

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

दुर्भाग्य से, यह स्लैश की वजह से y / m / d जैसी फॉर्मेट की गई तारीखों वाले सिस्टम पर काम नहीं करता है:

zip some_options "archive_%DATE%.zip"

%DATE%चर की तरह कुछ करने के लिए फैलता है

Mon 09/28/2009

मेरे पास gnuwin32 पैकेज तक पहुंच है, इसलिए मैं sedडैश द्वारा रिक्त स्थान और स्लैश को बदलने के लिए कह सकता हूं । समस्या यह है कि, मैं sedज़िप संग्रह की फ़ाइल नाम बनाने के लिए आउटपुट का उपयोग कैसे करूँगा ?

यूनिक्स (बैश) में, कोई एक कमांड का मूल्यांकन करने के लिए बैक-कोट्स का उपयोग कर सकता है और दूसरे कमांड में इसके आउटपुट का उपयोग कर सकता है, कुछ इस प्रकार है:

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

क्या विंडोज में ऐसा ही कुछ उपलब्ध है?

या हो सकता है sedकि फ़ाइल के नाम के निर्माण के लिए एक वैरिएबल सेट करने और उपयोग करने का एक तरीका है ?

जवाबों:


27

आप चर का उपयोग करके प्रतीकों को बदल सकते हैं:

set _date=%DATE:/=-%

1
यह एक स्वच्छ चाल है!
क्रिस्टी डियाकॉन्सक्यू

PS क्या रिक्त स्थान या अन्य गंदा पात्रों से छुटकारा पाने का एक 'एक-लाइनर' तरीका है? (जैसा कि प्रत्येक चरित्र को बदलने के लिए एक 3rd ... nth अस्थायी चर होने का विरोध किया गया है)
क्रिस्टी डियाकोन्सकु

कोई खेद नहीं। लगता है ऐसी कोई बात नहीं है। ऐसा करने के लिए आपको सिंटैक्स के लिए कमबैक करना होगा। NB: यह बैच-प्रोग्रामिंग के लिए एक अच्छा संदर्भ है: robvanderwoude.com/batchfiles.php
क्रिस्टोफर

5
यह इससे भी तेज है %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
जेस स्टोन

कैसे कोई नहीं है 1 आपकी प्रतिक्रिया जेस स्टोन! मुझ से +1 !!!
अरवो बोवेन

5

मैं हमेशा उपयोग करता हूं:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

फिर CDate Sat02182012 होगा। यदि आप इसे %% d - %% b - %% c तक अधिक क्रमिक सेट करना चाहते हैं तो यह 2012-02-18 होगा

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

दिनांक और समय फ़ोल्डर / फ़ाइल के अनुकूल बनाने के लिए।


4

मैंने यहाँ एक बहुत ही समान प्रश्न का उत्तर पोस्ट किया है । खेतों में तारीख का बंटवारा 1 पंक्ति में किया जाता है, इसके बजाय हैरीमेक के उत्तर में कई लाइनें होती हैं।

दिलचस्प हिस्सा यह है:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

और चेतावनी अभी भी प्रासंगिक है:

चेतावनी : दिनांक का प्रारूप (yyyymmdd = %% k %% j %% i) आपकी क्षेत्रीय सेटिंग्स पर निर्भर करता है। क्योंकि मैं फ्रेंच तिथि प्रारूप (dd / mm / yyyy) का उपयोग करता हूं, मुझे "%% k %% j %% i" प्रारूप (%% i = day, %% j = महीना, %% j =) के रूप में उपयोग करना होगा साल)।

यदि आपकी क्षेत्रीय सेटिंग्स यूएस शैली (मिमी / डीडी / yyyy) पर सेट हैं, तो आपको "%% k %% i %% j" (%% i = महीना, %% j = दिन, %% j = वर्ष) का उपयोग करना चाहिए ।


3
zip some_options "archive_%date:/=-%.zip"

/=-विकल्प /एक ऋण चिह्न के साथ।


2

इस कोड की भयावह बिट को कुछ ऐसा करना चाहिए जो आपको चाहिए

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

यदि आप फ़ाइल नाम को उचित रूप से बदलते हैं।


1
राक्षसी की व्याख्या करने के लिए देखभाल? :)
क्रिस्टी डिएकस्क्यू

यह मूल रूप से तारीख से बाहर बिट्स काट रहा है और इसे फ़ाइल नाम के बीच में खिला रहा है, आप इसे इको कर सकते हैं और फिर कमांड लाइन पर हॉरर के कुछ हिस्सों को कर सकते हैं ताकि यदि आप इको% तारीख करते हैं: ~ 6,4% यह देता है साल। यह सिर्फ तारीख और समय का विकल्प है।
कर्नल

दिलचस्प। दुर्भाग्य से बहुत पोर्टेबल नहीं है ...
क्रिस्टी Diaconescu

दुर्भाग्य से सबस्ट्रिंग का उपयोग करने में समस्या यह है कि यह एक निश्चित तारीख के प्रारूप पर निर्भर करता है, और जब यह अलग होता है, तो इसे उड़ा देता है। मेरी मशीन पर echo %date:~6,4%%date:~3,2%%date:~0,2%रिटर्न के 9-289-20बाद से मेरे पास yyyy-MM-dd (इसलिए आज 2009-09-28 है) का उपयोग करने की तिथि निर्धारित है।
जोशुआ

सच है, मैं केवल एक मशीन पर इस समाधान का उपयोग करता हूं इसलिए यह बहुत अधिक समस्या नहीं है।
कर्नल

2

चूँकि आपके प्रश्न को विंडोज़ के रूप में टैग किया गया है, इसलिए मुझे यह समाधान मिला जो पुरानी पुरानी .bat फ़ाइलों में काम करता है:
"MMDDYYY प्रारूप में वर्तमान तिथि प्राप्त करने के लिए Windows बैच फ़ाइल (.bat)" ,
और संभवतः आपके मामले के लिए अनुकूलित किया जा सकता है:

गूंज पर
@REM Seamonkey के त्वरित तारीख बैच (MMDDYYYY प्रारूप)
@REM सेटअप% तारीख चर
@REM प्रथम माह, दिन, और मिमी, DD, YYYY स्वरूपों और उसके बाद में साल जोड़ती MMDDYYYY होने की पार्स

For / F "TOKENS = 1 * DELIMS =" %% A IN ('DATE / T') DO सेट करें = %% B B
/ / F "TOKENS = 1,2 eol = / DELIMS = /" %% A IN 'DATE / T') DO SET mm = %% B
FOR / F "TOKENS = 1,2 DELIMS = / eol = /" %% A IN ('इको% CDATE%') DO SET dd =% B B
/ F "TOKENS = 2,3 DELIMS = /" %% A IN ('इको% CDATE%') DO yyyy = %% Bv vSET दिनांक =% mm %% dd %% yyyy%

यह कुछ भी नहीं करता है लेकिन MMDDYYYY प्रारूप में आज की तारीख होने के लिए% दिनांक चर सेट करता है, इसलिए इसे बाद में स्क्रिप्ट में कहा जा सकता है।

संपादित
एक बेहतर वाक्यविन्यास मिला। यह देखते हुए कि मेरी तिथि आज "सोम 28/09/2009" है:
सेट दिन =% दिनांक: ~ 0,2%
निर्धारित माह =% दिनांक: ~ 7,2%
सेट वर्ष =% दिनांक: ~ 10,4%


2

gnuwin32-'date 'के संयोजन में शुद्ध cmd.exe संस्करण:

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

तो यह जगह-जगह प्रतिस्थापन कर सकता है! यदि आप मुझसे पूछें, 'कमांड' के लिए एक अजीब वाक्यविन्यास है ...
क्रिस्टी Diaconescu

मैं यह दावा नहीं कर सका :) पूरे 'cmd' सामान वैसे भी पागल है, जिसने किसी भी तरह के बुरे सपने में गहराई से डिजाइन किया था। 'के लिए' cmd वास्तव में पहली बार में लाइनों (उर्फ '' लूप 'को अनियंत्रित' बनाता है) और फिर 'बनाया' स्क्रिप्ट निष्पादित करता है।
अकीरा

1

cscript + vbasic का उपयोग करने के बारे में क्या:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

इसके माध्यम से कॉल करें

cscript /nologo zip_it.vbs

1

के लिए / f "टोकन = 1,2,3,4,5 delims = /।" %% a ('दिनांक / T') सेट करें CDate = %% d - %% b - %% c

@ जियो डेटा =% सीडी%

यह वर्ष-महीना-दिवस में है जो अब सबसे आम है


1

कोई भी समाधान जो %DATE%या तो आउटपुट का उपयोग करता है या date /tयदि उपयोगकर्ता ने अपनी क्षेत्रीय सेटिंग्स को संशोधित किया है, तो इसके टूटने की संभावना है। उदाहरण के लिए, मैंने अपना "लघु दिनांक" प्रारूप सेट किया है "yyyy-MM-dd", इसलिए मेरे पास %DATE%समान आउटपुट है "2012-02-18", और date /tसमान है। (यह विंडोज 7 के लिए है; मुझे लगता है कि यह विंडोज के पुराने संस्करणों के लिए समान है।)

एक बैच फ़ाइल बनाएँ और फिर उसे निष्पादित करें।

चूंकि आपके पास GNU dateकमांड उपलब्ध है, आप कुछ इस तरह से कर सकते हैं:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat कुछ इस तरह होगा:

zip some_options archive_2012-02-18.zip

ध्यान दें कि यह tmp.batवर्तमान निर्देशिका में बनाता है, जो एक समस्या हो सकती है; इसे बनाना बेहतर हो सकता है %TEMP%\tmp.bat। मैंने बाद में फ़ाइल भी नहीं निकाली; यह करना काफी आसान है।

date +FORMATआपको dateकमांड के आउटपुट प्रारूप को printfप्रारूप स्ट्रिंग के समान निर्दिष्ट करने देता है ; देख coreutils तारीख प्रलेखन जानकारी के लिए। प्रारूप में मनमाना पाठ शामिल हो सकता है, इसलिए इस मामले में आपको उपयोग करने की आवश्यकता नहीं है sed


1

मुझे लगता है, अगर आप सभी के बिट्स को एक साथ रखते हैं तो आपको कुछ मिलता है जो आपके लिए काम करता है। यह प्रदर्शन मॉनिटर से ट्रिगर के जवाब में चल रही प्रक्रियाओं का एक स्नैपशॉट देने के लिए विंडोज 2003 प्रणाली पर है:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

आउटपुट फ़ाइल को एक स्ट्रिंग में नाम दिया गया है जिसमें कोई सीमांकक नहीं है।


0
zip [...] archive_`echo %DATE% | tr / -`.zip

कार्य करना चाहिए।

दूसरी तरफ - शायद आपके पास dateकमांड उपलब्ध है (मुझे विंडोज नहीं पता है)। यदि हाँ, तो बस करें:

zip [...] archive_`date +'%Y-%m-%d'`.zip

बैकटिक चाल cmd.exe में काम नहीं करती है। और विंडोज 'तिथि' कमांड स्वरूपण को संभाल नहीं सकता है :(
क्रिस्टी Diaconescu

-1

सुनिश्चित नहीं है कि यह आपको सूट करता है, लेकिन मेरा कोड है

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

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