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中为短日期指定的格式.
这是一种与语言环境无关的方法,可以从此答案中提取当前日期,但它取决于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
Run Code Online (Sandbox Code Playgroud)
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)
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)
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文件是隐藏丑陋细节的好方法,更重要的是,避免拼写错误.
因为将它们撕裂%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-date
是here,包含 .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)
归档时间: |
|
查看次数: |
285845 次 |
最近记录: |