如何在Windows命令行上获取当前的date时间,以适合的格式在文件名中使用?

更新:现在是2016年,我将使用PowerShell,除非有一个非常引人注目的向后兼容的原因,尤其是因为使用date的区域设置问题。 请参阅@ npocmaka的https://stackoverflow.com/a/19799236/8479


什么是Windows命令行语句我可以用它来获取当前date时间格式,我可以把它放在一个文件名?

我想要一个.bat文件,将当前date和时间作为名称的一部分压缩到一个存档中,例如Code_2008-10-14_2257.zip 。 有没有简单的方法可以做到这一点,独立于机器的区域设置?

我真的不介意date格式,最好是年月日,但任何简单的事情都可以。

到目前为止,我已经得到了这个,在我的机器上给我Tue_10_14_2008_230050_91

 rem Get the datetime in a format that can go in a filename. set _my_datetime=%date%_%time% set _my_datetime=%_my_datetime: =_% set _my_datetime=%_my_datetime::=% set _my_datetime=%_my_datetime:/=_% set _my_datetime=%_my_datetime:.=_% rem Now use the timestamp by in a new ZIP file name. "d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code 

我可以忍受这一点,但似乎有点笨重。 理想情况下,它会更简短,并具有前面提到的格式。

我正在使用Windows Server 2003和Windows XP Professional。 我不想安装额外的实用程序来实现这一点(虽然我知道有一些会做不错的date格式)。

请参阅Windowsbatch file(.bat)以MMDDYYYY格式获取当前date

 @echo off For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b) echo %mydate%_%mytime% 

如果你更喜欢24小时/军事格式的时间,你可以用这个replace第二个FOR行:

 For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) 

C:>。\ date.bat
2008-10-14_0642

如果你想要独立于区域日/月顺序的date,可以使用“WMIC os GET LocalDateTime”作为源,因为它是按照ISO顺序:

 @echo off for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6% echo Local date is [%ldt%] 

C:> TEST.CMD
当地date是[2012-06-19 10:23:47.048]

区域独立的date时间parsing

%DATE%dir命令的输出格式是区域相关的,因此既不健壮也不聪明。 date.exe ( UnxUtils的一部分)以任何可想象的格式提供任何date和时间信息。 您也可以使用date.exe从任何文件中提取date/时间信息。

例子:(在cmd脚本中使用%%而不是%)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18时55分03秒

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503:任何文字

date.exe +"Text: %y/%m/%d-any text-%H.%M"
文字:09/12 / 22-任何文字-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22“18:55:03”`

来自参考文件的date/时间信息:
date.exe -rc:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

在CMD脚本中使用它获取年,月,日,时间信息:

 for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n 

在CMD脚本中使用它来获取任何所需格式的时间戳:

 for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i 

从任何参考文件中提取date/时间信息。

 for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n 

添加到文件的date/时间信息:

 for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt 

date.exe是不需要安装的免费GNU工具的一部分 。

注意:将date.exe复制到searchpath中的任何目录可能会导致其他脚本失败,使用Windows内置date命令。

还有两种不依赖于时间设置的方法(都取自:如何从本地化获取数据/时间独立性:) 。 而且都得到一周的一天,他们都不需要pipe理员权限!

  1. MAKECAB – 将在每个Windows系统上工作(快速,但创build一个小临时文件)(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 

    有关get-date函数的更多信息 。

  2. 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脚本语言的方法。 他们会给你更多的灵活性,例如你可以得到一年的一周,时间以毫秒为单位等等。

  3. JScript /批量混合(需要保存为.bat )。 作为Windows Script Host的一部分,JScript在每个NT和更高版本的系统上都可用( 虽然可以通过registry来禁用,但这种情况很less见 ):

     @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()); 
  4. VSCRIPT / BATCH混合( 可以在batch file中embedded和执行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),", ","-") 
  5. PowerShell – 可以安装在每台拥有.NET的计算机上 – 从Microsoft下载( v1 , v2 , v3 (仅适用于Windows 7及更高版本))。 它默认安装在Windows 7 / Windows Server 2008及更高版本的所有设备上:

     C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}" 

    要从batch file中使用它:

     for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%# 
  6. 自编的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")); 
  7. Logman这不能得到星期几和星期几。 这是相对较慢,也创build一个临时文件,并基于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 
  8. WMIC的另外一种方法是给出每年的星期和星期几,但不是毫秒(以毫秒为单位检查foxidrive的答案):

     for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@ echo %day% echo %DayOfWeek% echo %hour% echo %minute% echo %month% echo %quarter% echo %second% echo %weekinmonth% echo %year% 
  9. 使用TYPEPERF尽一切努力来快速和兼容不同的语言设置,并尽可能快:

     @echo off setlocal :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=") for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=") set "mon=" for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do ( if not defined mon ( for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do ( set mon=%%a set date=%%b set year=%%c set hour=%%d set minute=%%e set sec=%%f set ms=%%g ) ) ) echo %year%.%mon%.%date% echo %hour%:%minute%:%sec%.%ms% endlocal 
  10. MSHTA允许调用JavaScript方法,类似于上面#3所示的JScript方法。 请记住,涉及月份值的JavaScriptdate对象属性编号从0到11,而不是1到12.所以9的值意味着10月。

     <!-- : Batch portion @echo off setlocal for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I" rem Display all variables beginning with "now." set now. goto :EOF end batch / begin HTA --> <script> resizeTo(0,0) var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1), now = new Date(), props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes', 'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay', 'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth', 'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString', 'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'], output = []; for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())} close(fso.Write(output.join('\n'))); </script> 

这里是alt.msdos.batch.nt的一个变体,独立于本地工作。

把它放在一个文本文件中,例如getDate.cmd

 -----------8<------8<------------ snip -- snip ----------8<------------- :: Works on any NT/2k machine independent of regional date settings @ECHO off SETLOCAL ENABLEEXTENSIONS if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4) for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do ( for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do ( set '%%a'=%%i set '%%b'=%%j set '%%c'=%%k)) if %'yy'% LSS 100 set 'yy'=20%'yy'% set Today=%'yy'%-%'mm'%-%'dd'% ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'% ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%] :EOF -----------8<------8<------------ snip -- snip ----------8<------------- 

为了让代码能够正常工作,我必须添加单引号,用于%% a,%% b和%% c的variables赋值。 我的语言环境(PT)在循环/parsing中的一个阶段导致错误,例如“set = 20”的东西被执行。 引号在赋值语句的左边产生一个令牌(虽然是空的)。

缺点是凌乱的区域设置variables名称:'yy','mm'和'dd'。 但是,嘿,谁在乎!

我用这个(不是地区独立的(英国))

 set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2% 

不幸的是,这对区域设置不是免疫的,但是它可以做到你想要的。

 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2% 

惊人的东西,你可以find维基百科 。

请使用以下脚本在命令行中获取当前date:

 echo %Date:~0,3%day 

这不是很简单,但可能是一个更灵活的方式( 信用 ):

 FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B SET date=%mm%%dd%%yyyy% 

另一种方式( 信用 ):

 @For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( Set Month=%%A Set Day=%%B Set Year=%%C ) @echo DAY = %Day% @echo Month = %Month% @echo Year = %Year% 

请注意,我在这里的答案仍然依赖于区域设置确定的date和月份的顺序 – 不知道如何解决这个问题。

 "d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip 

此代码的前四行将为您提供Windows XP Professional及更高版本中可靠的YY DD MM YYYY HH Min Secvariables。

 @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 

下面是一个在单行中获取date时间的方法:

 for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e 

在美国这将输出“yyyy-mm-dd hhmm”。 不同的区域设置会导致不同的%date%输出,但您可以修改令牌顺序。

如果您需要不同的格式,请通过重新排列令牌或使用不同(或不)分隔符来修改echo语句。

这里是一个类似的batch file的时间部分。

 :: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi :: Works on any NT/2k machine independent of regional time settings :: :: Gets the time in ISO 8601 24-hour format :: :: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that. :: Since ISO 8601 does not care about AM/PM, we use %time% :: @ECHO off SETLOCAL ENABLEEXTENSIONS for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do ( set 'hh'=%%i set 'mm'=%%j set 'ss'=%%k set 'ff'=%%l) ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'% ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%] set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction% echo %timestring% :EOF 

–jeroen

我用vMax的batch file改变了答案 ,所以它也适用于荷兰语。
荷兰人 – 像我们一样持久 – 在%date%date/t和打破原始batch file的date有一些变化。

如果有些人可以对其他Windows语言环境进行检查,则会很好,并报告结果。
如果batch file在您的位置失败,请在命令提示符处包含这两个语句的输出:
echo:^|date
date/t

这是你应该从batch file得到的输出样本:

 C:\temp>set-date-cmd.bat Today is Year: [2011] Month: [01] Day: [03] 20110103 

修改后的代码包含以下原因:

 :: https://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi :: Works on any NT/2k machine independent of regional date settings :: :: 20110103 - adapted by jeroen@pluimers.com for Dutch locale :: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy' :: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date :: set '%%c'=%%k :: set 'yy'=%%k :: :: In addition, date will display the current date before the input prompt using dashes :: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch :: and one occurence in English. :: This skips the first iteration: :: if "%%a" GEQ "A" :: :: echo:^|date :: Huidige datum: ma 03-01-2011 :: Voer de nieuwe datum in: (dd-mm-jj) :: The current date is: Mon 01/03/2011 :: Enter the new date: (mm-dd-yy) :: :: date/t :: ma 03-01-2011 :: Mon 01/03/2011 :: :: The assumption in this batch-file is that echo:^|date will return the date format :: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token. :: :: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens. :: That will resolve the order of the tokens. :: @ECHO off set v_day= set v_month= set v_year= SETLOCAL ENABLEEXTENSIONS if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4) ::DEBUG echo toks=%toks% for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do ( ::DEBUG echo first token=%%a if "%%a" GEQ "A" ( for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do ( set '%%a'=%%i set '%%b'=%%j set 'yy'=%%k ) ) ) if %'yy'% LSS 100 set 'yy'=20%'yy'% set Today=%'yy'%-%'mm'%-%'dd'% ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'% ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%] set datestring=%V_Year%%V_Month%%V_Day% echo %datestring% :EOF 

–jeroen

只要使用这一行:

 PowerShell -Command "get-date" 

马修·约翰逊(Matthew Johnson)的单线解决scheme能够获得单线的date和时间,这是一个雄辩的和有用的东西。

但是,它需要从batch file中进行简单的修改:

 for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e 

这是我用过的:

 ::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z") SET DT=%date% SET DT=%DT:/=.% SET DT=%DT:-=.% 

如果你想进一步的想法来自动备份到7-Zip档案,我有一个免费/开放的项目,您可以使用或审查的想法: http : //wittman.org/ziparcy/

一个基于wmic函数:

 :Now -- Gets the current date and time into separate variables :: %~1: [out] Year :: %~2: [out] Month :: %~3: [out] Day :: %~4: [out] Hour :: %~5: [out] Minute :: %~6: [out] Second setlocal for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t endlocal & ( if "%~1" neq "" set %~1=%T:~0,4% if "%~2" neq "" set %~2=%T:~4,2% if "%~3" neq "" set %~3=%T:~6,2% if "%~4" neq "" set %~4=%T:~8,2% if "%~5" neq "" set %~5=%T:~10,2% if "%~6" neq "" set %~6=%T:~12,2% ) goto:eof 

上行:地区独立。 缺点:只有系统pipe理员才能运行wmic.exe。

用法:

 call:Now YMDHNS echo %Y%-%M%-%D% %H%:%N%:%S% 

这回响了一个像这样的string:

 2014-01-22 12:51:53 

请注意,函数参数是out参数 – 也就是说,您必须提供variables名称而不是值。

所有参数都是可选的,所以call:Now YM是一个有效的电话,如果你只想得到年份和月份。

  @echo off :: START USAGE ================================================================== ::SET THE NICETIME :: SET NICETIME=BOO :: CALL GetNiceTime.cmd :: ECHO NICETIME IS %NICETIME% :: echo nice time is %NICETIME% :: END USAGE ================================================================== echo set hhmmsss :: this is Regional settings dependant so tweak this according your current settings for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c ::DEBUG ECHO hhmmsss IS %hhmmsss% ::DEBUG PAUSE echo %yyyymmdd% :: this is Regional settings dependant so tweak this according your current settings for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set yyyymmdd=%%F%%E%%D ::DEBUG ECHO yyyymmdd IS %yyyymmdd% ::DEBUG PAUSE set NICETIME=%yyyymmdd%_%hhmmsss% ::DEBUG echo THE NICETIME IS %NICETIME% ::DEBUG PAUSE 

我有一个类似的问题。 我有一个encryption文件的FTP服务器每天自动下载。 我想用gpg解密文件,将文件重命名为当前date(YYYYMMDD格式),并将解密后的文件放到正确部门的文件夹中。

我经历了几个根据date重命名文件的build议,并没有运气,直到我偶然发现这个简单的解决scheme。

 for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt 

它工作得很好(即文件名为“2011-06-14.txt”)。

(资源)

http://sourceforge.net/projects/unxutils/files/

Look inside the ZIP file for something called "Date.exe" and rename it "DateFormat.exe" (to avoid conflicts).

Put it in your Windows system32 folder.

It has a lot of "date output" options.

For help, use DateFormat.exe --h

I'm not sure how you would put its output into an environment variable… using SET.

Regional independent solution generating the ISO date format:

 rem save the existing format definition for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a rem set ISO specific format definition reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul: rem query the date in the ISO specific format set ISODATE=%DATE% rem restore previous format definition reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul: 

What could still be optimized: Other processes might get confused if using the date format in the short period while it is modified. So parsing the output according to the existing format string could be 'safer' – but will be more complicated

 :: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format :: - Sets environment variables %_isotime% and %_now% to current time :: - On failure, clears these environment variables :: Inspired on -> https://ss64.com/nt/syntax-getdate.html :: - (cX) 2017 adolfo.dimare@gmail.com :: - http://stackoverflow.com/questions/203090 @echo off set _isotime= set _now= :: Check that WMIC.exe is available WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_ if not (%1)==() goto _help SetLocal EnableDelayedExpansion :: Use WMIC.exe to retrieve date and time FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO ( IF "%%~L"=="" goto _WMIC_done_ set _yyyy=%%L set _mm=00%%J set _dd=00%%G set _hour=00%%H set _minute=00%%I set _second=00%%K ) :_WMIC_done_ :: 1 2 3 4 5 6 :: %%G %%H %%I %%J %%K %%L :: Day Hour Minute Month Second Year :: 27 9 35 4 38 2017 :: Remove excess leading zeroes set _mm=%_mm:~-2% set _dd=%_dd:~-2% set _hour=%_hour:~-2% set _minute=%_minute:~-2% set _second=%_second:~-2% :: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep% :: Set date/time in ISO 8601 format: Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second% :: -> http://google.com/search?num=100&q=ISO+8601+format if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am if 1%_hour% LSS 112 goto _skip_12_ set /a _hour=1%_hour%-12 set _hour=%_hour:~-2% set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm :: -> https://ss64.com/nt/if.html :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows :: 'if () else ()' will NOT set %_now% correctly !? :_skip_12_ EndLocal & set _isotime=%_isotime% & set _now=%_now% goto _out :_WMIC_MISSING_ echo. echo WMIC.exe command not available echo - WMIC.exe needs Administrator privileges to run in Windows echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe" :_help echo. echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format echo. echo %%_now%% environment variable set to current date and time echo %%_isotime%% environment variable to current time in ISO format echo set _today=%%_isotime:~0,10%% echo. :_out :: EOF: GetDate.cmd 

Given a known locality, for reference in functional form. The ECHOTIMESTAMP call shows how to get the timestamp into a variable ( DTS in this example.)

 @ECHO off CALL :ECHOTIMESTAMP GOTO END :TIMESTAMP SETLOCAL EnableDelayedExpansion SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2! SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2! SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0! ENDLOCAL & SET "%~1=%DTS%" GOTO :EOF :ECHOTIMESTAMP SETLOCAL CALL :TIMESTAMP DTS ECHO %DTS% ENDLOCAL GOTO :EOF :END EXIT /b 0 

And saved to file, timestamp.bat, here's the output:

在这里输入图像描述

With Windows 7, this code works for me:

 SET DATE=%date% SET YEAR=%DATE:~0,4% SET MONTH=%DATE:~5,2% SET DAY=%DATE:~8,2% ECHO %YEAR% ECHO %MONTH% ECHO %DAY% SET DATE_FRM=%YEAR%-%MONTH%-%DAY% ECHO %DATE_FRM% 

I know that there are numerous ways mentioned already. But here is my way to break it down to understand how it is done. Hopefully, it is helpful for someone who like step by step method.

 :: Check your local date format echo %date% :: Output is Mon 08/15/2016 :: get day (start index, number of characters) :: (index starts with zero) set myday=%DATE:~0,4% echo %myday% :: output is Mon :: get month set mymonth=%DATE:~4,2% echo %mymonth% :: output is 08 :: get date set mydate=%DATE:~7,2% echo %mydate% :: output is 15 :: get year set myyear=%DATE:~10,4% echo %myyear% :: output is 2016