Tạo tên tệp làm dấu thời gian trong công việc hàng loạt


90

Chúng tôi có một công việc hàng loạt chạy hàng ngày và sao chép một tệp vào một thư mục nhận. Tôi cũng muốn lấy một bản sao của tệp đó và thả vào thư mục lưu trữ với tên tệp

 yyyy-MM-dd.log

Cách dễ nhất để thực hiện việc này trong công việc hàng loạt của Windows là gì?

Về cơ bản tôi đang tìm kiếm một lệnh tương đương với lệnh Unix này:

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

Khi tạo Chuỗi ngày với định dạng bạn muốn trong các tệp .bat của windows trông tệ như các giải pháp được đề xuất. Thành thật mà nói, chỉ cần kiểm tra ngôn ngữ lập trình nào có sẵn trên máy, chẳng hạn như java, ruby, perl hoặc thứ gì đó khác và tạo 5 giây thực thi để cung cấp cho bạn những gì bạn muốn. Tôi sẽ không lãng phí thời gian để duy trì tệp .bat yêu cầu nhiều hơn một dòng mã để xác định ngày tháng với định dạng thích hợp.
99Sono

Câu trả lời:


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

Nhưng nó phụ thuộc vào ngôn ngữ. Tôi không chắc liệu %DATE%có được bản địa hóa hay không hay phụ thuộc vào định dạng được chỉ định cho ngày ngắn trong Windows.

Đây là một cách không phụ thuộc vào ngôn ngữ để trích xuất ngày hiện tại từ câu trả lời này , nhưng nó phụ thuộc vào WMICFOR /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
Cần phải thực hiện một chút với các chỉ số nhưng điều này dường như đã thực hiện được thủ thuật. (mặc dù không hoàn toàn chắc chắn tôi hiểu logic chỉ số trừ)% DATE: ~ -4% -% DATE: ~ -7, -5% -% DATE: ~ -10, -8% .log
Eoin Campbell

1
Nếu bạn muốn sử dụng tất cả các chỉ số dương, bạn có thể sử dụng:% DATE: ~ 10,4% -% DATE: ~ 4,2% -% DATE: ~ 7,2%
opello

(Tôi chỉ mất từ cái gì khác tôi đã làm việc trên, đó là một thời gian dài trước đây, và tôi không có ý tưởng tại sao tôi đã làm nó theo cách tôi đã làm ban đầu, heh.)
opello

3
Điều này không phá vỡ các ngôn ngữ khác. Trong trường hợp của tôi, lệnh trả về 2014-5.-01(khi nó sẽ như vậy 2014-05-26). Vì vậy, hãy rất cẩn thận, nếu bạn xuất bản các tập lệnh có chứa điều này!
amenthes

5
Sử dụng cái này cho thời gian (loại bỏ mili giây): %time:~-11,2%-%time:~-8,2%-%time:~-5,2%
MRC

48

Điều này phù hợp với tôi và là một giải pháp an toàn cho tên tệp (mặc dù nó tạo ra định dạng 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

Lệnh đầu tiên lấy DATE và thay thế /bằng -, lấy TIME và thay thế :bằng -và kết hợp chúng thành định dạng DATE @ TIME. Câu setlệnh thứ hai loại bỏ bất kỳ khoảng trắng nào và câu lệnh thứ ba setthay thế ,bằng .và nối .jpgphần mở rộng.

Đoạn mã trên được sử dụng trong một đoạn script nhỏ để lấy hình ảnh từ Camera IP an ninh để xử lý thêm:

: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

sản lượng trên giao diện điều khiển của tôi là 10-12-2014@14-22-59,44.jpgvới một dấu phẩy trước khi mili giây
BeNdErR

1
Hãy thử thêm vào set SAVESTAMP=%SAVESTAMP:,=.%.jpgtrước echocâu lệnh. Nếu điều đó hoạt động, tôi sẽ cập nhật câu trả lời.
Daniel Sokolowski

1
Điều này không phụ thuộc vào ngôn ngữ. Trả 08.06.2016@15-42-20,33.jpgvề máy tính xách tay tiếng Đức và máy tính xách tay Wed06-08-2016@15-43-45.89.jpgtiếng Anh của tôi.
Hannobo

5
Nhưng nó vẫn không độc lập về ngôn ngữ cũng như không tạo ra định dạng chính xác (iso8601) củayyyy-MM-dd
jeb

1
Đó là gây phiền nhiễu mà dòng đầu tiên vẫn tuyên bố đó là miền địa phương độc lập, chỉ để nhìn thấy nó không phải là sau khi thử ra ...
m3tikn0b

16

CHỈ Đối với Ngôn ngữ Pháp (Pháp) , hãy cẩn thận vì /xuất hiện trong ngày:

echo %DATE%
08/09/2013

Đối với vấn đề của chúng tôi về tệp nhật ký, đây là đề xuất của tôi CHỈ dành cho Ngôn ngữ Pháp :

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%

Thông minh! Hơi khó đọc, nhưng nó cho phép định dạng đầu ra như bạn muốn.
davitof

2
Tuyệt vời nhưng hãy cẩn thận nếu bạn muốn tránh các ký tự trắng vì GIỜ có thể được 1 chữ số render như thế: "_0:00"(char gạch dưới là một không gian)
Dave

1
Tôi nhận được "log- / 18 /. 0.Sa- 9.16.txt" cho câu trả lời này.
ledlogic

@ledlogic: ngôn ngữ của bạn là gì? Câu trả lời này dành cho ngôn ngữ Pháp.
Aubin

1
KHÔNG hoạt động Tôi nhận được điều này trên Windows 7 - log- / 05 /. 0.We-18.13.tx
Sam B

10

Đây là một giải pháp độc lập về ngôn ngữ (sao chép vào tệp có tên SetDateTimeComponents.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%

Tôi đặt tất cả các tập lệnh .cmd của mình vào cùng một thư mục (% SCRIPTROOT%); bất kỳ tập lệnh nào cần giá trị ngày / giờ sẽ gọi SetDateTimeComponents.cmd như trong ví dụ sau:

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%

Như ví dụ cho thấy, bạn có thể gọi SetDateTimeComponents.cmd bất cứ khi nào bạn cần cập nhật các giá trị ngày / giờ. Ẩn tập lệnh phân tích thời gian trong tệp SetDateTimeComponents.cmd của riêng nó là một cách hay để ẩn các chi tiết xấu và quan trọng hơn là tránh lỗi chính tả.


2
xin lỗi, đây không phải là miền địa phương độc lập: trên Windows tiếng Pháp của tôi, tôi nhận được "18 -2014- @ 13:14:43"
davitof

1
Có thể xác nhận: không phụ thuộc ngôn ngữ. prompt $d $ttrả về 30.05.2016 15: 35: 56,93 trên hệ thống của tôi.
Hannobo

7

Bởi vì ý tưởng xé %DATE%%TIME%tách và trộn chúng lại với nhau dường như rất mong manh, đây là một giải pháp thay thế sử dụng oneliner powershell:

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

Tham khảo cho get-dateở đây , với các tùy chọn định dạng cho cả kiểu .NET và kiểu UNIX.


6

Tôi thường xuyên sử dụng điều này và đặt mọi thứ vào một lệnh sao chép duy nhất. Sau đây sao chép example.txt dưới dạng example_YYYYMMDD_HHMMSS.txt và tất nhiên bạn có thể sửa đổi nó cho phù hợp với định dạng ưa thích của mình. Các dấu ngoặc kép chỉ cần thiết nếu có bất kỳ khoảng trắng nào trong tệp tin. Nếu bạn muốn sử dụng lại chính xác ngày / dấu thời gian, bạn cần lưu trữ nó trong một biến.

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

Điều này sẽ đảm bảo rằng đầu ra là giá trị 2 chữ số ... bạn có thể sắp xếp lại đầu ra theo ý muốn của mình và kiểm tra bằng cách bỏ nhận xét phần chẩn đoán. Thưởng thức!

(Tôi đã mượn rất nhiều thứ này từ các diễn đàn khác ...)

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

Tạo tệp với ngày hiện tại làm tên tệp (ví dụ: 2008-11-08.dat)

echo hello > %date%.dat    

Với ngày hiện tại nhưng không có "-" (ví dụ: 20081108.dat)

echo hello > %date:-=%.dat   

2

Có thể điều này có thể giúp:

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

hoặc là

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

Tuyệt vời Secko ... giá trị% date% đó dường như có thứ tôi đang tìm. Bất kỳ cơ hội nào bạn có thể giải thích câu lệnh SET. Vậy chính xác là $ d $ _set & $ t $ h $ h $ h
Eoin Campbell

1
set là một câu lệnh "SET biến". Trong đó biến ngày là $ d $ _ (ngày + phần còn lại) và biến thời gian là $ t $ h $ h $ h (thời gian + ms). Tôi đã cố gắng chỉ ra cách nó có thể được thực hiện với một tập hợp các biến mà nó có thể hoạt động tốt mà không cần dòng nhắc. Về cơ bản, tôi đã cố gắng thực hiện ngày đặt này =% YYYY %% MM %% DD% nhưng tôi đang chạy Linux ở đây và biên dịch tập lệnh trên SciTE nên tôi không biết liệu nó có hoạt động hay không. Xin lỗi nếu nó không hoạt động.
Secko

Quên thêm, $ _ là dòng mới.
Secko

1
Cũng cố gắng, @prompt // $ d $ _ $ t $ h $ h $ h $ h $ h $ h //
Secko

Lưu ý rằng điều này cũng không phụ thuộc vào ngôn ngữ. Ngày được định dạng theo cài đặt văn hóa hiện tại, trong trường hợp của tôi là DD.MM.YYYY (đối với tiếng Đức).
Hannobo

2

Tôi tập hợp một chương trình C nhỏ để in ra dấu thời gian hiện tại (an toàn về ngôn ngữ, không có ký tự xấu ...). Sau đó, tôi sử dụng lệnh FOR để lưu kết quả trong một biến môi trường:

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

Đây là một liên kết:

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


2

Tôi biết chủ đề này đã cũ nhưng tôi chỉ muốn thêm điều này ở đây vì nó đã giúp tôi rất nhiều cố gắng tìm ra tất cả và sạch sẽ. Điều thú vị về điều này là bạn có thể đặt nó trong một vòng lặp cho một tệp hàng loạt luôn chạy. Nhật ký thời gian hoạt động của máy chủ hoặc thứ gì đó. Đó là những gì tôi sử dụng nó cho dù sao. Tôi hy vọng điều này sẽ giúp ai đó một ngày nào đó.

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

Điều này rất hữu ích cho tôi, mặc dù trong tệp ".cmd", dấu hai chấm trong biến "FreshTime" đã gây ra lỗi khi được sử dụng cho tên tệp trong cmdline "robocopy" của tôi: ERROR : Invalid Parameter #12 : "/LOG:C:\opt\Sync_08.10.2020_16:27:39.log"Để sửa lỗi, tôi đã sử dụng dấu gạch ngang thay thế:set FreshTime=%hour%-%min%-%secs%
netdesignate

2

Bạn chỉ có thể phát hiện định dạng cục bộ hiện tại và có thể lấy ngày ở định dạng của mình, ví dụ:

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

Tôi biết đây là một bài viết cũ, nhưng có một câu trả lời FAR đơn giản hơn (mặc dù có thể nó chỉ hoạt động trong các phiên bản windows mới hơn). Chỉ cần sử dụng tham số / t cho các lệnh DATE và TIME dos để chỉ hiển thị ngày hoặc giờ và không nhắc bạn đặt nó, như sau:

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

1

1) Bạn có thể tải xuống các lõi GNU đi kèm với ngày GNU

2) bạn có thể sử dụng VBScript , giúp thao tác ngày tháng dễ dàng hơn trong Windows:

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

Chạy tập lệnh dưới dạng:

c:\test> cscript /nologo myscript.vbs

0

Điều này hoạt động tốt với ngôn ngữ Đức (của tôi), nên có thể điều chỉnh nó theo nhu cầu của bạn ...

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%cũng hoạt động cho địa điểm Bồ Đào Nha! Ý tôi là YYYYMMDD
Fernando Fabreti

0

Đối với các tệp zip lớn để triển khai, tôi sử dụng một phần tư giờ. Không ai khác trên trang này đã đề cập đến nó trước đây, vì vậy tôi sẽ đặt kịch bản nhỏ của mình ở đây:

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"

Nó chưa giảm số giờ một phần tư từ nửa đêm đến 5 giờ sáng, nhưng nó vẫn giúp bạn có thể có một bản phát hành được đóng dấu nhiều lần trong ngày với một vài va chạm.

Hy vọng rằng sẽ giúp.


0

đã sử dụng gợi ý của Martin với một chút tinh chỉnh để thêm dấu thời gian vào tên tệp:

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

Vào lúc 10:17:21 23/10/2019 Kết quả là:

20191023_10-17-21-rsync2.log

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.