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

Ang*_*ker 44 windows batch-file

我在批处理文件中有以下行(在旧的Windows 2000机器上运行):

7z a QuickBackup.zip *.backup
Run Code Online (Sandbox Code Playgroud)

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

有没有办法做到这一点?

Chr*_*ris 57

Bernhard的回答需要一些调整工作,因为%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%

星期四05/14/2009

  • 克里斯,你错过了那个月的代字号应该是:set backupFilename =%DATE:~6,4 %% DATE:~3,2 %% DATE:~0,2% (6认同)
  • 这不适用于不同的机器,因为它们可能具有不同的日期格式. (3认同)

Ber*_*ann 13

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

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
7z a QuickBackup%backupFilename%.zip *.backup
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 12

如果您知道您的区域设置不会改变,您可以按如下方式进行:

  • 如果您的短日期格式是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,......

例如,如果在与批处理文件相同的目录中创建VBS文件yyyymmdd.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)
Run Code Online (Sandbox Code Playgroud)

然后你就可以从你的批处理文件中调用它了:

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

当然,最终会出现这样的情况:用更强大的脚本语言重写批处理文件比用这种方式将它与VBScript混合更有意义.


Mic*_*ick 9

@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!' 
Run Code Online (Sandbox Code Playgroud)

输出:

DATE=2015-05-20, TIME= 1:30:38.59
HOUR=01 MIN=30 SEC=38
YR=2015 MON=05 DAY=20
DATECODE= '201505200130'
Run Code Online (Sandbox Code Playgroud)


Sho*_*ace 5

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

测试我的系统时%DATE%产生ddd dd/mm/yyyy

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

即.在MON 11/12/2018上使用美国区域设置运行以下命令

%DATE:~3,3% %DATE:~0,3% %DATE:~7,2%
Run Code Online (Sandbox Code Playgroud)

会产生一个输出:

11 Mon 12
Run Code Online (Sandbox Code Playgroud)

子串参数是
%*variable*:~*startpos*,*numberofchars*%