일괄 작업에서 파일 이름을 타임 스탬프로 만들기


90

매일 실행되는 일괄 작업이 있으며 파일을 픽업 폴더에 복사합니다. 또한 해당 파일의 사본을 가져 와서 파일 이름이있는 보관 폴더에 놓기를 원합니다.

 yyyy-MM-dd.log

Windows 일괄 작업에서이 작업을 수행하는 가장 쉬운 방법은 무엇입니까?

기본적으로이 Unix 명령에 해당하는 것을 찾고 있습니다.

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

Windows .bat 파일에서 원하는 형식의 날짜 문자열을 가져올 때 제안 된 솔루션만큼 나빠 보입니다. 솔직히 말해서, 자바, 루비, 펄 또는 다른 어떤 프로그래밍 언어가 머신에서 사용 가능한지 확인하고 5 초 동안 실행 파일을 만들어 원하는 것을 제공하십시오. 적절한 형식의 날짜를 얻기 위해 한 줄 이상의 코드를 보답하는 .bat 파일을 유지 관리하는 데 시간을 낭비하지 않을 것입니다.
99Sono

답변:


105
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

(방금 제가 작업했던 다른 작업에서 가져 왔습니다. 오래 전 일입니다. 왜 제가 원래 방식대로했는지 모르겠습니다.)
opello 2009-06-30

3
이것은 다른 로케일에서 중단됩니다. 제 경우에는 명령이 반환됩니다 2014-5.-01(일 때 2014-05-26). 따라서 이것을 포함하는 스크립트를 게시하는 경우 매우 조심하십시오!
amenthes

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

첫 번째 명령은 날짜와을 대체 소요 /로를 -, 시간과을 대체한다 :과를 -, 및 시간 형식 @ DATE로 콤바인을. 두 번째 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. 작동하면 답변을 업데이트하겠습니다.
다니엘 Sokolowski

1
이것은 로케일과 무관하지 않습니다. 08.06.2016@15-42-20,33.jpg독일어 노트북과 영어 노트북으로 돌아갑니다 Wed06-08-2016@15-43-45.89.jpg.
한노 보

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을 반환합니다.
한노 보

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

NET 스타일과 UNIX 스타일 모두에 대한 형식 옵션이있는에 대한 참조 get-date여기 입니다.


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%

좋은 Secko ... 그 % date % 값이 내가 찾고있는 것을 가지고있는 것 같습니다. 혹시라도 SET 문을 설명 할 수 있습니다. 정확히 $ d $ _set & $ t $ h $ h $ h
Eoin Campbell

1
set는 "SET 변수"문입니다. 날짜 변수는 $ d $ _ (일 + 나머지)이고 시간 변수는 $ t $ h $ h $ h (시간 + ms)입니다. 프롬프트 라인 없이도 잘 작동 할 수있는 변수 세트를 사용하여 수행 할 수있는 방법을 보여 주려고했습니다. 나는 기본적 으로이 set date = % YYYY %% MM %% DD %를 시도했지만 여기에서 Linux를 실행하고 SciTE에서 스크립트를 컴파일하므로 작동하는지 모르겠습니다. 작동하지 않으면 죄송합니다.
Secko

추가하는 것을 잊었습니다. $ _는 개행입니다.
Secko

1
@prompt // $ d $ _ $ t $ h $ h $ h $ h $ h $ h //도 시도해보십시오.
Secko

이것은 또한 로케일과 무관하지 않습니다. 날짜는 현재 문화 설정 (제 경우에는 DD.MM.YYYY (독일어))으로 형식이 지정됩니다.
Hannobo

2

현재 타임 스탬프를 출력하기 위해 작은 C 프로그램을 모았습니다 (로케일 안전, 나쁜 문자 없음 ...). 그런 다음 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"변수의 콜론이 "robocopy"cmdline에서 파일 이름에 사용될 때 오류를 일으켰지 만 저에게 유용했습니다 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

나는 이것이 오래된 게시물이라는 것을 알고 있지만 훨씬 더 간단한 대답이 있습니다 (아마도 최신 버전의 Windows에서만 작동 할 수도 있습니다). DATE 및 TIME dos 명령에 / t 매개 변수를 사용하여 날짜 또는 시간 만 표시하고 다음과 같이 설정하라는 메시지를 표시하지 않습니다.

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

1

1) GNU 날짜와 함께 제공되는 GNU coreutils 를 다운로드 할 수 있습니다.

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 시까 지 4 분의 1 시간이 제로 패드는 아니지만, 그래도 충돌이 거의없이 하루에 여러 번 스탬프 릴리스를 할 수 있습니다.

도움이되기를 바랍니다.


0

파일 이름에 타임 스탬프를 추가하기 위해 약간의 조정으로 Martin의 제안을 사용했습니다.

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.