我想从使用DOS看起来像这样的文件中的最后两行获取时间戳:
2/3/2013 18:30:00 This is line 1 2/3/2013 19:24:05 This is line 2 2/3/2013 20:10:40 This is line 3 2/3/2013 21:06:00 This is line 4 2/3/2013 22:50:31 This is line 5
目前,我的脚本如下所示:
setlocal EnableDelayedExpansion
set i=0
for /f "tokens=2" %%x in (inputfile.txt) do (
set /a i=!i!+1
set time!i!=%%x
)
set /a lasttime=time!i!
set /a j=!i!-1
set /a prevtime=time!j!
echo %lasttime%
echo %prevtime%
endlocal
输出只有小时部分,没有分钟和秒:
21
22
请告诉我如何使其发挥作用。
答案 0 :(得分:2)
问题是您使用SET /A
命令分配lasttime
和prevtime
。
SET /A
用于算术运算,并且您提供的所有内容都必须转换为数字,即使您没有对该值进行任何操作,除了将其存储到另一个变量之外。您的time!i!
引用的计算结果为22:50:31
,但在SET /A
命令的上下文中,它会立即转换为最接近的数值22
。 time!j!
也是如此。
要解决此问题,只需使用简单的SET
命令和混合扩展,如下所示:
...
set lasttime=!time%i%!
set /a j=!i!-1
set prevtime=!time%j%!
...
此外,如果您只需要最后两行,您可以考虑另一种方法。您可以只使用两个来代替为文本的每一行使用单独的变量:一个用于存储当前行,另一个用于存储前一个值。这就是我的意思:
setlocal EnableDelayedExpansion
for /f "tokens=2" %%x in (inputfile.txt) do (
set prevtime=!lasttime!
set lasttime=%%x
)
echo %lasttime%
echo %prevtime%
endlocal