एक बैच काम में टाइमस्टैम्प के रूप में एक फ़ाइल नाम बनाना


90

हमारे पास एक बैच काम है जो हर दिन चलता है और एक फाइल को एक पिक फ़ोल्डर में कॉपी करता है। मैं उस फ़ाइल की एक प्रति भी लेना चाहता हूं और फ़ाइल नाम के साथ एक संग्रह फ़ोल्डर में छोड़ देता हूं

 yyyy-MM-dd.log

विंडोज बैच की नौकरी में ऐसा करने का सबसे आसान तरीका क्या है?

मैं मूल रूप से इस यूनिक्स कमांड के बराबर की तलाश में हूं:

cp source.log `date +%F`.log

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

जवाबों:


105
CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log

लेकिन यह स्थानीय निर्भर है। मुझे यकीन नहीं है कि %DATE%स्थानीयकृत है, या विंडोज में छोटी तिथि के लिए निर्दिष्ट प्रारूप पर निर्भर करता है।

इस उत्तर से वर्तमान तिथि निकालने का एक स्थानीय-स्वतंत्र तरीका है , लेकिन यह इस पर निर्भर करता है WMICऔर FOR /F:

FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO @SET B=%%A
CP source.log %B:~0,4%-%B:~4,2%-%B:~6,2%.log

6
सूचकांकों के साथ थोड़ा सा फिडिंग करने की जरूरत है लेकिन ऐसा लगता है कि यह चाल चली गई है। (हालांकि पूरी तरह से मुझे माइनस-इंडेक्स लॉजिक की समझ नहीं है)% DATE: ~ -4% -% DATE: ~ -7, -5% -% DATE: ~ -10, -8% .log
इयोन कैंपबेल

1
यदि आप सभी सकारात्मक सूचकांकों का उपयोग करना चाहते हैं, तो आप उपयोग कर सकते हैं:% DATE: ~ 10,4% -% DATE: ~ 4,2% -% DATE: ~ 7,2%
opello

(मैंने अभी कुछ और काम किया है, जिस पर मैंने काम किया, यह बहुत समय पहले था, और मुझे नहीं पता कि मैंने इसे वैसे ही क्यों किया जैसे मैंने मूल रूप से किया था, हे।)
opello

3
यह अन्य स्थानों पर टूट जाता है। मेरे मामले में कमांड वापस आती है 2014-5.-01(जब यह होगा 2014-05-26)। तो बहुत सावधान रहें, यदि आप इस से युक्त स्क्रिप्ट प्रकाशित करते हैं!
एंथेस

5
समय के लिए इसका उपयोग करें (मील के पत्तों को हटाता है): %time:~-11,2%-%time:~-8,2%-%time:~-5,2%
एमआरसी

48

यह मेरे लिए काम करता था और एक फ़ाइलनाम-सुरक्षित समाधान था (हालांकि यह MM-dd-YYYY प्रारूप बनाता है):

C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%
C:\ set SAVESTAMP=%SAVESTAMP:,=.%.jpg
C:\ echo %SAVESTAMP%
11-04-2012@20-52-42.79.jpg

पहला कमांड DATE लेता है और उसके /साथ बदलता है -, TIME लेता है और उसके :साथ बदलता है -, और DATE @ TIME प्रारूप में उन्हें जोड़ता है। दूसरा setबयान किसी भी रिक्त स्थान है, और तीसरे को हटा setकी जगह ,के साथ .और संलग्न कर देता है .jpgविस्तार।

उपरोक्त कोड का उपयोग एक छोटी लिपि में किया जाता है जो आगे की प्रक्रिया के लिए सुरक्षा IP कैमरा से चित्र खींचता है:

:while
set SAVESTAMP=%DATE:/=-%@%TIME::=-%
set SAVESTAMP=%SAVESTAMP: =%
set SAVESTAMP=%SAVESTAMP:,=.%.jpg
wget-1.10.2.exe --tries=0 -O %SAVESTAMP% http://admin:<password>@<ip address>:<port>/snapshot.cgi
timeout 1
GOTO while

मेरे कंसोल पर आउटपुट 10-12-2014@14-22-59,44.jpgमिलीसेकंड से पहले अल्पविराम के साथ है
BeNdErR

1
कथन set SAVESTAMP=%SAVESTAMP:,=.%.jpgसे पहले जोड़ने का प्रयास करें echo। अगर वह काम करता है तो मैं जवाब को अपडेट करूंगा।
डैनियल सोकोलोस्की

1
यह स्थानीय-स्वतंत्र नहीं है। 08.06.2016@15-42-20,33.jpgमेरे जर्मन लैपटॉप Wed06-08-2016@15-43-45.89.jpgपर और मेरी अंग्रेजी पर लौटा ।
हनोबो

5
लेकिन यह अभी भी न तो स्थान independet है और न ही इसके बारे में सही (iso8601) स्वरूप बनाता हैyyyy-MM-dd
जेब

1
यह कष्टप्रद है कि पहली पंक्ति अभी भी दावा करती है कि यह स्थानीय स्वतंत्र था, बस यह देखने की कोशिश नहीं की जा रही थी ...
m3tikn0b

16

केवल फ्रेंच लोकेल (फ्रांस) के लिए , सावधान रहें क्योंकि /यह तारीख में दिखाई देता है:

echo %DATE%
08/09/2013

लॉग फ़ाइल की हमारी समस्या के लिए, यहाँ केवल फ्रेंच लोकेल के लिए मेरा प्रस्ताव है :

SETLOCAL
set LOGFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set LOGFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set LOGFILE=log-%LOGFILE_DATE%-%LOGFILE_TIME%.txt
rem log-2014.05.19-22.18.txt
command > %LOGFILE%

अति उत्कृष्ट! पढ़ने में थोड़ा मुश्किल है, लेकिन यह आउटपुट को उसी तरह प्रारूपित करने की अनुमति देता है जैसे आप चाहते हैं।
डेविटॉफ

2
यदि आप श्वेत वर्णों से बचना चाहते हैं तो बहुत सावधानी बरतें क्योंकि HOUR को 1 अंक प्रदान किया जा सकता है जैसे: "_0:00"(अंडरलाइन चार एक जगह है)
daVe

1
मुझे इस उत्तर के लिए "लॉग- / 18 /। 0.Sa- 9.16.txt" मिलता है।
ledlogic

@ledlogic: आपका लोकेल क्या है? यह उत्तर फ्रांसीसी लोकेल के लिए है।
Aubin

1
काम नहीं करता है मुझे यह विंडोज 7 पर मिलता है - लॉग- / 05 /। 0.We-18.13.tx
सैम बी

10

यहाँ एक स्थानीय स्वतंत्र समाधान है (SetDateTimeCompords.cmd नामक फ़ाइल की प्रतिलिपि):

@echo off
REM This script taken from the following URL:
REM http://www.winnetmag.com/windowsscripting/article/articleid/9177/windowsscripting_9177.html

REM Create the date and time elements.
for /f "tokens=1-7 delims=:/-, " %%i in ('echo exit^|cmd /q /k"prompt $d $t"') do (
   for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
      set dow=%%i
      set %%a=%%j
      set %%b=%%k
      set %%c=%%l
      set hh=%%m
      set min=%%n
      set ss=%%o
   )
)

REM Let's see the result.
echo %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss%

मैंने अपनी सभी .cmd स्क्रिप्ट को एक ही फ़ोल्डर में रखा (% SCRIPTROOT%); किसी भी स्क्रिप्ट को दिनांक / समय मानों की आवश्यकता होगी जो SetDateTimeCompords.cmd को निम्न उदाहरण में कहेगा:

setlocal

@echo Initializing...
set SCRIPTROOT=%~dp0
set ERRLOG=C:\Oopsies.err

:: Log start time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : Start === >> %ERRLOG%

:: Perform some long running action and log errors to ERRLOG.

:: Log end time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : End === >> %ERRLOG%

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


2
क्षमा करें, यह स्थानीय-स्वतंत्र नहीं है: मेरे फ्रेंच विंडोज पर, मुझे "18 -2014- @ 13:14:43" मिलता है
डेविटॉफ

1
पुष्टि कर सकते हैं: स्थानीय-स्वतंत्र नहीं। prompt $d $tमेरे सिस्टम पर 30.05.2016 15: 35: 56,93 रिटर्न।
हनोबो

7

क्योंकि उन्हें एक साथ फाड़ने %DATE%और %TIME%उन्हें अलग करने का विचार सबसे अच्छा लगता है, यहाँ एक विकल्प है जो एक पॉलीशेलेलेल का उपयोग करता है:

for /f %i in ('powershell -c "get-date -format yyyy-MM-dd--HH-mm-ss"') do @set DATETIME=%i
set LOGFILE=my-script-%DATETIME%.txt

संदर्भ यहांget-date है .NET-शैली और UNIX- शैली दोनों के लिए प्रारूप विकल्प के साथ।


6

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

copy "{path}\example.txt" "{path}\_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

6

यह सुनिश्चित करेगा कि आउटपुट 2-अंकीय मान है ... आप अपनी पसंद के अनुसार आउटपुट को पुन: व्यवस्थित कर सकते हैं और डायग्नोस्टिक्स अनुभाग पर संयुक्त टिप्पणी करके परीक्षण कर सकते हैं। का आनंद लें!

(मैंने अन्य मंचों से इसका बहुत उधार लिया ...)

:: ------------------ Date and Time Modifier ------------------------

@echo off
setlocal

:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP FOR USE IN APPENDING FILENAMES

:: CREATE VARIABLE %TIMESTAMP%

for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"prompt $D $T"') do (
   for /f "tokens=2-4 skip=1 delims=/-,()" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)

:: ensure that hour is always 2 digits

if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09


:: --------- TIME STAMP DIAGNOSTICS -------------------------

:: Un-comment these lines to test output

:: echo dayOfWeek = %dow%
:: echo year = %yy%
:: echo month = %mm%
:: echo day = %dd%
:: echo hour = %hh%
:: echo minute = %min%
:: echo second = %sec%
:: echo hundredthsSecond = %hsec%
:: echo.
:: echo Hello! 
:: echo Today is %dow%, %mm%/%dd%. 
:: echo.
:: echo. 
:: echo.
:: echo.
:: pause

:: --------- END TIME STAMP DIAGNOSTICS ----------------------

:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "

endlocal & set timeStamp=%yy%%mm%%dd%_%hh%-%min%-%sec%
echo %timeStamp%

2

फ़ाइल नाम के रूप में वर्तमान दिनांक के साथ एक फ़ाइल बनाएं (उदा। 2008-11-08.dat)

echo hello > %date%.dat    

वर्तमान तिथि के साथ लेकिन "-" के बिना (उदा। 20081108.dat)

echo hello > %date:-=%.dat   

2

शायद यह मदद कर सकता है:

echo off
@prompt set date=$d$_ set time=$t$h$h$h
echo some log >> %date% %time%.log
exit

या

echo off
set v=%date%.log
echo some log >> %v%

अच्छा एक सेको ... उस% तारीख% मूल्य के लिए लगता है कि मैं क्या देख रहा हूँ। कोई भी मौका आप SET विवरण की व्याख्या कर सकते हैं। क्या वास्तव में $ d $ _set और $ t $ h $ h $ h हैं
इयोन कैंपबेल

1
सेट एक "सेट चर" कथन है। जहाँ दिनांक चर $ d $ _ (दिन + शेष) है और समय चर $ t $ h $ h $ h (समय + एमएस) है। मैंने यह दिखाने की कोशिश की कि यह कैसे चर के सेट के साथ किया जा सकता है, यह प्रॉम्प्ट लाइन के बिना ठीक काम कर सकता है। मैंने मूल रूप से इस सेट की तारीख =% YYYY %% MM %% DD% करने की कोशिश की, लेकिन मैं यहां लिनक्स चला रहा हूं और SciTE पर स्क्रिप्ट को संकलित कर रहा हूं इसलिए मुझे नहीं पता कि यह काम करता है या नहीं। क्षमा करें यदि यह काम नहीं करता है।
सेको जू

जोड़ना भूल गए, $ _ newline है।
सेको

1
इसके अलावा, @prompt // $ d $ _ $ t $ h $ h $ h $ h $ h $ h // // देखें
सेको

ध्यान दें कि यह भी स्थानीय-स्वतंत्र नहीं है। दिनांक वर्तमान संस्कृति सेटिंग में प्रारूपित है, मेरे मामले में DD.MM.YYYY (जर्मन के लिए)।
हनोबो

2

मैंने वर्तमान टाइमस्टैम्प (स्थानीय-सुरक्षित, कोई बुरा वर्ण नहीं ...) का प्रिंट आउट करने के लिए थोड़ा सी प्रोग्राम रखा। फिर, मैं पर्यावरण चर में परिणाम को बचाने के लिए FOR कमांड का उपयोग करता हूं:

:: Get the timestamp
for /f %%x in ('@timestamp') do set TIMESTAMP=%%x

:: Use it to generate a filename
for /r %%x in (.\processed\*) do move "%%~x" ".\archived\%%~nx-%TIMESTAMP%%%~xx"

यहाँ एक लिंक है:

https://github.com/HarryPehkonen/dos-timestamp


2

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

@setlocal enableextensions enabledelayedexpansion
@echo off

call :timestamp freshtime freshdate
echo %freshdate% - %freshtime% - Some data >> "%freshdate - Somelog.log"

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

set year=%date:~-4%
set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~7,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
set FreshDate=%month%.%day%.%year%

यह मेरे लिए उपयोगी था, हालांकि ".cmd" फ़ाइल में, "FreshTime" चर में कॉलोन तब त्रुटि करते थे जब मेरे "रोबोकॉपी" cmdline में फ़ाइल नाम के लिए उपयोग किया जाता था: ERROR : Invalid Parameter #12 : "/LOG:C:\opt\Sync_08.10.2020_16:27:39.log"एक फिक्स के रूप में मैंने इसके बजाय डैश का उपयोग किया था:set FreshTime=%hour%-%min%-%secs%
netbignignate

2

आप केवल वर्तमान स्थानीय प्रारूप का पता लगा सकते हैं और उदाहरण के लिए, अपने प्रारूप में दिनांक प्राप्त कर सकते हैं:

::for 30.10.2016 dd.MM.yyyy
if %date:~2,1%==. set d=%date:~-4%%date:~3,2%%date:~,2%
::for 10/30/2016 MM/dd/yyyy
if %date:~2,1%==/ set d=%date:~-4%%date:~,2%%date:~3,2%
::for 2016-10-30 yyyy-MM-dd
if %date:~4,1%==- set d=%date:~,4%%date:~5,2%%date:~-2%
::variable %d% have now value: 2016103 (yyyyMMdd)
set t=%time::=%
set t=%t:,=%
::variable %t% have now time without delimiters
cp source.log %d%_%t%.log

2

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन एक एफएआर सरल उत्तर है (हालांकि शायद यह केवल विंडोज़ के नए संस्करणों में काम करता है)। केवल दिनांक और समय दिखाने के लिए DATE और TIME डॉस कमांड के लिए बस / t पैरामीटर का उपयोग करें और इसे सेट करने के लिए आपको संकेत न दें, जैसे:

@echo off
echo Starting test batch file > testlog.txt
date /t >> testlog.txt
time /t >> testlog.txt

1

1) आप GNU कोरुटिल डाउनलोड कर सकते हैं जो GNU दिनांक के साथ आता है

2) आप VBScript का उपयोग कर सकते हैं , जो विंडोज में तारीख हेरफेर को आसान बनाता है:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\test"
Set objFolder = objFS.GetFolder(strFolder)
current = Now
mth = Month(current)
d = Day(current)
yr = Year(current)
If Len(mth) <2 Then
    mth="0"&mth
End If
If Len(d) < 2 Then
    d = "0"&d
End If
timestamp=yr & "-" & mth &"-"& d
For Each strFile In objFolder.Files
    strFileName = strFile.Name
    If InStr(strFileName,"file_name_here") > 0 Then
        BaseName = objFS.GetBaseName(strFileName)
        Extension = objFS.GetExtensionName(strFileName)
        NewName = BaseName & "-" & timestamp & "." & Extension
        strFile.Name = NewName
    End If
Next

स्क्रिप्ट को इस रूप में चलाएँ:

c:\test> cscript /nologo myscript.vbs

0

यह (मेरे) जर्मन लोकेल के साथ अच्छी तरह से काम करता है, इसे अपनी आवश्यकताओं के साथ समायोजित करना संभव होना चाहिए ...

forfiles /p *PATH* /m *filepattern* /c "cmd /c ren @file 
%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%_@file"

%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%पुर्तगाली स्थान के लिए भी काम करता है! मेरा मतलब है YYYYMMDD
फर्नांडो Fabreti

0

तैनाती के लिए बड़ी ज़िप फ़ाइलों के लिए, मैं तिमाही घंटों का उपयोग करता हूं। इस पृष्ठ पर किसी और ने पहले इसका उल्लेख नहीं किया था, इसलिए मैं अपनी छोटी स्क्रिप्ट यहां रखूंगा:

set /a "quarter_hours=%time:~0,2%*4 + %time:~3,2% / 15"
set "zip_file=release_%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%.%quarter_hours%.zip"

यह आधी रात से लेकर सुबह 5 बजे तक शून्य पैड क्वार्टर घंटे नहीं है, लेकिन यह अभी भी बनाता है इसलिए आप कुछ टकरावों के साथ दिन में कई बार एक मोहरबंद रिलीज कर सकते हैं।

उम्मीद है की वो मदद करदे।


0

फ़ाइल नाम में समय की मोहर जोड़ने के लिए थोड़े ट्विक के साथ मार्टिन के सुझाव का उपयोग किया:

forfiles /p [foldername] /m rsync2.log /c "cmd /c ren @file %DATE:~6,4%%DATE:~3,2%%DATE:~0,2%_%time:~-11,2%-%time:~-8,2%-%time:~-5,2%-@file

10:17:21 23/10/2019 के लिए परिणाम है:

20191023_10-17-21-rsync2.log

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