在批处理作业中创build文件名称作为时间戳
我们有一个每天运行的批处理作业,并将文件复制到拾取文件夹。 我也想把这个文件的一个副本放到一个带有文件名的归档文件夹中
yyyy-MM-dd.log
Windows批处理作业中最简单的方法是什么?
我基本上在寻找这个Unix命令的等价物:
cp source.log `date +%F`.log
CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log
但是它依赖于语言环境。 我不确定%DATE%
是否已本地化,或者取决于在Windows中为短date指定的格式。
这是一个独立于语言环境的方式,从此答案中提取当前date,但取决于WMIC
和FOR /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
这对我来说是一个文件名安全的解决scheme:
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
第一个命令取DATE,用-
代替,取TIME,代替:
用-
,把它们合并成DATE @ TIME格式。 第二个设置语句删除任何空格并附加.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
仅适用法语区域(法国) ,请小心,因为/
出现在date:
echo %DATE% 08/09/2013
对于我们的日志文件的问题,这里是我只提供法语区域的build议:
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%
这是一个独立于语言环境的解决scheme(复制到名为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%
我把所有.cmd脚本放到同一个文件夹(%SCRIPTROOT%); 任何需要date/时间值的脚本都会调用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%
如示例所示,只要需要更新date/时间值,就可以调用SetDateTimeComponents.cmd。 将时间parsing脚本隐藏在它自己的SetDateTimeComponents.cmd文件中是隐藏丑陋细节的好方法,更重要的是,避免错别字。
我经常使用这个,把所有东西都放到一个复制命令中。 以下将example.txt复制为example_YYYYMMDD_HHMMSS.txt,当然,您可以对其进行修改以适合您的首选格式。 只有在filespec中有空格时才需要引号。 如果您想重复使用完全相同的date/时间戳,则需要将其存储在一个variables中。
copy "{path}\example.txt" "{path}\_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
这将确保输出是2位数值…您可以通过取消注释诊断部分来重新排列输出以满足您的喜好和testing。 请享用!
(我从其他论坛借了很多…)
:: ------------------ 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%
用当前date创build一个文件作为文件名(例如2008-11-08.dat)
echo hello > %date%.dat
在当前date但没有“ – ”(例如20081108.dat)
echo hello > %date:-=%.dat
也许这可以帮助:
echo off @prompt set date=$d$_ set time=$t$h$h$h echo some log >> %date% %time%.log exit
要么
echo off set v=%date%.log echo some log >> %v%
您可以简单地检测当前的本地格式,并以您的格式获取date,例如:
::for 30.10.2016 dd.MM.yyyy if %date:~2,1%==. set d=%date:~-4%%date:~3,2%%date:~,2% ::for 10/30/2016 MM/dd/yyyy if %date:~2,1%==/ set d=%date:~-4%%date:~,2%%date:~3,2% ::for 2016-10-30 yyyy-MM-dd if %date:~4,1%==- set d=%date:~,4%%date:~5,2%%date:~-2% ::variable %d% have now value: 2016103 (yyyyMMdd) set t=%time::=% set t=%t:,=% ::variable %t% have now time without delimiters cp source.log %d%_%t%.log
我把一个小C程序放在一起打印出当前时间戳(区域安全,没有坏字符…)。 然后,我使用FOR命令将结果保存在一个环境variables中:
:: Get the timestamp for /f %%x in ('@timestamp') do set TIMESTAMP=%%x :: Use it to generate a filename for /r %%x in (.\processed\*) do move "%%~x" ".\archived\%%~nx-%TIMESTAMP%%%~xx"
这是一个链接:
1)您可以下载GNUdate的GNU coreutils
2)你可以使用VBScript ,这使得在Windows中更容易处理date:
Set objFS = CreateObject("Scripting.FileSystemObject") strFolder = "c:\test" Set objFolder = objFS.GetFolder(strFolder) current = Now mth = Month(current) d = Day(current) yr = Year(current) If Len(mth) <2 Then mth="0"&mth End If If Len(d) < 2 Then d = "0"&d End If timestamp=yr & "-" & mth &"-"& d For Each strFile In objFolder.Files strFileName = strFile.Name If InStr(strFileName,"file_name_here") > 0 Then BaseName = objFS.GetBaseName(strFileName) Extension = objFS.GetExtensionName(strFileName) NewName = BaseName & "-" & timestamp & "." & Extension strFile.Name = NewName End If Next
运行脚本如下:
c:\test> cscript /nologo myscript.vbs
我知道这个线程是旧的,但我只是想在这里添加这个,因为它帮助我很多尝试把这一切都弄清楚,它的清洁。 关于这一点的好处是你可以把它放在一个总是运行的batch file的循环中。 服务器正常运行日志什么的。 这就是我用它反正。 我希望这有助于某个人。
@setlocal enableextensions enabledelayedexpansion @echo off call :timestamp freshtime freshdate echo %freshdate% - %freshtime% - Some data >> "%freshdate - Somelog.log" :timestamp set hour=%time:~0,2% if "%hour:~0,1%" == " " set hour=0%hour:~1,1% set min=%time:~3,2% if "%min:~0,1%" == " " set min=0%min:~1,1% set secs=%time:~6,2% if "%secs:~0,1%" == " " set secs=0%secs:~1,1% set FreshTime=%hour%:%min%:%secs% set year=%date:~-4% set month=%date:~4,2% if "%month:~0,1%" == " " set month=0%month:~1,1% set day=%date:~7,2% if "%day:~0,1%" == " " set day=0%day:~1,1% set FreshDate=%month%.%day%.%year%
我知道这是一个旧的post,但有一个更简单的答案(尽pipe也许它只适用于更新版本的Windows)。 只需使用DATE和TIME dos命令的/ t参数来仅显示date或时间,而不会提示您设置它,如下所示:
@echo off echo Starting test batch file > testlog.txt date /t >> testlog.txt time /t >> testlog.txt
这适用于(我的)德语区域设置,应该可以根据您的需要进行调整。
forfiles /p *PATH* /m *filepattern* /c "cmd /c ren @file %DATE:~6,4%%DATE:~3,2%%DATE:~0,2%_@file"