매일 실행되는 일괄 작업이 있으며 파일을 픽업 폴더에 복사합니다. 또한 해당 파일의 사본을 가져 와서 파일 이름이있는 보관 폴더에 놓기를 원합니다.
yyyy-MM-dd.log
Windows 일괄 작업에서이 작업을 수행하는 가장 쉬운 방법은 무엇입니까?
기본적으로이 Unix 명령에 해당하는 것을 찾고 있습니다.
cp source.log `date +%F`.log
매일 실행되는 일괄 작업이 있으며 파일을 픽업 폴더에 복사합니다. 또한 해당 파일의 사본을 가져 와서 파일 이름이있는 보관 폴더에 놓기를 원합니다.
yyyy-MM-dd.log
Windows 일괄 작업에서이 작업을 수행하는 가장 쉬운 방법은 무엇입니까?
기본적으로이 Unix 명령에 해당하는 것을 찾고 있습니다.
cp source.log `date +%F`.log
답변:
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
2014-5.-01
(일 때 2014-05-26
). 따라서 이것을 포함하는 스크립트를 게시하는 경우 매우 조심하십시오!
%time:~-11,2%-%time:~-8,2%-%time:~-5,2%
이것은 나를 위해 일했으며 파일 이름에 안전한 솔루션이었습니다 (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
밀리 초 전에 쉼표
set SAVESTAMP=%SAVESTAMP:,=.%.jpg
앞에 추가해보세요 echo
. 작동하면 답변을 업데이트하겠습니다.
08.06.2016@15-42-20,33.jpg
독일어 노트북과 영어 노트북으로 돌아갑니다 Wed06-08-2016@15-43-45.89.jpg
.
yyyy-MM-dd
들어 프랑스어 로케일 (프랑스) 만 주의 때문에 /
날짜에 나타납니다 :
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%
"_0:00"
(밑줄 문자는 공백)
다음은 로케일 독립적 솔루션입니다 (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 파일에 시간 구문 분석 스크립트를 숨기는 것은 추악한 세부 정보를 숨기고, 더 중요한 것은 오타를 피하는 좋은 방법입니다.
prompt $d $t
내 시스템에서 30.05.2016 15 : 35 : 56,93을 반환합니다.
나는 이것을 자주 사용하고 모든 것을 단일 복사 명령에 넣습니다. 다음은 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"
이렇게하면 출력이 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%
도움이 될 수 있습니다.
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%
현재 타임 스탬프를 출력하기 위해 작은 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"
다음은 링크입니다.
나는이 스레드가 오래되었다는 것을 알고 있지만 여기에 추가하고 싶습니다.이 모든 것을 이해하고 깨끗하게 이해하는 데 많은 도움이 되었기 때문입니다. 이것에 대한 좋은 점은 항상 실행되는 배치 파일의 루프에 넣을 수 있다는 것입니다. 서버 가동 시간 로그 또는 뭔가. 그것이 내가 어쨌든 그것을 사용하는 것입니다. 언젠가 누군가에게 도움이되기를 바랍니다.
@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%
ERROR : Invalid Parameter #12 : "/LOG:C:\opt\Sync_08.10.2020_16:27:39.log"
. 수정으로 대신 대시를 사용했습니다.set FreshTime=%hour%-%min%-%secs%
현재 로컬 형식을 간단히 감지하고 다음과 같은 형식으로 날짜를 가져올 수 있습니다.
::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
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
이것은 (내) 독일어 로케일과 잘 작동하며 필요에 맞게 조정할 수 있어야합니다.
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
배포를위한 큰 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 시간이 제로 패드는 아니지만, 그래도 충돌이 거의없이 하루에 여러 번 스탬프 릴리스를 할 수 있습니다.
도움이되기를 바랍니다.
파일 이름에 타임 스탬프를 추가하기 위해 약간의 조정으로 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