提问人:Rory 提问时间:10/15/2008 最后编辑:aschipflRory 更新时间:9/25/2022 访问量:1695303
如何在 Windows 命令行上以合适的格式获取当前日期/时间,以便在文件/文件夹名称中使用?
How do I get current date/time on the Windows command line in a suitable format for usage in a file/folder name?
问:
更新:现在是 2016 年,我会使用 PowerShell,除非有一个真正令人信服的向后兼容原因,特别是因为使用 .查看@npocmaka https://stackoverflow.com/a/19799236/8479date
我可以使用什么 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。我不想安装额外的实用程序来实现这一点(尽管我意识到有一些实用程序可以很好地设置日期格式)。
答:
这是我用过的:
::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/
评论
这并不是更简短,但可能是一种更灵活的方式(信用):
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%
请注意,我在这里的两个答案仍然依赖于由区域设置确定的日期和月份的顺序 - 不确定如何解决这个问题。
请参阅 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
本地日期为 [2012-06-19 10:23:47.048]
评论
For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))
wmic
WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table
20120623-1619
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
%%a was unexpected at this time.
不幸的是,这不能幸免于区域设置,但它可以满足您的需求。
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%
令人惊讶的是,你可以在维基百科上找到的东西。
评论
我使用它(同样不独立于区域(英国))
set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
评论
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
评论
http://www.dotnetperls.com/7-zip-examples
有一些好的观点可能对将来的某个人有用。
独立于区域的日期时间分析
命令的 和 的输出格式与区域相关,因此既不可靠也不智能。date.exe(UnxUtils的一部分)以任何可想象的格式提供任何日期和时间信息。您还可以使用 从任何文件中提取日期/时间信息。%DATE%
dir
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-any text-18.55
Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03"'
参考文件中的日期/时间信息:
date.exe -r c:\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 工具的一部分,无需安装。
注意:复制到搜索路径中的任何目录可能会导致使用 Windows 内置命令的其他脚本失败。date.exe
date
评论
date.exe
date.exe
date_unxutils.exe
简短的回答:
:: Start - Run , type:
cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"
:: click into target media, Ctrl + V to paste the result
长答案
@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
评论
下面是 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<-------------
为了让代码在没有错误消息的情况下工作到 stderr,我必须在 %%a、%%b 和 %%c 的变量赋值中添加单引号。我的语言环境 (PT) 在循环/解析的某个阶段导致错误,其中执行了诸如“set =20”之类的内容。引号为赋值语句的左侧生成一个标记(尽管为空)。
缺点是混乱的语言环境变量名称:'yy'、'mm' 和 'dd'。但是,嘿,谁在乎呢!
评论
date
Geben Sie das neue Datum ein: (TT-MM-JJ)
JJ
YY
))
下面是一种在一行中获取日期时间的方法:
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 语句。
评论
http://sourceforge.net/projects/unxutils/files/
在ZIP文件中查找名为“Date.exe”的内容,并将其重命名为“DateFormat.exe”(以避免冲突)。
把它放在你的 Windows system32 文件夹中。
它有很多“日期输出”选项。
如需帮助,请使用DateFormat.exe --h
我不确定您将如何将其输出放入环境变量中......使用 SET.
评论
我用 vMax 的批处理文件更改了答案,因此它也适用于荷兰语。
荷兰人 - 像我们一样坚持 - 在 中进行了一些更改,这破坏了原始的批处理文件。%date%
date/t
date
如果有些人也可以针对其他 Windows 语言环境进行检查,并报告结果,那就太好了。
如果批处理文件在您的位置失败,请在命令提示符下包含以下两个语句的输出:
echo:^|date
date/t
这是您应该从批处理文件中获取的输出示例:
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 [email protected] 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
--杰罗恩
评论
jj-mm-aaaa
gg/mm/aaaa
tt.mm.jjjj
jj
shift
Mon
ma
(TT-MM-JJ)
date/t
23.06.2012
reg query "HKCU\Control Panel\International" /vShortDate
date
date /t
echo %date%
YY/MM/dd
The current date is: 12/06/23 Enter the new date: (mm-dd-yy)
reg query "HKCU\Control Panel\International" /v sShortDate
这是一个类似的时间部分的批处理文件。
:: 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
--杰罗恩
评论
z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path”
forfiles
我也有类似的问题。我每天都会从FTP服务器自动下载加密文件。我想使用 gpg 解密文件,将文件重命名为当前日期(YYYYMMDD 格式),然后将解密后的文件放入正确部门的文件夹中。
我经历了几个根据日期重命名文件的建议,直到我偶然发现这个简单的解决方案才运气不佳。
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt
它运行良好(即,文件名显示为“2011-06-14.txt”)。
请使用以下脚本在命令行中获取当前日期:
echo %Date:~0,3%day
评论
生成 ISO 日期格式的区域独立解决方案:
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:
哪些方面仍可优化: 如果在修改日期格式时短时间内使用日期格式,其他进程可能会感到困惑。因此,根据现有的格式字符串解析输出可能“更安全”,但会更复杂
评论
马修·约翰逊 (Matthew Johnson) 的单行解决方案用于获取单行日期和时间,这是雄辩且有用的。
但是,它确实需要简单的修改才能在批处理文件中工作:
for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
评论
echo %date:/=-%%time::=-%
另外两种不依赖于时间设置的方法(均取自 :如何获取独立于本地化的数据/时间:)。而且两者都获得了一周中的某一天,并且都不需要管理员权限!
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/批处理混合(需要另存为 )。JScript 作为 Windows 脚本宿主的一部分,在 NT 及更高版本的每个系统上都可用(尽管可以通过注册表禁用,但这种情况很少见):
.bat
@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 在其日志文件上放置的时间戳。它适用于 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 的 Date 对象属性涉及月份值,编号范围为 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>
评论
makecab
:它的工作原理是创建一个名为 的文件,并在其中搜索 ,从 开始,这是一行,类似于 。对我来说,这个命令没有本地化,它与语言环境无关。这个伎俩就是依靠这个。让我们希望它永远不会,否则要小心!~.rpt
string
makecab
MakeCAB Report: Tue Sep 02 22:15:57 2014
mshta
mshta
基于以下功能的函数: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
好处:与区域无关。缺点:只有系统管理员才能运行 wmic.exe。
用法:
call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%
这回显了如下字符串:
2014-01-22 12:51:53
请注意,函数参数是 out-Parameters - 也就是说,您必须提供变量名称而不是值。
所有参数都是可选的,因此,如果您只想获取年份和月份,则调用是有效的。call:Now Y M
此代码的前四行将在 Windows XP Professional 及更高版本中为您提供可靠的 YY DD MM YYYY HH Min Sec 变量。
@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
评论
只需使用这一行:
PowerShell -Command "get-date"
给定一个已知的位置,以功能形式供参考。该调用演示如何将时间戳获取到变量中(在此示例中为)。ECHOTIMESTAMP
DTS
@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
并保存到文件,时间戳.bat,这是输出:
评论
(yy)yy年m月d日 hh:mm
systeminfo
System Locale
我知道已经提到了很多方法。但这是我分解它以了解它是如何完成的。希望它对喜欢分步方法的人有所帮助。
:: 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
评论
independent of the regional settings of the machine
在 Windows 7 中,此代码对我有用:
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%
评论
independent of the regional settings of the machine
:: 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 [email protected]
:: - 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
我注意到,o/p 没有要求一个独立于区域的解决方案。不过,我的解决方案是针对英国的。
这是最简单的解决方案,即 1 行解决方案,用于批处理文件:
FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
可以通过更改输出语句中变量 %%A %%B 和 %%C 的顺序来改变此解决方案,以提供所需的任何日期格式(例如 YY-MM-DD 或 DD-MM-YY)。
我发布这个答案的意图 - 我唯一的意图 - 是证明这可以通过在命令行上完成,通过使用一行代码来实现它。
而且,像其他人所做的那样,发布运行 35 行代码的答案是多余的,因为 o/p 在问题中特别要求命令行解决方案。因此,o/p 专门寻求单线解决方案。
评论
...particularly because of the regional settings issue with using date
echo %date:/=-%
合并到一个批处理文件中,并使用元变量分配每个文件:Powershell
@echo off
for /f "tokens=1-6 delims=-" %%a in ('PowerShell -Command "& {Get-Date -format "yyyy-MM-dd-HH-mm-ss"}"') do (
echo year: %%a
echo month: %%b
echo day: %%c
echo hour: %%d
echo minute: %%e
echo second: %%f
)
如果您更喜欢月份名称或 12 小时到 24 小时格式,也可以更改格式,或者MMM
MMMM
hh
HH
我使用了 ,并重命名了它以避免冲突。
date.exe
date_unxutils.exe
将其放在批处理脚本旁边的文件夹中。
bin
法典
:: Add binaries to temp path
IF EXIST bin SET PATH=%PATH%;bin
:: Create UTC Timestamp string in a custom format
:: Example: 20210128172058
set timestamp_command='date_unxutils.exe -u +"%%Y%%m%%d%%H%%M%%S"'
FOR /F %%i IN (%timestamp_command%) DO set timestamp=%%i
echo %timestamp%
下载 UnxUtils
- 链接。
引用
- 我建立的这个很棒的答案。
PowerShell的 请尝试下面的代码。 它将在 24 小时内创建日期为 ddmmyyhhmm 的文件或文件夹
[int] $day = Get-Date -UFormat %d
[int] $month = Get-Date -UFormat %m
[int] $year = Get-Date -UFormat %y
[String] $date = "$($day)$($month)$($year)"
$time = Get-Date -UFormat %R
$time -replace ‘[:]’,”"
$fileFolderName = $date + time
评论
[datetime]::now.tostring("yyyy-MM-dd")