Bir toplu işte zaman damgası olarak dosya adı oluşturma


90

Her gün çalışan ve bir dosyayı bir toplama klasörüne kopyalayan bir toplu işimiz var. Ayrıca bu dosyanın bir kopyasını alıp dosya adıyla bir arşiv klasörüne bırakmak istiyorum.

 yyyy-MM-dd.log

Bunu bir Windows toplu işinde yapmanın en kolay yolu nedir?

Temel olarak bu Unix komutunun bir eşdeğerini arıyorum:

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

Windows .bat dosyalarında istediğiniz biçime sahip bir Tarih Dizesi alırken önerilen çözümler kadar kötü görünüyor. Dürüst olmak gerekirse, makinede hangi programlama dillerinin mevcut olduğunu kontrol edin, örneğin java, ruby, perl veya başka bir şey ve istediğiniz şeyi size vermek için 5 saniyelik bir çalıştırılabilir yapın. Uygun formatta bir tarih almak için birden fazla kod satırı gerektiren .bat dosyasını korumakla zaman kaybetmem.
99Sono

Yanıtlar:


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

Ancak yerel ayara bağlıdır. %DATE%Yerelleştirilmiş olup olmadığından emin değilim veya Windows'ta kısa tarih için belirtilen biçime bağlı.

İşte bu yanıttan geçerli tarihi çıkarmanın yerel ayardan bağımsız bir yolu , ancak şuna bağlıdır WMICve 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
Endekslerle biraz uğraşmamız gerekiyordu, ancak bu hile yaptı gibi görünüyor. (eksi indeks mantığını anladığımdan tam olarak emin olmasam da)% DATE: ~ -4% -% DATE: ~ -7, -5% -% DATE: ~ -10, -8% .log
Eoin Campbell

1
Tüm pozitif endeksleri kullanmak istiyorsanız, şunu kullanabilirsiniz:% DATE: ~ 10,4% -% DATE: ~ 4,2% -% DATE: ~ 7,2%
opello

(Bunu sadece üzerinde çalıştığım başka bir şeyden aldım, uzun zaman önceydi ve bunu neden başlangıçta yaptığım gibi yaptığımı bilmiyorum heh.)
opello

3
Bu, diğer yerel ayarlarda bozulur. Benim durumumda komut geri dönüyor 2014-5.-01(ne zaman olacağı 2014-05-26). Bu yüzden, bunu içeren komut dosyaları yayınlarsanız çok dikkatli olun!
amenthes

5
Şimdilik bunu kullanın (milisaniyeyi kaldırır): %time:~-11,2%-%time:~-8,2%-%time:~-5,2%
MRC

48

Bu benim için çalıştı ve dosya adı açısından güvenli bir çözümdü (ancak bir AA-gg-YYYY biçimi oluştursa da):

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

İlk komut Bir TARİH ve yerine geçer sürer /ile -, TIME ve yerine geçer sürer :ile -, ve TIME formatına @ TARİH içine birleştirir onları. İkinci setifade tüm boşlukları kaldırır ve üçüncü ifade uzantı ile setdeğiştirir ve uzantıyı ekler .,..jpg

Yukarıdaki kod, daha ileri işlemler için bir güvenlik IP Kamerasından görüntüleri çeken küçük bir komut dosyasında kullanılır:

: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

konsolumdaki çıktı 10-12-2014@14-22-59,44.jpg, milisaniyeden önce virgülle geliyor
BeNdErR

1
İfadeden set SAVESTAMP=%SAVESTAMP:,=.%.jpgönce eklemeyi deneyin echo. Bu işe yararsa cevabı güncelleyeceğim.
Daniel Sokolowski

1
Bu yerel ayardan bağımsız değildir. 08.06.2016@15-42-20,33.jpgAlmanca dizüstü bilgisayarımda ve Wed06-08-2016@15-43-45.89.jpgİngilizce dizüstü bilgisayarımda geri döner .
Hannobo

5
Ama yine de ne yerel ayardan bağımsız ne de doğru (iso8601) biçimini oluşturuyoryyyy-MM-dd
jeb

1
İlk satırın hala
yerelden

16

For Fransız Yerel (Fransa) SADECE dikkatli olun çünkü /tarihi görünür:

echo %DATE%
08/09/2013

Günlük dosyası sorunumuz için, YALNIZCA Fransızca Yerel Ayar için önerim :

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%

Mükemmel! Okuması biraz zor, ancak çıktıyı istediğiniz gibi biçimlendirmenize izin veriyor.
davitof

2
Harika ama beyaz karakterlerden kaçınmak istiyorsanız dikkatli olun çünkü HOUR şu şekilde 1 rakam oluşturabilir: "_0:00"(altı çizili karakter boşluktur)
daVe

1
Bu cevap için "log- / 18 /. 0.Sa- 9.16.txt" alıyorum.
ledlogic

@ledlogic: yerel ayarınız nedir? Bu cevap Fransız yerel ayarı içindir.
Aubin

1
Çalışmıyor Bunu Windows 7'de alıyorum - log- / 05 /. 0.We-18.13.tx
Sam B

10

İşte yerel ayardan bağımsız bir çözüm (SetDateTimeComponents.cmd adlı bir dosyaya kopyalayın):

@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%

Tüm .cmd komut dosyalarımı aynı klasöre koyuyorum (% SCRIPTROOT%); tarih / saat değerlerine ihtiyaç duyan herhangi bir komut dosyası, aşağıdaki örnekte olduğu gibi SetDateTimeComponents.cmd'yi çağıracaktır:

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%

Örnekte gösterildiği gibi, tarih / saat değerlerini güncellemeniz gerektiğinde SetDateTimeComponents.cmd'yi çağırabilirsiniz. Zaman ayrıştırma komut dosyasını kendi SetDateTimeComponents.cmd dosyasında gizlemek, çirkin ayrıntıları gizlemenin ve daha da önemlisi yazım hatalarını önlemenin güzel bir yoludur.


2
üzgünüm, bu yerel ayardan bağımsız değil: Fransızca Windows'umda "18-2014- @ 13:14:43"
mesajı

1
Onaylayabilir: yerel ayardan bağımsız değil. prompt $d $tsistemimde 30.05.2016 15: 35: 56,93 döndürüyor.
Hannobo

7

Yırtma , parçalama %DATE%ve %TIME%tekrar bir araya getirme fikri en iyi ihtimalle kırılgan göründüğünden, işte bir powershell oneliner kullanan bir alternatif:

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

İçin Başvuru get-dateolduğunu burada NET tarzı ve UNIX tarzı hem biçim seçenekleri ile.


6

Bunu sık sık kullanıyorum ve her şeyi tek bir kopya komutuna koyuyorum. Aşağıdaki, example.txt dosyasını example_YYYYAAGG_HHMMSS.txt olarak kopyalar ve tabii ki bunu tercih ettiğiniz biçime uyacak şekilde değiştirebilirsiniz. Tırnak işaretleri yalnızca dosya özelliğinde boşluk varsa gereklidir. Aynı tarih / zaman damgasını yeniden kullanmak istiyorsanız, bir değişkende saklamanız gerekir.

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

Bu, çıktının 2 basamaklı bir değer olmasını sağlar ... Çıkışı beğeninize göre yeniden düzenleyebilir ve tanılama bölümünün açıklamasını kaldırarak test edebilirsiniz. Zevk almak!

(Bunun çoğunu diğer forumlardan ödünç aldım ...)

:: ------------------ 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

Dosya adı olarak geçerli tarihe sahip bir dosya oluşturun (ör. 2008-11-08.dat)

echo hello > %date%.dat    

Geçerli tarihle ancak "-" olmadan (ör. 20081108.dat)

echo hello > %date:-=%.dat   

2

Belki bu yardımcı olabilir:

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

veya

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

Güzel bir Secko ... o% date% değeri aradığıma sahip gibi görünüyor. SET ifadesini açıklayabilirsiniz. $ D $ _set & $ t $ h $ h $ h tam olarak nedir
Eoin Campbell

1
set bir "SET değişken" ifadesidir. Tarih değişkeni $ d $ _ (gün + geri kalan) ve zaman değişkeni $ t $ h $ h $ h (zaman + ms) olduğunda. Bir dizi değişkenle nasıl yapılabileceğini göstermeye çalıştım, komut satırı olmadan iyi çalışabilir. Temel olarak bu tarih =% YYYY %% MM %% DD% ayarını yapmaya çalıştım ama burada Linux çalıştırıyorum ve komut dosyasını SciTE üzerinde derliyorum, bu yüzden çalışıp çalışmadığını bilmiyorum. İşe yaramazsa özür dilerim.
Secko

Eklemeyi unuttum, $ _ yeni satırdır.
Secko

1
Ayrıca, @prompt // $ d $ _ $ t $ h $ h $ h $ h $ h //
Secko

Bunun yerel ayardan bağımsız olmadığını da unutmayın. Tarih, benim durumumda DD.MM.YYYY (Almanca için) geçerli kültür ayarına göre biçimlendirilmiştir.
Hannobo

2

Geçerli zaman damgasını yazdırmak için küçük bir C programı oluşturdum (yerel ayarlar güvenli, kötü karakterler yok ...). Ardından, sonucu bir ortam değişkenine kaydetmek için FOR komutunu kullanıyorum:

:: 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"

İşte bir bağlantı:

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


2

Bu iş parçacığının eski olduğunu biliyorum ama bunu buraya eklemek istiyorum çünkü her şeyi anlamaya çalışmama çok yardımcı oldu ve temiz. Bununla ilgili güzel olan şey, her zaman çalışan bir toplu iş dosyası için onu bir döngüye koyabilmenizdir. Sunucu çalışma süresi kaydı falan. Zaten onu bunun için kullanıyorum. Umarım bu bir gün birine yardımcı olur.

@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%

Bu benim için yararlıydı, ancak bir ".cmd" dosyasında, "FreshTime" değişkenindeki iki nokta üst üste işaretleri "robocopy" cmdline'ımdaki bir dosya adı için kullanıldığında hatalara neden oldu: ERROR : Invalid Parameter #12 : "/LOG:C:\opt\Sync_08.10.2020_16:27:39.log"Düzeltme olarak bunun yerine çizgiler kullandım:set FreshTime=%hour%-%min%-%secs%
netdesignate

2

Mevcut yerel biçimi kolayca algılayabilir ve tarihi kendi biçiminizde alabilirsiniz, örneğin:

::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

Bunun eski bir gönderi olduğunu biliyorum, ancak FAR'ın daha basit bir cevabı var (belki de yalnızca pencerelerin yeni sürümlerinde işe yarıyor). Yalnızca tarih veya saati göstermek ve sizden bunu ayarlamanızı istememek için DATE ve TIME dos komutları için / t parametresini kullanın:

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

1

1) GNU tarihi ile birlikte gelen GNU çekirdek dosyalarını indirebilirsiniz.

2) Windows'ta tarih değiştirmeyi kolaylaştıran VBScript'i kullanabilirsiniz :

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

Komut dosyasını şu şekilde çalıştırın:

c:\test> cscript /nologo myscript.vbs

0

Bu, (benim) Alman yerel ayarıyla iyi çalışıyor, ihtiyaçlarınıza göre ayarlamak mümkün olmalı ...

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%Portekiz konumu için de çalışıyor! Yani YYYYAAGG
Fernando Fabreti

0

Dağıtım için büyük zip dosyaları için çeyrek saat kullanıyorum. Bu sayfadaki hiç kimse bundan daha önce bahsetmemişti, bu yüzden küçük senaryomu buraya koyacağım:

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"

Henüz gece yarısından sabah 5'e çeyrek saatlerini sıfırlamaz, ancak yine de bunu yapar, böylece birkaç çarpışma ile günde birkaç kez damgalı bir sürüm elde edebilirsiniz.

Umarım yardımcı olur.


0

Dosya adına zaman damgası eklemek için Martin'in önerisini küçük bir ince ayar ile kullandı:

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 için sonuç:

20191023_10-17-21-rsync2.log

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.