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
#フィールド:time c-ip cs-method cs-uri-stem sc-status sc-win32-status
#20:58:1610.10.1.111[25]ユーザー匿名3310

したがって、IPアドレスは5行目の2列目にあります(10.10.1.111)

フィードバックをいただければ幸いです。

4

2 に答える 2

3

Microsoft Log Parserを試しましたか?おそらく、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ログ ファイルの最初の 4 行を無視し、5 行目の解析を開始します。ファイル内の残りの行の解析を停止する必要がありgotoます。そうしないと、ファイル全体をスピンしてip、最後の行の 2 番目のトークンに等しくなります。これは、IP アドレスである場合とそうでない場合があります。

delimsデフォルトの区切り文字はスペースなので、これを引数で変更する必要はありません。IP アドレスである 2 番目のトークンだけが必要です。

ファイル名の文字列ではなく、ファイルの内容を解析しているため、ファイル名を一重引用符で囲む必要はありません。ファイル名にスペースが含まれている場合は、for代わりに次の行を使用する必要があります。

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