更新:现在是2016年,我将使用PowerShell,除非有一个真正令人信服的向后兼容的原因,特别是因为使用日期的区域设置问题。参见@npocmaka的https://stackoverflow.com/a/19799236/8479


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

我想要一个.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。我不想安装额外的实用程序来实现这一点(尽管我知道有一些工具可以很好地格式化日期)。


当前回答

生成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:

还有什么可以优化的: 如果在修改日期格式的短时间内使用日期格式,其他进程可能会感到困惑。因此,根据现有的格式字符串解析输出可能会“更安全”——但会更复杂

其他回答

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

我也遇到过类似的问题。我每天都会从FTP服务器上自动下载一个加密文件。我想使用gpg解密文件,将文件重命名为当前日期(YYYYMMDD格式),并将解密文件放入正确部门的文件夹中。

我根据日期查看了几个重命名文件的建议,直到我偶然发现了这个简单的解决方案。

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

它工作得很好(例如,文件名显示为“2011-06-14.txt”)。

(源)

生成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:

还有什么可以优化的: 如果在修改日期格式的短时间内使用日期格式,其他进程可能会感到困惑。因此,根据现有的格式字符串解析输出可能会“更安全”——但会更复杂

查看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]

下面是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<-------------

为了让代码在没有错误msg的情况下工作到stderr,我必须在变量赋值%%a, %%b和%%c周围添加单引号。我的locale (PT)在循环/解析的某个阶段导致了错误,比如执行“set =20”之类的东西。引号为赋值语句的左侧生成一个令牌(尽管为空)。

缺点是混乱的区域变量名称:'yy', 'mm'和'dd'。但是,谁在乎呢!