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

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

 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


답변

이것은 나를 위해 일했으며 파일 이름에 안전한 솔루션이었습니다 (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


답변

들어 프랑스어 로케일 (프랑스) 만 주의 때문에 /날짜에 나타납니다 :

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%


답변

다음은 로케일 독립적 솔루션입니다 (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 파일에 시간 구문 분석 스크립트를 숨기는 것은 추악한 세부 정보를 숨기고, 더 중요한 것은 오타를 피하는 좋은 방법입니다.


답변

찢어의 생각 때문에 %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여기 입니다.


답변

나는 이것을 자주 사용하고 모든 것을 단일 복사 명령에 넣습니다. 다음은 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%