1

我试图从 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)

日志文件如下所示:

# 软件:Microsoft Internet Information Services 6.0
# 版本:1.0
#日期:2009-01-10 20:58:16
#Fields: 时间 c-ip cs-method cs-uri-stem sc-status sc-win32-status
#20:58:16 10.10.1.111 [25]用户匿名 331 0

所以IP地址在第5行第二列(10.10.1.111)

对于任何反馈,我们都表示感谢!

4

2 回答 2

3

您是否尝试过Microsoft 日志解析器?据说它开箱即用地支持 W3C 风格的日志文件。我不知道您要做什么,但这可能比手工制作批处理文件更容易。

或者,安装 AWK(例如来自 Cygwin)。甚至 Perl——这是它存在的理由。

于 2009-01-11T06:39:58.487 回答
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将忽略日志文件的前四行并开始解析第 5 行。您需要goto停止解析文件中的其余行,否则您将遍历整个文件并ip等于最后一行的第二个标记,它可能是也可能不是 IP 地址。

默认分隔符是空格,因此您无需使用delimsarg 进行更改。您只需要第二个令牌,即 IP 地址。

您不需要将文件名括在单引号中,因为您正在解析文件的内容,而不是文件名字符串。如果文件名嵌入了空格,则必须改用此for行:

For /F "usebackq skip=4 tokens=2" %%A in ("E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%") do (
于 2009-01-11T14:06:45.807 回答