如何在Windows命令行上以合适的格式获取当前日期/时间以在文件/文件夹名称中使用?

末鹿安然 提交于 2020-02-26 18:01:39

更新:现在是2016年,除非有确实令人信服的向后兼容原因,否则我将使用PowerShell,特别是由于使用date的区域设置问题。 参见@npocmaka的https://stackoverflow.com/a/19799236/8479


什么是Windows命令行语句,我可以用可以放入文件名的格式来获取当前日期时间?

我想要一个.bat文件,该文件将目录压缩到一个存档中,并将当前日期和时间作为名称的一部分,例如Code_2008-10-14_2257.zip 。 有什么简单的方法可以做到这一点,而与机器的区域设置无关吗?

我不太在乎日期格式,理想情况下是yyyy-mm-dd,但是任何简单的方法都可以。

到目前为止,我已经知道了,在我的机器上这给了我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。 我不想安装其他实用程序来实现此目的(尽管我知道有些实用程序可以很好地格式化日期)。


#1楼

马修·约翰逊(Matthew Johnson)的单线解决方案来获得单线日期和时间是雄辩而有用的。

但是,它确实需要进行简单的修改才能在批处理文件中工作:

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

#2楼

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

#3楼

区域独立的日期时间解析

%DATE%dir命令的输出格式取决于区域,因此既不健壮也不明智。 date.exeUnxUtils的一部分)以任何可考虑的格式提供任何日期和时间信息。 您也可以使用date.exe从任何文件中提取日期/时间信息。

示例:(在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.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

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

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

将文件的日期/时间信息添加到文件中:

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复制到搜索路径中的任何目录中可能会导致使用Windows内置date命令的其他脚本失败。


#4楼

另外两种不依赖于时间设置的方式(两者均取自:如何获取与本地化无关的数据/时间:) 。 两者都可以获取星期几,而且都不需要管理员权限!:

  1. 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

    有关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在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());
  4. VSCRIPT / 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),", ","-")
  5. PowerShell-可以安装在每个具有.NET的计算机上-从Microsoft下载( v1v2v3 (仅适用于Windows 7及更高版本))。 默认情况下,它将安装在Windows 7 / Windows Server 2008及更高版本中的所有组件上:

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

    要从批处理文件中使用它,请执行以下操作:

    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这无法获取年份和星期几。 它相对较慢,还会创建一个临时文件,并且基于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允许调用类似于上面#3中演示的JScript方法的JavaScript方法。 请记住,涉及月份值的JavaScript的Date对象属性的编号是从0到11,而不是1到12。因此,值9表示十月。

    <!-- : 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>

#5楼

这是我用过的:

::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/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!