현재 날짜를 YYYY-MM-DD 형식으로 Windows .bat 파일의 일부 변수에 저장하려면 어떻게합니까?
유닉스 쉘 아날로그 :
today=`date +%F`
echo $today
현재 날짜를 YYYY-MM-DD 형식으로 Windows .bat 파일의 일부 변수에 저장하려면 어떻게합니까?
유닉스 쉘 아날로그 :
today=`date +%F`
echo $today
답변:
다음을 사용하여 로케일에 구애받지 않는 방식으로 현재 날짜를 가져올 수 있습니다.
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
그런 다음 하위 문자열을 사용하여 개별 부분을 추출 할 수 있습니다.
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%
개별 부품을 포함하는 변수를 얻는 또 다른 방법은 다음과 같습니다.
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
변수 네임 스페이스를 오염시키는 대신 부분 문자열을 조작하는 것보다 훨씬 좋습니다.
현지 시간 대신 UTC가 필요한 경우 명령은 거의 동일합니다.
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
for /f
두 줄을 반환 하기 때문에 필요 합니다. 두 줄은 빈 줄입니다. set MyDate=
중간 에 사용하여 해결할 수 있습니다 . 나는 그것이 user2023861이 우연히 발견 한 것이라고 생각합니다.
Year
, Month
, Day
, Hour
, Minute
, Second
, Quarter
, WeekInMonth
,DayOfWeek
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%
잘못된 대답 : 월과 일 한 자리를 반환합니다 . 0 월과 일을 날짜 문자열로 채우는 2 자리 왼쪽을 얻는 방법은 무엇입니까?
배치 파일에서 표준 MS-DOS 명령을 사용하여이 작업을 수행하려면 다음을 사용할 수 있습니다.
FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C
나는 이것이 추가로 개선 될 수 있다고 확신하지만 이것은 날짜를 일 (dd), 월 (mm) 및 연도 (yyyy)에 대한 3 개의 변수로 제공합니다. 그런 다음 필요에 따라 나중에 배치 스크립트에서 사용할 수 있습니다.
SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%
이 질문에 대한 답변이 받아 들여 졌음을 이해하지만 WMI 콘솔을 사용하지 않고이를 달성하려는 많은 사람들이이 대체 방법을 높이 평가할 수 있으므로이 질문에 가치를 더하기를 바랍니다.
사용하다 date /T
명령 프롬프트에서 형식을 찾는 데 합니다.
날짜 형식 Thu 17/03/2016
이 다음과 같이 사용되는 경우 :
set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%
SELECT CONVERT(VARCHAR(16), GETDATE(), 112)
" 과 거의 비슷합니다 .
%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
시간 설정에 의존하지 않는 두 가지 방법이 더 있습니다 (둘 다 현지화와 무관 한 데이터 / 시간 가져 오기에서 가져옴 ). 또한 둘 다 요일을 가져 오며 어느 것도 관리자 권한이 필요하지 않습니다! :
MAKECAB- 모든 Windows 시스템에서 작동합니다 (빠르지 만 작은 임시 파일 생성) (foxidrive 스크립트) :
@echo off
pushd "%temp%"
makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
set "current-date=%%e-%%b-%%c"
set "current-time=%%d"
set "weekday=%%a"
)
del ~.*
popd
echo %weekday% %current-date% %current-time%
pause
ROBOCOPY - Windows XP 및 Windows Server 2003 의 기본 명령은 아니지만 Microsoft 사이트에서 다운로드 할 수 있습니다 . 그러나 Windows Vista 이상의 모든 기능에 내장되어 있습니다.
@echo off
setlocal
for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
set "dow=%%D"
set "month=%%E"
set "day=%%F"
set "HH=%%G"
set "MM=%%H"
set "SS=%%I"
set "year=%%J"
)
echo Day of the week: %dow%
echo Day of the month : %day%
echo Month : %month%
echo hour : %HH%
echo minutes : %MM%
echo seconds : %SS%
echo year : %year%
endlocal
그리고 다른 Windows 스크립트 언어를 사용하는 세 가지 방법이 더 있습니다. 예를 들어 주, 시간 (밀리 초) 등을 얻을 수 있습니다.
JScript / BATCH 하이브리드 (으로 저장해야 함 .bat
). JScript는 Windows 스크립트 호스트 의 일부로 Windows NT 이상의 모든 시스템에서 사용할 수 있습니다 ( 드문 경우지만 레지스트리를 통해 비활성화 할 수 있음 ).
@if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
@echo off
cscript //E:JScript //nologo "%~f0"
exit /b 0
*------------------------------------------------------------------------------*/
function GetCurrentDate() {
// Today date time which will used to set as default date.
var todayDate = new Date();
todayDate = todayDate.getFullYear() + "-" +
("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
("0" + todayDate.getMinutes()).slice(-2);
return todayDate;
}
WScript.Echo(GetCurrentDate());
VBScript / BATCH 하이브리드 ( 임시 파일을 사용하지 않고 배치 파일 내에 VBScript를 포함하고 실행할 수 있습니까? ) jscript와 동일한 경우이지만 하이브리드 화는 그렇게 완벽하지 않습니다.
:sub echo(str) :end sub
echo off
'>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
'& echo current date:
'& cscript /nologo /E:vbscript "%~f0"
'& exit /b
'0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
'1 = vbLongDate - Returns date: weekday, monthname, year
'2 = vbShortDate - Returns date: mm/dd/yy
'3 = vbLongTime - Returns time: hh:mm:ss PM/AM
'4 = vbShortTime - Return time: hh:mm
WScript.echo Replace(FormatDateTime(Date, 1), ", ", "-")
PowerShell-.NET 이있는 모든 컴퓨터에 설치할 수 있습니다. Microsoft ( v1 , v2 및 v3 (Windows 7 이상에만 해당)) 에서 다운로드 할 수 있습니다 . Windows 7 / Win2008 이상의 모든 형식에 기본적으로 설치됩니다.
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
자체 컴파일 된 jscript.net/batch (.NET이없는 Windows 시스템을 본 적이 없으므로 이식성이 매우 좋다고 생각합니다) :
@if (@X)==(@Y) @end /****** silent line that start jscript comment ******
@echo off
::::::::::::::::::::::::::::::::::::
::: Compile the script ::::
::::::::::::::::::::::::::::::::::::
setlocal
if exist "%~n0.exe" goto :skip_compilation
set "frm=%SystemRoot%\Microsoft.NET\Framework\"
:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
if exist "%%v\jsc.exe" (
rem :: the javascript.net compiler
set "jsc=%%~dpsnfxv\jsc.exe"
goto :break_loop
)
)
echo jsc.exe not found && exit /b 0
:break_loop
call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
::::::::::::::::::::::::::::::::::::
::: End of compilation ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation
"%~n0.exe"
exit /b 0
****** End of JScript comment ******/
import System;
import System.IO;
var dt=DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
Logman 이것은 년과 요일을 가져올 수 없습니다. 비교적 느리고 임시 파일도 생성하며 logman이 로그 파일에 기록한 타임 스탬프를 기반으로하며 Windows XP 이상에서 모든 작업을 수행합니다. 아마 저를 포함하여 누구도 사용하지 않을 것입니다. 그러나 그것은 또 하나의 방법입니다 ...
@echo off
setlocal
del /q /f %temp%\timestampfile_*
Logman.exe stop ts-CPU 1>nul 2>&1
Logman.exe delete ts-CPU 1>nul 2>&1
Logman.exe create counter ts-CPU -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
Logman.exe start ts-CPU 1>nul 2>&1
Logman.exe stop ts-CPU >nul 2>&1
Logman.exe delete ts-CPU >nul 2>&1
for /f "tokens=2 delims=_." %%t in ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
echo %timestamp%
echo MM: %timestamp:~0,2%
echo dd: %timestamp:~2,2%
echo hh: %timestamp:~4,2%
echo mm: %timestamp:~6,2%
endlocal
exit /b 0
나는 Joey의 방법을 정말 좋아했지만 조금 더 확장 할 것이라고 생각했습니다.
이 접근 방식에서는 코드를 여러 번 실행할 수 있으며 이전 날짜 값이 이미 정의되어 있기 때문에 "고착"되는 것에 대해 걱정할 필요가 없습니다.
이 배치 파일을 실행할 때마다 ISO 8601 호환 날짜 및 시간 표현이 출력됩니다.
FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%
이 버전에서는 레이블이 중복 될 수 있으므로 동일한 코드를 파일의 여러 위치에 복사 / 붙여 넣기하지 않도록주의해야합니다. 각 사본에 대해 별도의 레이블을 갖거나이 코드를 자체 배치 파일에 넣고 필요할 때마다 소스 파일에서 호출 할 수 있습니다.
@ProVi의 답변에 따라 필요한 형식에 맞게 변경하십시오.
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
돌아올 것이다
yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11
수정 @Jeb 주석에 따라 위의 시간 형식은 DATE / T 명령이 반환되는 경우에만 작동합니다.
ddd dd/mm/yyyy
Thu 17/09/2015
로케일에 맞게 쉽게 편집 할 수 있지만 관련 % DATE % 환경 변수가 반환 한 문자열의 각 문자에 대한 인덱싱을 사용하여 필요한 문자열 부분을 추출 할 수 있습니다.
예. % DATE ~ 10,4 %를 사용하면 DATE 환경 변수가 확장 된 다음 확장 된 결과의 11 번째 (오프셋 10) 문자에서 시작하는 4 자만 사용됩니다.
예를 들어 미국 스타일 날짜를 사용하는 경우 다음이 적용됩니다.
ddd mm/dd/yyyy
Thu 09/17/2015
echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11
이것 좀 봐 ..
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 "MS=%dt:~15,3%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
Python이 설치되어 있으면 다음을 수행 할 수 있습니다.
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"
필요에 따라 형식 문자열을 쉽게 조정할 수 있습니다.
python -c "import datetime;print(datetime.date.today())"
의 __str__
메서드가를 date
호출 하기 때문에 단순화 할 수 있습니다 isoformat()
.
PowerShell을 사용하고 루프를 사용하여 출력을 환경 변수로 리디렉션 할 수 있습니다.
명령 줄 ( cmd
)에서 :
for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%a
echo %td%
2016-25-02+17:25
배치 파일에서 다음 %a
과 같이 이스케이프 할 수 있습니다 %%a
.
for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%%a
FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a
하므로 월에는 대문자 MM을 사용하고 리터럴 문자를 이스케이프하려면 백 슬래시를 사용하십시오.
날짜 및 시간 형식은 위치 별 정보이므로 % date % 및 % time % 변수에서 검색하려면 형식 변환을 고려하여 문자열을 구문 분석하는 데 추가 노력이 필요합니다. 좋은 아이디어는 API를 사용하여 데이터 구조를 검색하고 원하는대로 구문 분석하는 것입니다. WMIC는 좋은 선택입니다. 아래 예에서는 Win32_LocalTime을 사용 합니다. Win32_CurrentTime 또는 Win32_UTCTime을 사용할 수도 있습니다 .
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%x in ('wmic path Win32_LocalTime get /format:list ^| findstr "="') do set %%x
set yyyy=0000%Year%
set mmmm=0000%Month%
set dd=00%Day%
set hh=00%Hour%
set mm=00%Minute%
set ss=00%Second%
set ts=!yyyy:~-4!-!mmmm:~-2!-!dd:~-2!_!hh:~-2!:!mm:~-2!:!ss:~-2!
echo %ts%
ENDLOCAL
결과 :
2018-04-25_10 : 03 : 11
이것은 시간을 포함하고 부분을 0으로 채우는 Joey의 대답의 확장입니다.
예를 들어 결과는 2019-06-01_17-25-36이됩니다. 또한 이것은 UTC 시간입니다.
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set Month=0%Month%
set Month=%Month:~-2%
set Day=0%Day%
set Day=%Day:~-2%
set Hour=0%Hour%
set Hour=%Hour:~-2%
set Minute=0%Minute%
set Minute=%Minute:~-2%
set Second=0%Second%
set Second=%Second:~-2%
set TimeStamp=%Year%-%Month%-%Day%_%Hour%-%Minute%-%Second%
신뢰할 수있는 솔루션 (Windows의 지역 설정에 의존하지 않음)을 얻기 위해 10 ~ 30 분의 일회성 투자에 신경 쓰지 않는다면 계속 읽으십시오.
마음을 자유롭게합시다. 이처럼 보이도록 스크립트를 단순화 하시겠습니까? (LOG_DATETIME 변수를 설정한다고 가정)
FOR /F "tokens=* USEBACKQ" %%F IN (`FormatNow "yyyy-MM-dd"`) DO (
Set LOG_DATETIME=%%F
)
echo I am going to write log to Testing_%LOG_DATETIME%.log
할 수 있습니다. C # .NET으로 FormatNow.exe를 빌드하고 PATH에 추가하기 만하면됩니다.
노트:
혜택:
Visual Studio 2010으로 빌드 한 FormatNow.exe의 소스 코드 (알 수없는 악성 프로그램을 다운로드 할 위험을 피하기 위해 직접 빌드하는 것을 선호합니다). 아래 코드를 복사하여 붙여넣고 프로그램을 한 번만 빌드하면 향후 모든 용도에 사용할 수있는 신뢰할 수있는 날짜 포맷터를 사용할 수 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace FormatNow
{
class Program
{
static void Main(string[] args)
{
try
{
if (args.Length < 1)
{
throw new ArgumentException("Missing format");
}
string format = args[0];
Console.Write(DateTime.Now.ToString(format, CultureInfo.InvariantCulture.DateTimeFormat));
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
일반적으로 복잡한 논리를 다룰 때 매우 작은 프로그램을 빌드하고 대신 배치 스크립트 변수로 출력을 다시 캡처하는 프로그램을 호출하여 더 간단하게 만들 수 있습니다. 우리는 학생이 아니며 문제를 해결하기 위해 배치 스크립트 전용 규칙을 따르도록 요구하는 시험을 치르지 않습니다. 실제 작업 환경에서는 모든 (법적) 방법이 허용됩니다. 많은 간단한 작업에 대한 해결 방법이 필요한 Windows 배치 스크립트의 열악한 기능을 계속 고수해야하는 이유는 무엇입니까? 작업에 잘못된 도구를 사용해야하는 이유는 무엇입니까?