Я хочу написать сценарий 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 ГБ ОЗУ.
РЕДАКТИРОВАТЬ: я получил некоторые новые идеи.
- Если я запускаю сценарий в первый раз, онобычно работает.Если я запустлю его снова, вероятнее всего произойдут сбои, но я не нашел времени ожидания между этими двумя запусками.
- В случае сбоя в журнале приложений в Event Viewer есть запись, котораяIndexSearcher.exe был неисправен.
- Кажется, проблема в поле System.Search.Rank.Если я удаляю его, он работает безупречно.Однако мне нужен ранг, потому что иначе я не могу отфильтровать неправильные результаты (из-за NEAR-поиска).Знаете ли вы замену для NEAR-поиска?
Задача 2
На самом деле, я хотел бы, чтобы подсветка совпадений показывала мне фрагмент найденных совпадений в файле.Однако в MSDN говорится, что API, изначально использовавшийся для этого, устарел.Я прочитал на stackoverflow, что мне придется использовать интерфейс оболочки проводника, но я понятия не имею, как это сделать.Можете ли вы привести рабочий пример?
Спасибо и наилучшие пожелания, Ганс