如何在Windows命令行中获取当前日期/时间,并以适合在文件/文件夹名称中使用的格式呈现?

12 浏览
0 Comments

如何在Windows命令行中获取当前日期/时间,并以适合在文件/文件夹名称中使用的格式呈现?

更新:现在已经到了2016年,除非有一个真正强制需要具有向后兼容性的原因,否则我会使用 PowerShell来处理它,尤其是因为使用 date 时存在区域设置问题。请参见@npocmaka的https://stackoverflow.com/a/19799236/8479


有哪些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 专业版。我不想安装其他实用程序来完成这项工作(尽管我意识到有一些可以进行很好的日期格式设置)。

admin 更改状态以发布 2023年5月23日
0
0 Comments

还有两种不依赖于时间设置的方法(都来自:如何获得独立于本地化的日期/时间:)。它们都还会获取周几,而且都不需要管理员权限:

  1. 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
    

    有关 get-date 函数的更多信息

  2. 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 脚本语言的方法。它们将为您提供更多的灵活性,例如您可以获取本年度的周数、毫秒级别的时间等。

  3. JScript/batch 混合型(需要保存为 .bat)。JScript 可用于 NT 及以上版本的每个系统中,作为 WSH(Windows 脚本主机)的一部分(虽然可以通过注册表禁用,但这是比较少见的情况):

    @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());
    

  4. 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),", ","-")
    

  5. 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=%%#
    

  6. 自编译的 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"));
    

  7. Logman 无法获取当前年和星期几。它相对较慢,还会创建临时文件,并基于 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
    

  8. 使用 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%
    

  9. 使用 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
    

  10. MSHTA 允许调用与上述第3段中展示的 JScript 方法类似的 JavaScript 方法。请注意,JavaScript 的日期对象属性涉及的月份值从 0 到 11 编号,而不是从 1 到 12。因此,值 9 表示十月。

    
    
    

第一行是一个包含 "123" 粗体文本的段落标签。

第二行则是一个无序列表标签的结束标签,它表示列表已经结束。

0
0 Comments

查看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
Local date is [2012-06-19 10:23:47.048]

0