代码之家  ›  专栏  ›  技术社区  ›  Assaf Lavie

在批处理脚本中生成带有时间戳的唯一文件名

  •  36
  • Assaf Lavie  · 技术社区  · 15 年前

    在我的.bat文件中,我想根据日期和时间为文件/目录生成一个唯一的名称。

    Build-2009-10-29-10-59-00
    

    %TIME% 不会,因为它包含文件名中非法的字符(例如。 :

    有类似的吗 tr 在批处理文件中?

    7 回复  |  直到 6 年前
        1
  •  44
  •   Joey    12 年前

    编辑:一种更好的方法是使用具有已定义且不变格式的日期/时间字符串,而不是使用从中定义的区域设置 %date% %time% . 您可以使用以下方法来获取它:

    for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x
    

    它产生类似于 20120730203126.530000+120 您可以使用它来构造文件名。


    您可以简单地用空字符串替换有问题的字符:

    echo %time::=%
    

    %var:str1=str2% 获取环境变量(如果为 %TIME% 并取代 str1 通过 str2 str1 只需删除。

    在您的具体情况下,我认为您需要以下几点:

    rem cut off fractional seconds
    set t=%time:~0,8%
    rem replace colons with dashes
    set t=%t::=-%
    set FileName=Build-%date%-%t%
    

    set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%
    

    但是,前面的所有内容都假设您使用标准ISO 8601日期格式,即2009-10-29。我认为这很正常,但有些人使用其他格式,所以请小心。但既然你没有问我约会的事,我想你在那里没有问题。

        2
  •  18
  •   Evgeni Sergeev    10 年前

    跟进@Joey和@Kees的答案,使其立即可用。

    FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a
    SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
    echo %DateTime%
    

    在BAT文件中:

    @echo off
    REM See http://stackoverflow.com/q/1642677/1143274
    FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
    SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
    echo %DateTime%
    

    示例输出:

    2014-10-21_16-28-52
    
        3
  •  3
  •   Ben    11 年前

    REM ****Set up Logging ****
    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%") do (set mytime=%%a%%b)
    set mytime=%mytime: =0%
    
    set Logname="PCCU_%mydate%_%mytime%.log"
    Echo.  >>%Logname% 2>>&1
    Echo.=================== >>%Logname% 2>>&1
    

    set mytime=%mytime: =0%
    

    因为我在上午10点之前输入空白时遇到了同样的问题,现在我得到的是09而不是9。我还将%mydate%和%mytime%变量重新用于使用此脚本创建的其他文件,以便它们都具有相同的日期时间戳。

        4
  •  2
  •   Kees    10 年前


    您需要的实际日期/时间格式在第2行中确定。您可以根据需要对其进行格式化。
    只需将生成的DateTime变量添加到文件名中,即.filename\uU%DateTime%.log

    ::=======================================================================
    ::== CREATE UNIQUE DateTime STRING IN FORMAT YYYYMMDD-HHMMSS
    ::=======================================================================
    FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
    
    SET DateTime=%DTS:~0,8%-%DTS:~8,6% | REM OUTPUT = 20140725-095527
    
        5
  •  2
  •   Ariful Huq    5 年前

    我做了这个通用的,将在任何环境下工作的日期格式可能会有所不同。

    echo off
    if not exist "C:\SWLOG\" mkdir C:\SWLOG
    cd C:\SWLOG\
    cmd /c "powershell get-date -format ^"{yyyyMMdd-HHmmss}^""> result.txt
    REM echo %time% > result.txt
    type result.txt > result1.txt
    set /p filename=<result1.txt
    echo %filename%
    del C:\SWLOG\result.txt
    del C:\SWLOG\result1.txt
    
        6
  •  1
  •   Qantas 94 Heavy    10 年前

    For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
    

    下面我粘贴了我的全部脚本,并包含了一个如何使用文件名的示例

    For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
    For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
    set mytime=%mytime: =0%
    
    set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log"
    Robocopy  \\sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee 
    

        7
  •  0
  •   Colin Basnett    7 年前

    如果可以的话 保证 PATH ,您可以使用此解决方案:

    FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print 
    datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO (
    SET TIMESTAMP=%%F
    )
    ECHO %TIMESTAMP%
    

    这将使当前的本地 ISO-8601 %TIMESTAMP% 变量并将其回显,如下所示:

    2017-05-25T14:54:37
    

    replace(':', '-') 之后 isoformat() 因此,结果字符串可以在文件名或目录中使用,因为 :