0

それぞれ数千行のテキストファイルがいくつかあり、これは典型的な行の例です。

PCI\VEN_10EC&DEV_8168&REV_09    Realtek\5x64\FORCED\PCIe_5.810.1218.2012\   Netrtle.inf Realtek 1   12/18/2012,5.810.1218.2012  Realtek PCIe GBE Family Controller

私が取り組んでいるスクリプトは、テキストの最初のセグメントの文字列検索を行います。

PCI\VEN_10EC&DEV_8168&REV_09

私のスクリプトは、この文字列を含むファイルを絞り込みますが、本当に必要なのは、同じ行の次の文字列を返すことです。

Realtek\5x64\FORCED\PCIe_5.810.1218.2012\

この文字列を取得したら、7zip から Realtek フォルダーを抽出するスクリプトの残りの部分を続行できます。

これがスタック上の他の言語で行われているのを見たことがありますが、VBS については何も見つかりません。タスクをより適切に表現する方法を知っていれば、おそらく答えを見つけることができたでしょう. その2番目の文字列をつかむためのアドバイスをいただければ幸いです。

背景として、これは私が取り組んでいるスクリプトです。C:\scripts\ 内のすべてのテキスト ファイルを調べて、コード 28 (ドライバーがインストールされていない) のデバイス ドライバーの CompatibleID を求める WMI クエリによって返される文字列を探します。

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objShell = CreateObject("Wscript.Shell") 
Set objNet = CreateObject("WScript.Network") 
Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery _ 
    ("Select * from Win32_PnPEntity " _ 
        & "WHERE ConfigManagerErrorCode = 28") 
For Each objItem in colItems 
 Dim arrCompatibleIDs
 aarCompatibleIDs = objItem.CompatibleID
 for each objComp in aarCompatibleIDs
 Dim FirstID
 FirstID = objComp
Exit For
Next 
Next

strSearchFor = firstID
objStartFolder = "C:\scripts"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile in colFiles
    'Wscript.Echo objFile.Name
    strFile = "C:\scripts\" & objFile.Name
    set objFile = objFSO.getFile(strFile)
    if objFile.size > 0 then
        If InStr(objFSO.OpenTextFile(strFile).ReadAll, strSearchFor) > 0 Then
            msgbox(objfile.name)
        Else
            WScript.Sleep (100)
        End If
    End If
Next
4

2 に答える 2

0

干し草の山で固定針と可変スレッドを検索する必要がある場合は、いくつかの InStr() または RegExp を使用できます。開始するには:

  Dim sHaystack : sHaystack = Join(Array( _
       "hay hay" _
     , "fixed_needle variable_thread hay" _
     , "hay hay" _
  ), vbCrLf)
  Dim sNeedle : sNeedle = "fixed_needle" & " "
  Dim nPosN   : nPosN   = Instr(sHaystack, sNeedle)
  If 0 < nPosN Then
     nPosN = nPosN + Len(sNeedle)
     Dim nPosT : nPosT = Instr(nPosN, sHaystack, " ")
     If 0 < nPosN Then
        WScript.Echo "Instr()", qq(Mid(sHaystack, nPosN, nPosT - nPosN))
     Else
        WScript.Echo "no thread"
     End If
  Else
     WScript.Echo "no needle"
  End If
  Dim reNT : Set reNT = New RegExp
  reNT.Pattern = sNeedle & "(\S+) "
  Dim oMTS : Set oMTS = reNT.Execute(sHayStack)
  If 1 = oMTS.Count Then
     WScript.Echo "RegExp ", qq(oMTS(0).SubMatches(0))
  Else
     WScript.Echo "no match"
  End If

出力:

Instr() "variable_thread"
RegExp  "variable_thread"

干し草の山を

  Dim sHaystack : sHaystack = Join(Array( _
       "hay hay" _
     , "fixed_needle no_variable_thread_hay" _
     , "hay hay" _
  ), vbCrLf)

出力:

Instr() "no_variable_thread_hay
hay"
no match

Instr() を防弾に近づけるには、さらに多くの作業が必要であることがわかります。

于 2013-05-28T08:18:40.060 に答える
0

入力ファイルはタブで区切られているように見えるので、次のようにすることができます。

Set wmi = GetObject("winmgmts://./root/cimv2")
qry = "SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode = 28"
For Each entity In wmi.ExecQuery(qry)
  For Each cid In entity.CompatibleID
    firstID = cid
    Exit For
  Next
Next

Set fso = CreateObject("Scripting.FileSystemObject")
For Each f In objFSO.GetFolder(objStartFolder).Files
  If f.Size > 0 Then
    For line In Split(f.OpenAsTextStream.ReadAll, vbNewLine)
      arr = Split(line, vbTab)
      If arr(0) = firstID Then MsgBox arr(1)
    Next
  End If
Next

より一般的な注意として、次のようなことはすべきではありません。

Set colFiles = objFolder.Files
For Each objFile in colFiles
  strFile = "C:\scripts\" & objFile.Name
  set objFile = objFSO.getFile(strFile)
  if objFile.size > 0 then
    If InStr(objFSO.OpenTextFile(strFile).ReadAll, strSearchFor) > 0 Then
...

Filesコレクションには既にオブジェクトが含まれているFileため、オブジェクトのプロパティ (Path完全なパスを提供するプロパティが含まれています) からパス名を作成しても、既に持っているものとまったく同じオブジェクトを取得することはまったく無意味です。また、ファイルオブジェクトにはメソッドOpenAsTextStreamがあるので、 のように迂回せずに直接テキストファイルとして開くことができますobjFSO.OpenTextFile(f.Path)

于 2013-05-28T18:40:56.480 に答える