배치 파일에서 날짜 및 시간을 사용하여 파일 이름 만들기


20

배치 파일에서 프로그램을 실행하고 있는데, 완료되면 MySQL 데이터베이스의 자동 백업을 수행합니다.

배치 파일에서 각 실행에 대해 다른 백업을 만들고 싶습니다. 그래서 역 추적 할 수 있습니다.

원하는 파일 이름은 gnucash_shockwave-20121128210344.sql (날짜 형식 YYYY-MM-DD-HH-MM-SS)입니다.

나는 시도했다 몇 가지 검색 좀 %DATE:~4%하고를 %Date.Year%하지만 난라는 오류가The system cannot find the specified path.

타임 스탬프 시도를 제거하면 스크립트가 정상적으로 작동하지만 이전 백업을 덮어 씁니다.

내가 말하는 코드 섹션은 다음과 같습니다.

@REM *** EXECUTION ***
echo. Starting backup...
SET timestamp %DATE:~-4%%DATE:~4,2%%DATE:~7,2%%TIME%
%mysqldir%\mysqldump -u %mysqluser% -p%mysqlpassword% -h %mysqlhost% -P %mysqlport% --databases --routines --verbose gnucash_shockwave > %BackupDir%\gnucash_shockwave-%timestamp%.sql

echo.------------------------------------------------------
echo. Backup complete!

어떤 제안?


귀하의 계정을 다시 연결했습니다. 로그인하여 자신의 게시물과 질문에 대한 답변에 의견을 달 수 있어야합니다.
slhck

slhck, lol 고마워요 무슨 일이 있었는지 궁금해서 스택 오버플로 lol에
없었다는

% date %를 % date로 교체 : ~ 6,4 %-% date : ~ 3,2 %-% date : ~ 0,2 % 작동
MagTun

답변:


28

날짜 및 시간 형식은 지역 및 언어 제어판 애플릿 에서 지정한 내용에 따라 다릅니다 .

다음 배치 파일 ( dd / mm / yyyyhh : mm : ss로 가정 )을 실행하고 필요에 따라 하위 문자열 추출 (: 및 ~ 문자 사용)을 수정하여 날짜 및 시간 문자열에서 올바른 부분을 가져 오십시오.

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,4%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%

부분 문자열 추출에 대한 자세한 내용은 set /?명령 프롬프트에 입력하거나이 페이지를 참조 하십시오 .


고마워, 나는 이것이 어떻게 작동하는지 이해한다고 생각한다. 나는 사무실에 있지 않지만 도착하여 다시 게시하자마자 시도 할 것입니다. 우리는 도움을 윈도우 8 감사를 사용하는
guyfromfl

내 위치와 언어로 인해 날짜의 문자열 위치를 조정해야했지만 그게 속임수였습니다! 대단히 감사합니다!
guyfromfl

로케일 독립적 날짜를 얻으려면 대신 wmic를 사용하십시오
phuclv

이 솔루션은 기계마다 다른 결과를 제공 할 수 있습니다.
Mehdi Dehghani

내가 날짜 출력 변경 뭔가를 생각하는, 내가 얻을 > echo yyyy = %DATE:~6,4%생산에 yyyy = /20/. 그러나 echo yyyy = %DATE:~10,4%입니다 yyyy = 2019.
teeks99

7

여기 나를 위해 일한 것이 있습니다.

Format - mmddyyyy_HHMMSS

echo %DATE% %TIME%

Date format = Thu 03/05/2015 15:48:26.22

echo mm = %date:~4,2%

echo dd = %date:~7,2%

echo yyyy = %date:~10,4%

echo Timestamp = %date:~4,2%%date:~7,2%%date:~10,4%_%time:~0,2%%time:~3,2%%time:~6,2%

Timestamp - 03052015_154013

3
슈퍼 유저에 오신 것을 환영합니다! 명령어의 기능에 대한 설명을 포함하도록 답변을 편집 해 주시겠습니까?
Excellll

당신은 잘못된 질문에 대답하고 있습니다. OP의 질문은 YYYYMMDD를 요청합니다. 이 답변은 MMDDYYYY를 제공합니다.
Scott

질문으로 스택에 와서 나를 위해 하루를 구하기 위해 기다리고있는 완벽한 답변을 얻는 것과 같은 것은 없습니다. 너무 많은 @abbs와 Excelll
clockwiseq

3

약간의 조정으로 나는 이것을 얻었다

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,8%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%
ECHO "TEST..." > test-%date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%.txt


결과:

"test-do_25_06-2015-22_21_51.txt" (Thursday_25th_June_2015-22:21.51)


이것이 다른 답변과 어떻게 다릅니 까?
suspectus

@suspectus : 앱스의 대답에서이 응답 다르다는 점 앱스의는 미국 지역 (즉, 로케일), 가정에 %DATE%~ Ddd MM/DD/YYYY,이 한 반면 곳 미국 이외의 지역을, 가정 %DATE%~ DD/MM/YYYY(요일없이)를. 그리고 이것은 이것이 잘못 되었다는 점에서 Karan의 대답과 다릅니다 . 질문은 YYYYMMDD를 요구합니다. 이 답변은 DD_MM–YYYY를 제공합니다.
스캇

2

지연이 유감입니다 ...

지역 설정에 관계없이 적절한 날짜를 얻는 유일한 신뢰할 수있는 방법은 foxidrive @의 솔루션입니다. /programming/11037831/filename-timestamp-in-windows-cmd-batch-script을

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause

1

나는 이것이 @Nick Rogers의 대답을 약간 향상 시킨다고 생각합니다.

예 : 독일어 위치 (de_DE)를 사용하면 10 시간 미만의 시간에 공백이 있습니다.

또한 나는 시간에 선행 0을 원했습니다. "echo-! ^ _ hh!-"는 "9"대신 "09"를 제공합니다.

더 나은 판독을 위해 코드를 두 조각으로 나눕니다. 이 예제는 더 많은 로케일과 일치해야합니다.

+ 보너스 : _ms = 밀리 초 또는 마지막 두 자리 숫자 (-;

말 : 때때로 HOUR는 탈출해야합니다. 내부 코드 참조

SETLOCAL
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion
@ECHO ON
@rem use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.
@rem works also with german standard format dd.mm.yyyy

echo ----- date -----
    echo _%date%_
    for /F "tokens=1-3 delims=.-/" %%i IN ("%date%") DO Set "_Y=%%i"& Set "_M=%%j"& Set "_D=%%k"
    @rem Switch the year and day if appropriate
    IF "xx%_D:~2%" == "xx" Set "_Y=%_D%"& Set "_D=%_Y%"
    set __date=%_Y%%_M%%_D%
    echo _%__date%_
echo ----- date -----

echo ----- time -----
    echo _%time%_
    for /F "tokens=1-4 delims=:," %%l IN ("%time%") DO Set "_tmp_hh=%%l"& Set "_mm=%%m"& Set "_ss=%%n"& Set "_ms=%%o"
    @rem add leading zero to hour if necessary
    if %_tmp_hh% LSS 10 (set _hh=^0%_tmp_hh:~1,1%) ELSE (set _hh=%time:~0,2%)
    @rem sometimes the HOUR needs to be escaped, like this
    echo - !^_hh! -
    set __time=%_hh%%_mm%%_ss%%_ms%
    echo _%__time%_
echo ----- time -----

    Set fullTime=%_Y%%_M%%_D%-%_hh%%_mm%%_ss%%_ms%
    echo _%fullTime%_
pause

출력 : echo fullTime = 15062018-10182821


0

가장 짧은 (가장 다재다능한) 대답은 세 줄의 코드 (주석 등 제외)가 포함 된 다음 TimeStamp.cmd 스크립트에 따른 것입니다 ...

@ECHO ON
@REM use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.

    for /F "tokens=1-6* delims=.:-/ " %%i IN ("%DATE% %TIME%") DO Set "YYYY=%%i"& Set "MM=%%j"& Set "DD=%%k"& Set "HH=%%l"& Set "MI=%%m"& Set "SS=%%n"

@REM Switch the year and day if appropriate

    IF NOT "X%DD:~2%" == "X" Set "YYYY=%DD%"& Set "DD=%YYYY%"

    Set "TimeStamp=%YYYY%%MM%%DD%%HH%%MI%%SS%"

배치 파일의 FOR 문에서 변수에 % 대신 %%를 사용해야함에 유의하십시오.

... 실행 수율 (빈 줄 및 주석 제거) ...

C:\>timestamp.cmd
C:\>for /F "tokens=1-6* delims=.:-/ " %i IN ("2018/03/02 11:17:43.35") DO Set "YYYY=%i"  & Set "MM=%j"  & Set "DD=%k"  & Set "HH=%l"  & Set "MI=%m"  & Set "SS=%n"
C:\>Set "YYYY=2018"  & Set "MM=03"  & Set "DD=02"  & Set "HH=11"  & Set "MI=17"  & Set "SS=43"
C:\>IF NOT "X" == "X" Set "YYYY=02"  & Set "DD=2018"
C:\>Set "TimeStamp=20180302111743"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.