如何在批处理文件中添加日期

50

我有一个批处理文件,在一个旧的Windows 2000系统上运行,其中包含以下代码:

7z a QuickBackup.zip *.backup

如何将日期附加到QuickBackup.zip文件中。如果我今天运行批处理文件,那么理想情况下,文件应该是QuickBackup20090514.zip

有没有办法做到这一点?


2
由于一些答案使用了%DATE%环境变量,您可能需要在“区域选项”控制面板中告诉我们配置的“短日期格式”。 - system PAUSE
2
与“区域选项”无关的方法在“批处理命令中将日期和时间添加至文件名”的答案中 - 基于系统命令wmic os get localdatetime /format:list。 wmic的示例输出是:LocalDateTime=20140619215423.218000+120 - Peter Mortensen
14个回答

62

Bernhard's answer 对我来说需要一些调整工作,因为 %DATE% 环境变量的格式不同(如其他地方所述)。此外,缺少了一个波浪符(~)。

原来的代码是:

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:0,2%

我必须使用以下代码:

set backupFilename=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%

对于日期格式:

c:\Scripts>echo %DATE%

Thu 05/14/2009


谢谢,我已经按照完全相同的方式调整了我的文件,然后看到了你的答案。 - AngryHacker
6
克里斯,你漏掉了日期格式中的波浪线符号。 应该是: set backupFilename=%DATE:6,4%%DATE:3,2%%DATE:~0,2% - Glenn Wark
为了按照英国/欧盟/澳大利亚的顺序解析这种格式,我使用了以下命令:set today=%DATE:10,4%%DATE:7,2%%DATE:~4,2% - CAD bloke
5
由于不同的机器可能具有不同的日期格式,因此这种方法无法跨机器使用。 - Simon East
1
这对我来说非常完美,谢谢。就像你一样,原始答案也没有起作用。我学到了如何在命令窗口中操作环境变量! - Mmm

15

这将适用于非美国日期格式(dd/MM/yyyy):

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
7z a QuickBackup%backupFilename%.zip *.backup

14
@SETLOCAL ENABLEDELAYEDEXPANSION

@REM Use WMIC to retrieve date and time
@echo off
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF NOT "%%~F"=="" (
        SET /A SortDate = 10000 * %%F + 100 * %%D + %%A
        set YEAR=!SortDate:~0,4!
        set MON=!SortDate:~4,2!
        set DAY=!SortDate:~6,2!
        @REM Add 1000000 so as to force a prepended 0 if hours less than 10
        SET /A SortTime = 1000000 + 10000 * %%B + 100 * %%C + %%E
        set HOUR=!SortTime:~1,2!
        set MIN=!SortTime:~3,2!
        set SEC=!SortTime:~5,2!
    )
)
@echo on
@echo DATE=%DATE%, TIME=%TIME%
@echo HOUR=!HOUR! MIN=!MIN! SEC=!SEC!
@echo YR=!YEAR! MON=!MON! DAY=!DAY! 
@echo DATECODE= '!YEAR!!MON!!DAY!!HOUR!!MIN!' 

输出:

DATE=2015-05-20, TIME= 1:30:38.59
HOUR=01 MIN=30 SEC=38
YR=2015 MON=05 DAY=20
DATECODE= '201505200130'

1
这应该是被接受的答案,因为它真正独立于语言环境! - carlossierra

13

如果您知道您的区域设置不会更改,您可以按如下方式操作:

  • 如果您的短日期格式为dd/MM/yyyy:

    SET MYDATE=%DATE:~3,2%%DATE:~0,2%%DATE:~8,4%

  • 如果您的短日期格式为MM/dd/yyyy:

    SET MYDATE=%DATE:~0,2%%DATE:~3,2%%DATE:~8,4%

但是没有一种通用的方法可以独立于您的区域设置进行操作。

我不建议依赖区域设置来处理任何将在生产环境中使用的内容。相反,您应该考虑使用另一种脚本语言——PowerShell、VBScript等等。

例如,如果您在与批处理文件相同的目录中创建一个名为yyyymmdd.vbs的VBS文件,并写入以下内容:

' yyyymmdd.vbs - outputs the current date in the format yyyymmdd
Function Pad(Value, PadCharacter, Length)
    Pad = Right(String(Length,PadCharacter) & Value, Length)
End Function

Dim Today
Today = Date
WScript.Echo Pad(Year(Today), "0", 4) & Pad(Month(Today), "0", 2) & Pad(Day(Today), "0", 2)

然后,您将能够从批处理文件中调用它,如下所示:

FOR /F %%i IN ('cscript "%~dp0yyyymmdd.vbs" //Nologo') do SET MYDATE=%%i
echo %MYDATE%

当然,最终会有一个时候,将批处理文件重写为更强大的脚本语言会比以这种方式混合使用VBScript更明智。


第二个命令很接近,但我能够在此基础上进行改进。谢谢! - Monster

7

您还可以通过变量%DATE%访问日期

在测试我的系统时,%DATE%会产生ddd dd/mm/yyyy的结果

您可以使用子字符串操作符来生成所需的格式

例如,在具有美国区域设置的MON 11/12/2018上运行以下内容:

%DATE:~3,3% %DATE:~0,3% %DATE:~7,2%

将会产生一个输出:

11 Mon 12

子字符串参数为
%*variable*:~*startpos*,*numberofchars*%

您可以在此处阅读有关批处理变量子字符串的更多信息 https://ss64.com/nt/syntax-substring.html


在代码部分中那个字符呕吐看起来完全像我继承的代码。也许有人有一个网址,可以解释%date后面的数字的手册吗?我真的很难找到正确的搜索词。 - Torben
1
这是我的来源.. https://ss64.com/nt/syntax-substring.html - ShoeLace

4

这一切都很尴尬,而且不是本地设置无关的。可以这样做:

%CYGWIN_DIR%\bin\date +%%Y%%m%%d_%%H%%M% > date.txt
for /f "delims=" %%a in ('type "date.txt" 2^>NUL') do set datetime=%%a
echo %datetime%
del date.txt

是的,使用Cygwin日期,你所有的问题都会消失!


2

这里有一个技术方案在此处,展示了如何将其格式化为MMDDYYYY,您应该能够根据自己的需求进行调整。

echo on
@REM Seamonkey’s quick date batch (MMDDYYYY format)
@REM Setups %date variable
@REM First parses month, day, and year into mm , dd, yyyy formats and then combines to be MMDDYYYY
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%

echo %date%

编辑:之前无法工作的原因是原始文本中有“智能引号”。我已经修复了它们,如果从此页面剪切并粘贴批处理文件,它将可以工作。


啊,下次在链接到另一个源之前我会好好测试它。Tech-recipe没有起作用的原因是网页中有特殊的引号字符。我已经更新了它,现在它可以工作了。 - Andre Miller

2
当然可以。
FOR %%A IN (%Date:/=%) DO SET Today=%%A
7z a QuickBackup%TODAY%.zip *.backup

这是DDMMYYYY格式。

这是YYYYDDMM:

FOR %%A IN (%Date%) DO (
    FOR /F "tokens=1-3 delims=/-" %%B in ("%%~A") DO (
        SET Today=%%D%%B%%C
    )
)
7z a QuickBackup%TODAY%.zip *.backup

3
如果这些方法不起作用,可以检查“区域和语言选项”控制面板。 %Date% 的日期格式取决于区域设置。 - system PAUSE

1
如已经注意到的,只有在您知道当前用户使用的日期和时间格式(例如MM/dd/yy或dd-MM-yyyy等)时,解析日期和时间才有用。这可以被确定,但是当您进行所有压力测试和解析时,仍然会出现意外使用格式的情况,并且需要进行更多的调整。
您还可以使用一些外部程序来返回您所需的日期格式的日期标记,但这样做存在分发实用程序与脚本/批处理的缺点。
还有一些批处理技巧,使用CMOS时钟以相当原始的方式,但这对于大多数人来说太过于接近裸线,并且不总是检索日期/时间的首选位置。
以下是避免上述问题的解决方案。是的,它引入了一些其他问题,但是为了我的目的,我发现这是创建.bat文件中现代Windows系统的日期戳最简单,最清晰,最便携的解决方案。这只是一个示例,但我认为您将看到如何修改其他日期和/或时间格式等内容。
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM the following may be needed to be sure cache is clear before using the new setting
reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f

1

在Joe的想法基础上,这里有一个版本,它将构建自己的(.js)助手和支持时间:

@echo off

set _TMP=%TEMP%\_datetime.tmp

echo var date = new Date(), string, tmp;> "%_TMP%"
echo tmp = ^"000^" + date.getFullYear(); string = tmp.substr(tmp.length - 4);>> "%_TMP%"
echo tmp = ^"0^" + (date.getMonth() + 1); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getDate(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getHours(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getMinutes(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo tmp = ^"0^" + date.getSeconds(); string += tmp.substr(tmp.length - 2);>> "%_TMP%"
echo WScript.Echo(string);>> "%_TMP%"

for /f %%i in ('cscript //nologo /e:jscript "%_TMP%"') do set _DATETIME=%%i

del "%_TMP%"

echo YYYYMMDDhhmmss: %_DATETIME%
echo YYYY: %_DATETIME:~0,4%
echo YYYYMM: %_DATETIME:~0,6%
echo YYYYMMDD: %_DATETIME:~0,8%
echo hhmm: %_DATETIME:~8,4%
echo hhmmss: %_DATETIME:~8,6%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接