Windows 명령 행 : 이름에 현재 날짜가있는 파일을 작성하십시오.


19

배치 스크립트에서 zip 파일을 만들려고합니다. archive_.zip과 같은 이름이 필요합니다.

불행히도 슬래시로 인해 날짜가 y / m / d와 같은 시스템에서는 작동하지 않습니다.

zip some_options "archive_%DATE%.zip"

%DATE%변수는 같은으로 확장

Mon 09/28/2009

gnuwin32 패키지에 액세스 할 수 있으므로 sed공백과 슬래시를 대시로 바꿀 수 있습니다. 문제는 sedzip 아카이브의 파일 이름을 생성하기 위해 출력을 어떻게 사용 합니까?

유닉스 (bash)에서, 백 쿼트를 사용하여 명령을 제자리에서 평가하고 다른 명령에서 출력을 사용할 수 있습니다.

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

Windows에서도 비슷한 기능이 있습니까?

또는 변수를 반환 값으로 설정 sed하고 파일 이름을 구성하는 데 사용할 수 있습니까?

답변:


27

다음을 사용하여 변수의 기호를 바꿀 수 있습니다.

set _date=%DATE:/=-%

1
이것은 깔끔한 트릭입니다!
— Cristi Diaconescu

추신 : 공간이나 다른 불쾌한 캐릭터를 제거하는 '한 줄짜리'방법이 있습니까? (각 캐릭터가 교체 할 3 번째 ... n 번째 임시 변수를 갖는 것과는 대조적으로)
— Cristi Diaconescu

죄송합니다 그런 것은없는 것 같습니다. 이를 위해서는 구문으로 대체해야합니다. NB : 이것은 배치 프로그래밍에 대한 훌륭한 참고 자료입니다. robvanderwoude.com/batchfiles.php
— Christopher

5
이것은 다음보다 훨씬 빠릅니다. %date:~-10,2%-%date:~-7,2%-%date:~-4,4% !
— Jess Stone

Jess Stone의 답변을 아무도 +1하지 않았습니다! 나에게서 +1!
— Arvo Bowen

5

나는 항상 사용합니다 :

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

그런 다음 CDate는 Sat02182012가됩니다. 더 정렬 가능하게 만들려면 CDate를 %% d-%% b-%% c로 설정하면 2012-02-18이됩니다.

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

날짜 / 시간 폴더 / 파일 친화적


4

나는 여기 비슷한 질문에 대한 답변을 게시했습니다 . harrymc의 답변에 여러 줄 대신 필드에서 날짜를 쪼개는 것이 한 줄로 이루어집니다.

흥미로운 부분은 다음과 같습니다.

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

그리고 경고는 여전히 관련이 있습니다.

경고 : 날짜 형식 (yyyymmdd = %% k %% j %% i)은 지역 설정에 따라 다릅니다. 프랑스어 날짜 형식 (dd / mm / yyyy)을 사용하기 때문에 "%% k %% j %% i"를 형식 (%% i = 일, %% j = 월, %% j = 년).

지역 설정이 미국 스타일 (mm / dd / yyyy)로 설정된 경우 "%% k %% i %% j"(%% i = 월, %% j = 일, %% j = 연도)를 사용해야합니다. .


3
zip some_options "archive_%date:/=-%.zip"

는 /=-대체 /마이너스 기호.


2

이 끔찍한 코드는 원하는 것과 같은 것을해야합니다.

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

파일 이름을 적절히 변경하면


1
괴물을 설명 할까? :)
— Cristi Diaconescu

기본적으로 날짜에서 비트를 자르고 파일 이름의 중간에 먹이는 것입니다. 에코를 수행하여 명령 줄에서 공포의 일부를 테스트하여 에코 할 수 있으므로 echo % date : ~ 6,4 %를 제공합니다. 년. 날짜와 시간을 하위 문자열로 묶는 것입니다.
— Col

흥미 롭군 안타깝게도 휴대 성이 좋지 않은 ...
— Cristi Diaconescu

불행하게도 하위 문자열을 사용할 때의 문제는 특정 날짜 형식에 의존하고 다르면 부풀려진다는 것입니다. yyyy-MM-dd를 사용하도록 설정된 날짜가 있으므로 내 컴퓨터에서 echo %date:~6,4%%date:~3,2%%date:~0,2%반환 9-289-20됩니다 (오늘은 2009-09-28입니다).
— Joshua

사실, 나는이 솔루션을 하나의 컴퓨터에서만 사용하므로 너무 큰 문제는 아닙니다.
— Col

2

귀하의 질문에 Windows 태그가 지정되어 있기 때문에 좋은 오래된 .bat 파일에서 작동하는이 솔루션을 발견했습니다.
"MMDDYYYY 형식으로 현재 날짜를 가져 오는 Windows 배치 파일 (.bat)" ,
아마도 귀하의 경우 에 맞출 수 있습니다 :


@REM Seamonkey의 빠른 날짜 배치 에 반향 (MMDDYYYY 형식)
@REM 설정 % date 변수
@REM 먼저 월, 일 및 연도를 mm, dd, yyyy 형식으로 구문 분석 한 다음 MMDDYYYY로 결합합니다.

FOR / F“TOKENS = 1 * DELIMS =”%% A IN ( 'DATE / T') DO CDATE = %% B
FOR / F“TOKENS = 1,2 eol = / DELIMS = /”%% A IN ( 'DATE / T') DO SET mm = %% B
FOR / F“토큰 = 1,2 DELIMS = / eol = /”%% A IN ( 'echo % CDATE %') DO SET dd = %% B
FOR / F“토큰 = 2,3 DELIMS = /”%% A IN ( 'echo % CDATE %') DO SET yyyy = %% Bv vSET 날짜 = % mm %% dd %% yyyy %

이것은 % date 변수를 MMDDYYYY 형식으로 오늘 날짜로 설정하는 것 외에는 스크립트에서 나중에 호출 할 수 있습니다.

편집은
더 나은 구문을 발견. 내 날짜가 오늘 "월 28/09/2009"인 경우 :
set day = % Date : ~ 0,2 %
set month = % Date : ~ 7,2 %
set year = % Date : ~ 10,4 %


2

gnuwin32-'date '와 결합 된 cmd.exe 버전 :

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

그래서 할 수 있는 적절한 대체 해! 당신이 저를 요구하는 경우 '에 대한'명령은 ... 하나 개의 이상한 구문
— 크리스티 Diaconescu

나는 그것을 할 수 없다고 주장하지 않았다 :) 어쨌든 전체 'cmd'물건은 미친 사람이다. 'for'cmd는 실제로 첫 번째 패스에서 행 (일명 '루핑')을 만든 다음 이렇게 만들어진 스크립트를 실행합니다.
— akira

1

cscript + vbasic 사용은 어떻습니까?

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

통해 전화

cscript /nologo zip_it.vbs

1

/ f "tokens = 1,2,3,4,5 delims = /."( 'date / T')의 %% a는 CDate = %% d-%% b-%% c를 설정합니다.

@echo 데이터 = % CDate %

이것은 현재 가장 흔한 년-월-일입니다


1

사용자가 지역 설정을 수정 한 경우 %DATE%또는 출력 중 하나를 사용하는 솔루션이 date /t중단 될 수 있습니다. 예를 들어, 나는 내 "간단한 날짜"형식을하기 위해 설정 한 "yyyy-MM-dd"나는 그래서, %DATE%동일 "2012-02-18"하고,date /t 같은 출력을 생성합니다. (이것은 Windows 7 용이며 이전 버전의 Windows와 동일하다고 가정합니다.)

배치 파일을 작성한 다음 실행하십시오.

GNU date명령을 사용할 수 있으므로 다음과 같이 할 수 있습니다.

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat 다음과 같은 내용이 포함됩니다.

zip some_options archive_2012-02-18.zip

이것은 tmp.bat현재 디렉토리에 작성 되며 이는 문제점 일 수 있습니다. 만드는 것이 더 나을 수 있습니다%TEMP%\tmp.bat . 또한 파일을 나중에 제거하지 않았습니다. 할만 큼 쉽습니다.

date +FORMAT형식 문자열 date과 유사하게 명령 의 출력 형식을 지정할 수 있습니다 printf. 자세한 내용 은 coreutils 날짜 설명서 를 참조하십시오. 형식에는 임의의 텍스트가 포함될 수 있으므로이 경우조차 사용할 필요가 없습니다 sed.


1

당신이 모든 사람의 비트를 합치면 당신에게 맞는 것을 얻습니다. 이것은 성능 모니터의 트리거에 대한 응답으로 실행중인 프로세스의 스냅 샷을 제공하기 위해 Windows 2003 시스템에 있습니다.

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

출력 파일은 분리 문자없이 하나의 문자열로 이름이 지정됩니다.


0
zip [...] archive_`echo %DATE% | tr / -`.zip

작동해야합니다.

반면에-아마도 당신은 date명령을 사용할 수 있습니다 (Windows를 모르겠습니다). 그렇다면 다음을 수행하십시오.

zip [...] archive_`date +'%Y-%m-%d'`.zip

백틱 트릭은 cmd.exe에서 작동하지 않습니다. 그리고 Windows 'date'명령은 형식을 처리 할 수 ​​없습니다 :(
— Cristi Diaconescu 12

-1

그것이 당신에게 적합한 지 확실하지 않지만 내 코드는

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt

OP는 파일 내용이 아닌 파일 이름 에 현재 날짜가있는 파일을 원합니다
— Jan Doggen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.