【问题标题】:Generate unique file name with timestamp in batch script在批处理脚本中生成带有时间戳的唯一文件名
【发布时间】:2010-12-11 04:34:21
【问题描述】:

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

例如

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

问题在于 %TIME% 不会这样做,因为它包含文件名中的非法字符(例如 :)。

批处理文件中是否有类似tr 的内容?

任何其他的想法如何解决这个问题(除了批处理解释器不需要额外的命令行实用程序)?

【问题讨论】:

    标签: windows batch-file timestamp filenames


    【解决方案1】:

    编辑:这样做的更好方法是采用具有已定义且不变格式的日期/时间字符串,而不是使用来自%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 日期格式,即。 e. 2009 年 10 月 29 日。我认为这很正常,但有些人使用其他格式,所以要小心。但既然你没有问我的日期,我假设你在那里没有问题。

    【讨论】:

    • %time:~0,2%-%time:~3,2%-%time:~6,2% 在上午 10:00 之前创建一个带有空格的字符串!
    • 正如我所说,这假设您为系统使用了合理的日期/时间格式。您可以使用for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%xmydate 中的日期/时间格式不会改变,它始终是 YYYYMMDDHHMMSS...,您可以根据自己的喜好对其进行裁剪。
    • 对于试图将代码复制/粘贴到命令提示符并出现错误的任何其他人,解决方案是将两个位置的“%%”更改为“%”。原始代码在批处理文件中工作,但不在命令行中。
    【解决方案2】:

    跟进@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】:

      我用它来为批处理文件的执行创建一个唯一的文件名。

      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】:

        此例程实际上只有一行,适用于设置为任何日期或时间格式的每个系统。
        第 1 行的输出格式为 20140725095527.710000+120

        您需要的实际日期/时间格式在第 2 行中确定。您可以随意设置格式。
        只需将生成的 DateTime 变量添加到您的文件名中,即。文件名_%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】:

          我做了这个通用的,适用于日期格式可能不同的任何环境。

          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】:

            为了使前面示例中的代码正常工作,我需要稍微调整一下。我想这是因为我的电脑使用的是英国日期格式。要在 mydate 中取回“2014-04-19”,我需要:

            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】:

              如果您可以保证机器上安装了特定版本的 Python 并且可以在系统的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(ish) 日期表示形式放入 %TIMESTAMP% 变量中并回显,如下所示:

              2017-05-25T14:54:37
              

              我将replace(':', '-') 放在isoformat() 之后,以便生成的字符串可以在文件名或目录中使用,因为: 在Windows 文件系统中是一个禁止字符。

              【讨论】:

                【解决方案8】:

                日期时间戳:

                @echo off
                for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
                set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
                set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
                rem set "datestamp=%YY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
                set "datestamp=%YYYY%%MM%%DD%" 
                set "timestamp=%HH%%Min%%Sec%"
                set unique_number=%datestamp%%timestamp%
                echo %unique_number%
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-12-17
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多