Проблемы с запросом поискового индекса Windows - PullRequest
0 голосов
/ 24 мая 2018

Я хочу написать сценарий powershell, который ищет в индексе Windows файлы, содержащие имена, которые предоставляются в качестве параметра для сценария.Я искал в Интернете и нашел следующее решение:

function Search-FileInIndex ($firstname, $lastname) {
$sql = "SELECT System.ItemName, System.DateCreated, System.ItemPathDisplay, System.Search.Rank FROM SYSTEMINDEX WHERE CONTAINS('`"$($firstname)`" NEAR `"$($lastname)`"') and SCOPE= 'c:\' and System.Search.Rank > 0 ORDER BY System.ItemPathDisplay"
$provider = "provider=search.collatordso;extended properties=’Application=Windows’;" 
$connector = new-object system.data.oledb.oledbdataadapter -argument $sql, $provider 
$dataset = new-object system.data.dataset 
if ($connector.fill($dataset)) {
    $dataset.tables[0] | format-table -autosize *
}

$dataset.Dispose()
$connector.Dispose()

}

Search-FileInIndex john doe

Однако у меня есть две проблемы.

Проблема 1

Предоставленное решение работает и находит файлы,но иногда я получаю действительно странные сообщения об ошибках, подобные этим, которые приводят к исключению вместо списка файлов:

    Ausnahme beim Aufrufen von "Fill" mit 1 Argument(en):  "Fehler E_FAIL(0x80004005) in IErrorInfo.GetDescription."
    In C:\Search-FileInIndex.ps1:11 Zeichen:9
    +     if ($connector.fill($dataset)) {
    +         ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : OleDbException

или

    Ausnahme beim Aufrufen von "Fill" mit 1 Argument(en):  "Die Pipe wurde beendet."
    In C:\Search-FileInIndex.ps1:11 Zeichen:9
    +     if ($connector.fill($dataset)) {
    +         ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : OleDbException

Я прочитал в Интернете, что особенно первая ошибкарезультат использования ключевых слов, но я не вижу зарезервированных ключевых слов в своем запросе, и, как я уже сказал, иногда это работает.Это состояние гонки или проблема с памятью?Я запускаю это на Windows 10 Enterprise 1703 с 16 ГБ ОЗУ.

РЕДАКТИРОВАТЬ: я получил некоторые новые идеи.

  1. Если я запускаю сценарий в первый раз, онобычно работает.Если я запустлю его снова, вероятнее всего произойдут сбои, но я не нашел времени ожидания между этими двумя запусками.
  2. В случае сбоя в журнале приложений в Event Viewer есть запись, котораяIndexSearcher.exe был неисправен.
  3. Кажется, проблема в поле System.Search.Rank.Если я удаляю его, он работает безупречно.Однако мне нужен ранг, потому что иначе я не могу отфильтровать неправильные результаты (из-за NEAR-поиска).Знаете ли вы замену для NEAR-поиска?

Задача 2

На самом деле, я хотел бы, чтобы подсветка совпадений показывала мне фрагмент найденных совпадений в файле.Однако в MSDN говорится, что API, изначально использовавшийся для этого, устарел.Я прочитал на stackoverflow, что мне придется использовать интерфейс оболочки проводника, но я понятия не имею, как это сделать.Можете ли вы привести рабочий пример?

Спасибо и наилучшие пожелания, Ганс

1 Ответ

0 голосов
/ 26 мая 2018

Я могу воспроизвести ошибку, и нарушитель спокойствия кажется удивительно оператором NEAR в SQL.Это решение работает для меня:

function Search-FileInIndex($firstname, $lastname) {

    $con = New-Object -ComObject ADODB.Connection
    $rs  = New-Object -ComObject ADODB.Recordset
    $sql = "SELECT System.ItemName, System.DateCreated, System.ItemPathDisplay, System.Search.Rank FROM SYSTEMINDEX WHERE CONTAINS(System.Search.Contents, '$($firstname)') and CONTAINS(System.Search.Contents, '$($lastname)') and SCOPE= 'c:\' and System.Search.Rank > 0 ORDER BY System.ItemPathDisplay"

    $con.Open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")
    $rs.Open($sql, $con)

    While(-Not $rs.EOF){
        $rs.Fields.Item("System.ItemPathDisplay").Value
        $rs.MoveNext()
    }
    $rs.Close()
    $con.Close()
}

Search-FileInIndex john doe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...