为了账号安全,请及时绑定邮箱和手机立即绑定

如何以适合在文件名中使用的格式获取Windows命令行上的当前日期时间?

/ 猿问

如何以适合在文件名中使用的格式获取Windows命令行上的当前日期时间?

拉莫斯之舞 2019-06-01 15:28:46

如何以适合在文件名中使用的格式获取Windows命令行上的当前日期时间?

更新:现在已经是2016年了,我会用PowerShell来做这件事,除非有一个非常令人信服的向后兼容的理由,特别是因为使用PowerShell的区域设置问题。date..见@nocmaka‘shttps://stackoverflow.com/a/19799236/8479


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

我希望有一个.bat文件,它将目录压缩到存档中,其中包含当前的日期和时间,例如,Code_2008-10-14_2257.zip..有什么简单的方法可以做到这一点,独立于区域设置的机器?

我真的不介意日期格式,理想情况下,它应该是yyyy-md-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

我可以接受,但看起来有点笨重。理想情况下,它应该更简短,并有前面提到的格式。

我正在使用WindowsServer 2003和WindowsXPProfessional。我不想安装额外的实用程序来实现这一点(虽然我意识到有些工具会做很好的日期格式化)。


查看完整描述

3 回答

?
智慧大石

看见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 /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]


查看完整回答
反对 回复 2019-06-01
?
潇潇雨雨

区域独立日期时间解析

的输出格式%DATE%以及dir指挥依赖于地区,因此既不强大也不聪明。date.exe(部分)UnxUtils)以任何可想象的格式传递任何日期和时间信息。您还可以从以下任何文件中提取日期/时间信息date.exe.

示例:(在cmd-脚本中使用%而不是%)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503:任何文本

date.exe +"Text: %y/%m/%d-any text-%H.%M"
案文:09/12/22-任何案文-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03"`

来自参考文件的日期/时间信息:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

在CMD脚本中使用它获取年份、月、日、时间信息:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j&
 set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

在CMD脚本中使用它获得任何所需格式的时间戳:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

从任何参考文件中提取日期/时间信息。

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set
 dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

将其日期/时间信息添加到文件中:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe是免费GNU工具的一部分不需要安装。

注:复印date.exe在搜索路径中的任何目录中,可能会导致使用windows内置的其他脚本失败。date命令。



查看完整回答
反对 回复 2019-06-01
?
慕雪6442864

另外两种不依赖于时间设置的方法(都是从*如何获得与本地化无关的数据/时间:)。而且都是一周中的一天,而且它们都不需要管理权限!:

  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

    有关获取日期函数的更多信息.

  2. ROBOCOPY-它不是WindowsXP和WindowsServer 2003的本机命令,但它可以是从Microsoft站点下载..但它是内置的-从WindowsVista到更高版本的所有东西:

    @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/批处理混合(需要保存为.bat)。JScript可在每个系统表单nt及以上版本上使用,作为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/批杂交(可以在批处理文件中嵌入和执行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下载(V1V2V3(仅适用于Windows 7及以上版本)。默认情况下,它安装在Windows 7/WindowsServer 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/批处理(从未见过没有.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在其日志文件上设置的时间戳。它将适用于WindowsXP和更高版本的所有内容。它可能永远不会被任何人使用-包括我-但这是另一种方式.

    @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的Date对象属性编号为0到11,而不是1到12。所以9的值意味着10月。

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>


查看完整回答
反对 回复 2019-06-01

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信