การสร้างชื่อไฟล์เพื่อเป็นการประทับเวลาในชุดงาน


90

เรามีชุดงานที่ทำงานทุกวันและคัดลอกไฟล์ไปยังโฟลเดอร์รับสินค้า ฉันต้องการคัดลอกไฟล์นั้นและวางลงในโฟลเดอร์เก็บถาวรที่มีชื่อไฟล์

 yyyy-MM-dd.log

วิธีใดที่ง่ายที่สุดในการทำแบตช์ Windows

โดยพื้นฐานแล้วฉันกำลังมองหาคำสั่ง Unix ที่เทียบเท่า:

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

เมื่อได้รับ Date String ที่มีรูปแบบที่คุณต้องการในไฟล์. bat ของ windows ดูแย่พอ ๆ กับโซลูชันที่เสนอ พูดอย่างตรงไปตรงมาเพียงตรวจสอบภาษาโปรแกรมที่มีอยู่ในเครื่องเช่น java, ruby, perl หรืออย่างอื่นและสร้างไฟล์ปฏิบัติการ 5 วินาทีเพื่อให้สิ่งที่คุณต้องการ ฉันจะไม่เสียเวลาในการดูแลไฟล์. bat ที่ต้องใช้โค้ดมากกว่าหนึ่งบรรทัดเพื่อรับวันที่ด้วยรูปแบบที่เหมาะสม
99Sono

คำตอบ:


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

แต่ขึ้นอยู่กับสถานที่ ฉันไม่แน่ใจว่า%DATE%เป็นภาษาท้องถิ่นหรือไม่หรือขึ้นอยู่กับรูปแบบที่ระบุสำหรับวันที่สั้น ๆ ใน Windows

ต่อไปนี้เป็นวิธีแยกวันที่ปัจจุบันจากคำตอบนี้แต่ขึ้นอยู่กับ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
Eoin Campbell

1
หากคุณต้องการใช้ดัชนีเชิงบวกทั้งหมดคุณสามารถใช้:% DATE: ~ 10,4% -% DATE: ~ 4,2% -% DATE: ~ 7,2%
opello

(ฉันเพิ่งเอาสิ่งนี้มาจากสิ่งอื่นที่ฉันเคยทำมันนานมาแล้วและฉันไม่รู้ว่าทำไมฉันถึงทำแบบที่ฉันทำตอนแรก
หึหึ

3
สิ่งนี้จะทำลายในภาษาอื่น ในกรณีของฉันคำสั่งจะส่งกลับ2014-5.-01(เมื่อไหร่2014-05-26) ดังนั้นโปรดระวังให้มากหากคุณเผยแพร่สคริปต์ที่มีสิ่งนี้!
กำหนดการ

5
ใช้เป็นเวลา (ลบมิลลิวินาที): %time:~-11,2%-%time:~-8,2%-%time:~-5,2%
MRC

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

คำสั่งแรกใช้วันที่และแทนที่/ด้วย-ใช้เวลา 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คำสั่ง หากได้ผลฉันจะอัปเดตคำตอบ
Daniel Sokolowski

1
สิ่งนี้ไม่ได้ขึ้นอยู่กับสถานที่ ส่งคืน08.06.2016@15-42-20,33.jpgแล็ปท็อปเยอรมันและเครื่องWed06-08-2016@15-43-45.89.jpgภาษาอังกฤษของฉัน
Hannobo

5
แต่มันก็ยังไม่เป็นอิสระหรือสร้างรูปแบบที่ถูกต้อง (iso8601) ของyyyy-MM-dd
jeb

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%

ยอดเยี่ยม! อ่านยากเล็กน้อย แต่อนุญาตให้จัดรูปแบบผลลัพธ์ได้ตามที่คุณต้องการ
davitof

2
เยี่ยมมาก แต่ระวังถ้าคุณต้องการหลีกเลี่ยงตัวอักษรสีขาวเพราะ HOUR สามารถแสดงผลได้ 1 หลักดังนี้: "_0:00"(อักขระขีดเส้นใต้คือช่องว่าง)
daVe

1
ฉันได้รับ "log- / 18 /. 0.Sa- 9.16.txt" สำหรับคำตอบนี้
ledlogic

@ledlogic: ภาษาของคุณคืออะไร? คำตอบนี้สำหรับภาษาฝรั่งเศส
Aubin

1
ไม่ทำงานฉันได้รับสิ่งนี้ใน Windows 7 - log- / 05 / 0.We-18.13.tx
Sam B

10

นี่คือโซลูชันที่เป็นอิสระของโลแคล (คัดลอกไปยังไฟล์ชื่อ 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%

ฉันใส่สคริปต์. cmd ทั้งหมดของฉันไว้ในโฟลเดอร์เดียวกัน (% SCRIPTROOT%); สคริปต์ใด ๆ ที่ต้องการค่าวันที่ / เวลาจะเรียก SetDateTimeComponents.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%

ดังตัวอย่างที่แสดงคุณสามารถเรียก SetDateTimeComponents.cmd เมื่อใดก็ตามที่คุณต้องการอัปเดตค่าวันที่ / เวลา การซ่อนสคริปต์การแยกวิเคราะห์เวลาในไฟล์ SetDateTimeComponents.cmd ของตัวเองเป็นวิธีที่ดีในการซ่อนรายละเอียดที่น่าเกลียดและที่สำคัญกว่านั้นคือหลีกเลี่ยงการพิมพ์ผิด


2
ขออภัยนี่ไม่ใช่ภาษาที่ไม่ขึ้นกับภาษา: ใน Windows ภาษาฝรั่งเศสของฉันฉันได้รับ "18-2014- @ 13:14:43"
davitof

1
สามารถยืนยัน: ไม่ขึ้นกับโลแคล prompt $d $tส่งคืน 30.05.2016 15: 35: 56,93 ในระบบของฉัน
Hannobo

7

เนื่องจากความคิดที่จะฉีก%DATE%และ%TIME%แยกออกจากกันและทำให้กลับเข้าด้วยกันดูเหมือนจะเปราะบางที่สุดนี่คือทางเลือกที่ใช้ PowerShell oneliner:

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-style และ UNIX-style


6

ฉันมักจะใช้สิ่งนี้และรวมทุกอย่างไว้ในคำสั่งสำเนาเดียว ตัวอย่างต่อไปนี้คัดลอก example.txt เป็น example_YYYYMMDD_HHMMSS.txt และแน่นอนว่าคุณสามารถแก้ไขให้เหมาะกับรูปแบบที่คุณต้องการได้ คำพูดมีความจำเป็นก็ต่อเมื่อมีช่องว่างใน filespec หากคุณต้องการใช้วันที่ / เวลาเดียวกันซ้ำคุณจะต้องจัดเก็บไว้ในตัวแปร

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%

Nice one Secko ... ค่า% date% นั้นดูเหมือนจะมีสิ่งที่ฉันกำลังมองหา โอกาสใด ๆ ที่คุณสามารถอธิบายคำสั่ง SET $ d $ _set & $ t $ h $ h $ h คืออะไรกันแน่
Eoin Campbell

1
set เป็นคำสั่ง "SET variable" โดยที่ตัวแปรวันที่คือ $ d $ _ (วัน + ส่วนที่เหลือ) และตัวแปรเวลาคือ $ t $ h $ h $ h (time + ms) ฉันพยายามแสดงให้เห็นว่าสามารถทำได้ด้วยชุดของตัวแปรที่สามารถทำงานได้ดีโดยไม่ต้องมีบรรทัดพร้อมต์ โดยพื้นฐานแล้วฉันพยายามทำวันที่ตั้งค่านี้ =% YYYY %% MM %% DD% แต่ฉันใช้ Linux ที่นี่และรวบรวมสคริปต์บน SciTE ดังนั้นฉันจึงไม่รู้ว่ามันใช้งานได้หรือไม่ ขออภัยหากไม่ได้ผล
Secko

ลืมเพิ่ม $ _ ขึ้นบรรทัดใหม่
Secko

1
ลองดูด้วย @prompt // $ d $ _ $ t $ h $ h $ h $ h $ h $ h //
Secko

โปรดทราบว่าสิ่งนี้ไม่ได้ขึ้นอยู่กับโลแคลด้วย วันที่ถูกจัดรูปแบบเป็นการตั้งค่าวัฒนธรรมปัจจุบันในกรณีของฉัน DD.MM.YYYY (สำหรับภาษาเยอรมัน)
Hannobo

2

ฉันรวบรวมโปรแกรม C เล็กน้อยเพื่อพิมพ์การประทับเวลาปัจจุบัน (locale-safe ไม่มีอักขระที่ไม่ดี ... ) จากนั้นฉันใช้คำสั่ง 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 "robocopy" ของฉัน: ERROR : Invalid Parameter #12 : "/LOG:C:\opt\Sync_08.10.2020_16:27:39.log"ในการแก้ไขฉันใช้ขีดกลางแทน:set FreshTime=%hour%-%min%-%secs%
netdesignate

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

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่มีคำตอบที่ง่ายกว่า FAR (แม้ว่าอาจจะใช้ได้เฉพาะกับ windows เวอร์ชันใหม่กว่า) เพียงใช้พารามิเตอร์ / t สำหรับคำสั่ง DATE และ TIME เพื่อแสดงเฉพาะวันที่หรือเวลาและไม่แจ้งให้คุณตั้งค่าเช่นนี้:

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

1

1) คุณสามารถดาวน์โหลด GNU coreutilsซึ่งมาพร้อมกับวันที่ GNU

2) คุณสามารถใช้VBScriptซึ่งทำให้การจัดการวันที่ง่ายขึ้นใน 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

เรียกใช้สคริปต์เป็น:

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
Fernando Fabreti

0

สำหรับไฟล์ zip ขนาดใหญ่สำหรับการปรับใช้ฉันใช้เวลาสี่ชั่วโมง ไม่มีใครในหน้านี้เคยพูดถึงมาก่อนดังนั้นฉันจะใส่สคริปต์เล็ก ๆ ของฉันไว้ที่นี่:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.