如何在Windows命令行中获取当前日期/时间,并以适合在文件/文件夹名称中使用的格式呈现?
如何在Windows命令行中获取当前日期/时间,并以适合在文件/文件夹名称中使用的格式呈现?
更新:现在已经到了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 专业版。我不想安装其他实用程序来完成这项工作(尽管我意识到有一些可以进行很好的日期格式设置)。
还有两种不依赖于时间设置的方法(都来自:如何获得独立于本地化的日期/时间:)。它们都还会获取周几,而且都不需要管理员权限:
-
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 可用于 NT 及以上版本的每个系统中,作为 WSH(Windows 脚本主机)的一部分(虽然可以通过注册表禁用,但这是比较少见的情况):@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());
-
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),", ","-")
-
PowerShell - 可以在每个安装了.NET的机器上安装 - 从 Microsoft 下载 (v1, v2, v3 (仅适用于 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=%%#
-
自编译的 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
-
使用 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%
-
使用 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
-
MSHTA 允许调用与上述第3段中展示的 JScript 方法类似的 JavaScript 方法。请注意,JavaScript 的日期对象属性涉及的月份值从 0 到 11 编号,而不是从 1 到 12。因此,值 9 表示十月。
第一行是一个包含 "123" 粗体文本的段落标签。
第二行则是一个无序列表标签的结束标签,它表示列表已经结束。
查看Windows命令文件(.bat)以获取当前日期的MMDDYYYY格式:
@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小时/军事格式显示时间,可以使用以下代码替换第二个FOR行:
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
C:> .\date.bat
2008-10-14_0642
如果您想独立于区域的日期/月份顺序获取日期,可以使用“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
Local date is [2012-06-19 10:23:47.048]