在批处理作业中创建文件名作为时间戳

Eoi*_*ell 82 windows timestamp cmd batch-file

我们有一个每天运行的批处理作业,并将文件复制到拾取文件夹.我还想获取该文件的副本并将其放入具有文件名的存档文件夹中

 yyyy-MM-dd.log
Run Code Online (Sandbox Code Playgroud)

在Windows批处理作业中执行此操作的最简单方法是什么?

我基本上是在寻找这个Unix命令的等价物:

cp source.log `date +%F`.log
Run Code Online (Sandbox Code Playgroud)

ope*_*llo 99

CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log
Run Code Online (Sandbox Code Playgroud)

但它依赖于语言环境.我不确定是否%DATE%已本地化,或取决于在Windows中为短日期指定的格式.

这是一种与语言环境无关的方法,可以从此答案中提取当前日期,但它取决于WMICFOR /F:

FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO @SET B=%%A
CP source.log %B:~0,4%-%B:~4,2%-%B:~6,2%.log
Run Code Online (Sandbox Code Playgroud)

  • 需要做一些摆弄指数,但这似乎已成功.(虽然不完全确定我理解减指数逻辑)%DATE:〜-4% - %DATE:〜-7,-5% - %DATE:〜-10,-8%.log (6认同)
  • 使用它的时间(删除毫秒):`%time:〜-11,2% - %time:〜-8,2% - %time:〜-5.2%` (5认同)
  • 我建议在此之前发出一个SETLOCAL命令. (3认同)
  • 这确实在其他语言环境中中断.在我的情况下,命令返回`2014-5.-01`(当它将是`2014-05-26`).所以要非常小心,如果你发布包含这个的脚本! (3认同)
  • 如果您想使用所有正指数,您可以使用: %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% (2认同)

Dan*_*ski 46

这对我有用,是一个文件名安全的解决方案(虽然它生成一个MM-dd-YYYY格式):

C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%
C:\ set SAVESTAMP=%SAVESTAMP:,=.%.jpg
C:\ echo %SAVESTAMP%
11-04-2012@20-52-42.79.jpg
Run Code Online (Sandbox Code Playgroud)

第一个命令获取日期和替换/-,花费的时间和替换:-,并将它们组合成日期@时间格式.第二个set语句删除任何空格,第三set替换,.和追加.jpg延长.

上面的代码用在一个小脚本中,该脚本从安全IP摄像机中提取图像以进行进一步处理:

:while
set SAVESTAMP=%DATE:/=-%@%TIME::=-%
set SAVESTAMP=%SAVESTAMP: =%
set SAVESTAMP=%SAVESTAMP:,=.%.jpg
wget-1.10.2.exe --tries=0 -O %SAVESTAMP% http://admin:<password>@<ip address>:<port>/snapshot.cgi
timeout 1
GOTO while
Run Code Online (Sandbox Code Playgroud)

  • 但它既不是独立的场所,也不是创建`yyyy-MM-dd的正确(iso8601)格式 (5认同)

Aub*_*bin 15

仅适用于法国语言环境(法国),请注意/日期:

echo %DATE%
08/09/2013
Run Code Online (Sandbox Code Playgroud)

对于我们的日志文件问题,这里是我对法语区域设置的建议:

SETLOCAL
set LOGFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set LOGFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set LOGFILE=log-%LOGFILE_DATE%-%LOGFILE_TIME%.txt
rem log-2014.05.19-22.18.txt
command > %LOGFILE%
Run Code Online (Sandbox Code Playgroud)

  • 很好,但要小心,如果你想避免白色字符,因为HOUR可以是1位数字渲染:`"_0:00"`(下划线字符是一个空格) (2认同)

tot*_*cat 10

这是一个独立于语言环境的解决方案(复制到名为SetDateTimeComponents.cmd的文件):

@echo off
REM This script taken from the following URL:
REM http://www.winnetmag.com/windowsscripting/article/articleid/9177/windowsscripting_9177.html

REM Create the date and time elements.
for /f "tokens=1-7 delims=:/-, " %%i in ('echo exit^|cmd /q /k"prompt $d $t"') do (
   for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
      set dow=%%i
      set %%a=%%j
      set %%b=%%k
      set %%c=%%l
      set hh=%%m
      set min=%%n
      set ss=%%o
   )
)

REM Let's see the result.
echo %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss%
Run Code Online (Sandbox Code Playgroud)

我将所有.cmd脚本放在同一个文件夹中(%SCRIPTROOT%); 任何需要日期/时间值的脚本都将调用SetDateTimeComponents.cmd,如下例所示:

setlocal

@echo Initializing...
set SCRIPTROOT=%~dp0
set ERRLOG=C:\Oopsies.err

:: Log start time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : Start === >> %ERRLOG%

:: Perform some long running action and log errors to ERRLOG.

:: Log end time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : End === >> %ERRLOG%
Run Code Online (Sandbox Code Playgroud)

如示例所示,只要需要更新日期/时间值,就可以调用SetDateTimeComponents.cmd.隐藏时间解析脚本自己的SetDateTimeComponents.cmd文件是隐藏丑陋细节的好方法,更重要的是,避免拼写错误.

  • 对不起,这不是与语言环境无关的:在我的法语Windows上,我得到"18 -2014- @ 13:14:43" (2认同)
  • 可以确认:不独立于语言环境。`prompt $d $t` 在我的系统上返回 30.05.2016 15:35:56,93。 (2认同)

tbo*_*203 9

因为将它们撕裂%DATE%%TIME%分开并将它们重新组合在一起的想法充其量看起来很脆弱,所以这里有一个使用 powershell oneliner 的替代方案:

for /f %i in ('powershell -c "get-date -format yyyy-MM-dd--HH-mm-ss"') do @set DATETIME=%i
set LOGFILE=my-script-%DATETIME%.txt
Run Code Online (Sandbox Code Playgroud)

参考get-datehere,包含 .NET 风格和 UNIX 风格的格式选项。


小智 6

这将确保输出为2位数值...您可以根据自己的喜好重新排列输出并通过取消注释诊断部分进行测试.请享用!

(我从其他论坛借了很多这个......)

:: ------------------ Date and Time Modifier ------------------------

@echo off
setlocal

:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP FOR USE IN APPENDING FILENAMES

:: CREATE VARIABLE %TIMESTAMP%

for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"prompt $D $T"') do (
   for /f "tokens=2-4 skip=1 delims=/-,()" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)

:: ensure that hour is always 2 digits

if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09


:: --------- TIME STAMP DIAGNOSTICS -------------------------

:: Un-comment these lines to test output

:: echo dayOfWeek = %dow%
:: echo year = %yy%
:: echo month = %mm%
:: echo day = %dd%
:: echo hour = %hh%
:: echo minute = %min%
:: echo second = %sec%
:: echo hundredthsSecond = %hsec%
:: echo.
:: echo Hello! 
:: echo Today is %dow%, %mm%/%dd%. 
:: echo.
:: echo. 
:: echo.
:: echo.
:: pause

:: --------- END TIME STAMP DIAGNOSTICS ----------------------

:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "

endlocal & set timeStamp=%yy%%mm%%dd%_%hh%-%min%-%sec%
echo %timeStamp%
Run Code Online (Sandbox Code Playgroud)


小智 5

我经常使用它,并将所有内容都放在一个复制命令中.以下将example.txt复制为example_YYYYMMDD_HHMMSS.txt,当然您可以修改它以适合您的首选格式.只有在filespec中有任何空格时才需要引号.如果要重用完全相同的日期/时间戳,则需要将其存储在变量中.

copy "{path}\example.txt" "{path}\_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
Run Code Online (Sandbox Code Playgroud)