我试图从W3C日志文件中获取值(IP地址)(有点像文本文件)。这是我到目前为止,但没有运气:
Set filename=ex%date:~-2,4%%date:~-10,2%%date:~-7,2%.log
For /F "tokens=2 delims=: . " %%A in ('E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%') do (Set ip=%%A)
,日志文件如下:
# Software: Microsoft Internet Information Services 6.0 # Version: 1.0 #Date: 2009-01-10 20:58:16 #Fields: time c-ip cs-method cs-uri-stem sc-status sc-win32-status #20:58:16 10.10.1.111 [25]USER anonymous 331 0
所以IP地址位于第5行第二栏(10.10.1.111)
任何反馈都将不胜感激!
答案 0 :(得分:3)
你试过Microsoft Log Parser吗?据说它支持开箱即用的W3C风格的日志文件。我不知道你要做什么,但它可能比手工制作批处理文件更容易。
或者,安装AWK(例如来自Cygwin)。甚至是Perl--这是它的存在理由。
答案 1 :(得分:1)
将您的for
行更改为:
For /F "skip=4 tokens=2" %%A in (E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%) do (
Set ip=%%A
goto :DONE
)
:DONE
@echo IP = %ip%
:: Continue script
skip=4
将忽略日志文件的前四行并开始解析第五行。
您需要goto
停止解析文件中的其余行,否则您将遍历整个文件,ip
将等于最后一行的第二个标记,这可能是也可能不是IP地址。
默认分隔符是空格,因此您无需使用delims
arg更改此分隔符。您只需要第二个令牌,即IP地址。
您不需要将文件名括在单引号中,因为您正在解析文件的内容,而不是文件名字符串。如果文件名包含嵌入的空格,则必须使用此for
行:
For /F "usebackq skip=4 tokens=2" %%A in ("E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%") do (