-4

このスクリプトを作成しようとしていますが、完全に失敗しました。

入力ボックスから文字列を収集したいので、その文字列をテキスト ファイル 1 で検索します。テキスト ファイル 1 に存在する場合は、結果を取得してファイル 2 で検索します。結果は、msgbox または text に表示されます。ファイルまたはコピーできる場所。

ファイル名と場所は、入力ボックスから入力する必要なく、特定の場所に固定できます。

わかりました、それをより明確にするために別の例を作ります。

Log1.txt

\\10.128.214.01      RU00001      Windows 2002 Serv     0 00:02:54

\\10.128.214.02      RU00002      Windows 2002 Serv     0 00:02:54

\\10.128.214.03      RU00003      Windows 2002 Serv     0 00:02:54

log2.txt

10.128.214.01   RUDH99991   255.255.255.0   10-60-4b-7c-e3-F1   17.07.2013 14:10:21 DHCP
10.128.214.02   RUDH99992   255.255.255.0   10-60-4b-7c-e3-F2   17.07.2013 16:23:40 DHCP
10.128.214.03   RUDH99993   255.255.255.0   10-60-4b-7c-e3-F3   17.07.2013 17:19:30 DHCP

入力ボックスから文字列を検索RU00001すると、結果RUDH99991またはその行全体が表示されます。

例は実際のlog1and とまったく同じなlog2ので、上に示されているのはlog1andlog2です。


そして、これは実際のログからの 2 行で、各ログにはこの形式の約 500 行が含まれています。

Log1.txt

\\10.135.0.106          RUX0031              Windows 2002 Serv     1 00:01:44 

Log2.txt

10.135.0.106    RU-NMR-D0125.dc1.dc2.dc3.net    255.255.255.0   00-FF-FF-FF-19-dd   INACTIVE    DHCP

データはスコープなどで変更されています。大きなファイルです。おわかりのとおりです。

4

3 に答える 3

2

見てみな:

@echo OFF &SETLOCAL
SET /p "search=Enter search string (ru1, ru2, ru3): "
SET "chain="
SET "found="
FOR /f "delims=() " %%a IN ('^<log1.txt find "%search%"') DO SET "chain=%%a"
IF NOT DEFINED chain ECHO NOT found: %search% & GOTO :EOF
FOR /f "tokens=2delims=() " %%a IN ('^<log2.txt find "%chain%"') DO SET "found=%%a"
IF NOT DEFINED found ECHO NOT found: %chain% & GOTO :EOF
ECHO FOUND %found%
于 2013-07-09T21:22:09.157 に答える
1

このスクリプトは、値をコンソール ウィンドウに表示し、値をクリップボードにコピーします。値が見つからない場合、何も表示されず、クリップボードはクリアされます。

@echo off
set /p  "search=Enter a search term: "

REM Clear the clipboard
(call )|clip

for /f "delims=\ " %%A in (
  'findstr /rc:"^[^ ]* *%search% " log1.txt'
) do for /f "tokens=2 delims= " %%B in (
  'findstr /rc:"^%%A " log2.txt'
) do (

  REM display the value to the screen
  echo %%B

  REM copy the value (without new line) to the clip board
  <nul set /p "=%%B"|clip
)

いずれかのファイルの形式が変更された場合、FINDSTR 検索文字列と FOR /F オプションを変更する必要があることは明らかです。

于 2013-07-10T00:13:20.750 に答える
1

使用:

Set fso = CreateObject("Scripting.FileSystemObject")
l1 = fso.OpenTextFile("C:\path\to\log1.txt").ReadAll
l2 = fso.OpenTextFile("C:\path\to\log2.txt").ReadAll

Set re = New RegExp
re.MultiLine = True
're.IgnoreCase = True   'uncomment if you want case-insensitive matches

searchString = InputBox("Enter search string.")

re.Pattern = "\\\\(\S+)\s*" & searchString
For Each m1 In re.Execute(l1)
  re.Pattern = "^" & m1.SubMatches(0) & "\s*(\S+)"
  For Each m2 In re.Execute(l2)
    WScript.Echo m2.SubMatches(0)
  Next
Next

でスクリプトを実行するcscript.exeと、コマンド プロンプトから出力をコピーできます。


入力ファイルが非常に大きい (たとえば、サイズが 1 GB を超える) 場合、ファイルのコンテンツ全体を読み取ると、メモリの枯渇によりパフォーマンスが低下する可能性があります。その場合、ファイルを 1 行ずつ処理する方がよいでしょう。

Set fso = CreateObject("Scripting.FileSystemObject")

Set re = New RegExp
're.IgnoreCase = True   'uncomment if you want case-insensitive matches

searchString = InputBox("Enter search string.")

re.Pattern = "\\\\(\S+)\s*" & searchString
Set f = fso.OpenTextFile("C:\path\to\log1.txt")
Do Until f.AtEndOfStream
  For Each m In re.Execute(f.ReadLine)
    match = m.SubMatches(0)
    Exit Do
  Next
Loop
f.Close

If IsEmpty(match) Then WScript.Quit  'no match found

re.Pattern = "^" & match & "\s*(\S+)"
Set f = fso.OpenTextFile("C:\path\to\log2.txt")
Do Until f.AtEndOfStream
  For Each m In re.Execute(f.ReadLine)
    WScript.Echo m.SubMatches(0)
    Exit Do
  Next
Loop
f.Close

これは、ファイル処理を関数にカプセル化することで簡素化できます。

Set fso = CreateObject("Scripting.FileSystemObject")

Function FindMatch(filename, pattern)
  Set re = New RegExp
  re.Pattern = pattern
  're.IgnoreCase = True   'uncomment if you want case-insensitive matches

  Set f = fso.OpenTextFile(filename)
  Do Until f.AtEndOfStream
    For Each m In re.Execute(f.ReadLine)
      FindMatch = m.SubMatches(0)
      Exit Do
    Next
  Loop
  f.Close
End Function

searchString = InputBox("Enter search string.")

match1 = FindMatch("C:\path\to\log1.txt", "\\\\(\S+)\s*" & searchString)

If IsEmpty(match1) Then WScript.Quit  'no match found

match2 = FindMatch("C:\path\to\log2.txt", "^" & match1 & "\s*(\S+)")

If Not IsEmpty(match2) Then WScript.Echo match2

ただし、わずか 500 行のファイルの場合は、コードがはるかに単純であるため、最初のバージョンに固執します。


ところで、見つかった一致をとにかくクリップボードにコピーしたい場合は、次のようにスクリプトから直接行うことができます。

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate("about:blank")
While ie.Busy : WScript.Sleep 100 : Wend
ie.document.ParentWindow.ClipboardData.SetData "text", m.SubMatches(0)
ie.Quit

about:blankただし、これを機能させるには、ローカル イントラネット ゾーンに追加する必要があります (セキュリティ設定Allow Programmatic clipboard accessを有効にする必要があります)。

于 2013-07-09T21:59:18.857 に答える