在for循环中设置来自token的变量

时间:2011-04-01 10:23:40

标签: windows batch-file substring

我试图在windows bacth中复制一个shell脚本。 我正在接近但我目前仍在尝试将日期时间标记子串起来输出时间。

    @echo off
echo."Location","Date Time","Result" > output2.csv
( for %%a in (z:\logdir\*.log) do (
for /f "tokens=1,2,3,4,5,6,7,8,9,10 delims=[+]" %%B in ('findstr /g:searchstrings.txt  ^< %%a') do (
set time=%%B
set time1=%time:~-6%
echo."%%a","%_time1%","%%B","%%F") 
)
) >> output2.csv

日志文件包含许多条目,但是这个脚本应该并且确实只是执行以下行

[20110314T103852][EMVLib][5056][I000000]:  Verification: SUCCESS

[20110314T103902][CSV][3232][D000000]: SendResponse: Response message

这些搜索字符串由文件searchstrings.txt

定义

所以简而言之,我的脚本当前输出一个带有日志名称,日期/时间戳[20110314T103852]的csv和消息(验证:SUCCESS和SendResponse:响应消息。

但我想要的是它只将时间元素输出到第二列。

理想情况下,这个脚本需要计算每个元素的时间差,但上帝只知道如何(是的,这是一个问题)

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:2)

关键在于延迟变量扩展 !VAR!而不是%var%,因为延迟扩展在行执行时扩展,扩展百分比在解析时扩展,在您的情况下,完整的for-block在执行之前首先被解析。
因此,行set time1=%time:~-6%无法工作,因为它在设置time-var之前会扩展。

@echo off
setlocal EnableDelayedExpansion
echo."Location","Date Time","Result" > output2.csv
( 
  for %%a in (z:\logdir\*.log) do (
    for /f "tokens=1,2,3,4,5,6,7,8,9,10 delims=[+]" %%B in ('findstr /g:searchstrings.txt  ^< %%a') do (
      set time=%%B
      set time1=!time:~-6!
      echo."%%a","!time1!","%%B","%%F"
    ) 
  )
) >> output2.csv