查询 Windows 搜索索引时出现问题



我想编写一个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

我在互联网上读到,尤其是第一个错误是由于使用了关键字而导致的,但我在查询中没有看到任何保留关键字,正如我已经说过的,它有时有效。这是争用条件还是内存问题?我在具有 10 GB RAM 的 Windows 1703 企业版上运行它。

编辑: 我得到了一些新的见解。

  1. 如果我第一次运行脚本,它通常有效。如果我再次运行它,很可能会发生崩溃,但我还没有找到这两次运行之间的等待时间。
  2. 如果它崩溃,则事件查看器中的应用程序日志中有一个条目,指出 IndexSearcher.exe 有问题。
  3. 问题似乎出在 System.Search.Rank 字段上。如果我删除它,它会完美运行。但是,我需要排名,因为否则我无法过滤错误的结果(由于 NEAR-搜索(。你知道NEAR搜索的替代品吗?

问题2

实际上,我希望有命中突出显示,向我显示文件中找到的匹配项的片段。但是,MSDN 声明最初用于此目的的 API 已弃用。我在stackoverflow上读到我必须使用资源管理器shell接口,但我不知道如何做到这一点。你能提供一个工作的例子吗?

谢谢和最好的问候, 汉斯

我可以重现错误,麻烦制造者似乎令人惊讶的是SQL中的"NEAR"语句。这个解决方案对我有用:

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

最新更新