Как искать Windows Search, проиндексированный в файле

У меня есть файлы, проиндексированные службой поиска Windows. Мне нужна функция, которая может найти некоторую строку в текстовых файлах. У меня есть скрипт в PowerShell, но он не работает нормально.

function search {
    param($path, $word)

    $c = $path + "\%"
    $query = "SELECT
        System.ItemName, System.ItemPathDisplay
    FROM SystemIndex
    WHERE System.ItemPathDisplay LIKE '$c' AND CONTAINS('$word')"

    $ADOCommand = New-Object -ComObject ADODB.Command
    $ADOConnection = New-Object -ComObject ADODB.Connection
    $RecordSet = New-Object -ComObject ADODB.RecordSet
    $ADOConnection.Open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")

    $RecordSet.Open($query, $ADOConnection) 
    try { $RecordSet.MoveFirst() }
    catch [System.Exception] { "no records returned" }
    while (-not($RecordSet.EOF)) {
        if ($locatedFile) { Remove-Variable locatedFile }
        $locatedFile = New-Object -TypeName PSObject
        Add-Member -InputObject $locatedFile -MemberType NoteProperty -Name 'Name' -Value ($RecordSet.Fields.Item("System.ItemName")).Value
        Add-Member -InputObject $locatedFile -MemberType NoteProperty -Name 'Path' -Value ($RecordSet.Fields.Item("System.ItemPathDisplay")).Value
        $locatedFile
        $RecordSet.MoveNext()
    }

    $RecordSet.Close()
    $ADOConnection.Close()
    $RecordSet = $null
    $ADOConnection = $null
    [gc]::Collect()  
}

Если $word = "Hello" это прекрасно работает для файлов, где у нас есть

* немного текста * Привет * немного текста *

в файле, но не тогда, когда у нас есть Hello без пробелов, таких как:

Привет, мир

Мы также не можем искать, когда $word это фраза, например "Hello World".

Кто-нибудь знает, как это исправить?

1 ответ

Я считаю, что проблема с CONTAINS в вашем запросе. Вы должны добавить подстановочный знак (*) к слову, которое вы ищете. Так что вместо:

 WHERE System.ItemPathDisplay LIKE '$c' AND CONTAINS('$word')

пожалуйста, попробуй:

WHERE System.ItemPathDisplay LIKE '$c' AND CONTAINS('*$word*')
Другие вопросы по тегам