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


当前回答

就用这句话:

PowerShell -Command "get-date"

其他回答

我注意到o/p并没有要求一个与区域无关的解决方案。不过,我的解决方案是针对英国的。

这是在批处理文件中使用的最简单的解决方案,一行解决方案:

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专门寻求单线解决方案。

这是我使用的:

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

另一种方法(credit):

@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%

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

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

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

不幸的是,这并不是不受区域设置的影响,但它确实是你想要的。

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%

你能在维基百科上找到的东西真是太神奇了。