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

时间:2018-05-24 16:37:10

标签: windows powershell search

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

我在网上看到,特别是第一个错误来自使用的关键字,但我在查询中看不到任何保留的关键字,正如我已经说过的,它有时会起作用。这是竞争条件还是记忆问题?我在具有16 GB RAM的Windows 10 Enterprise 1703上运行此功能。

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

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

    实际上,我想点击突出显示我在文件中找到匹配的片段。但是,MSDN声明最初使用的API已弃用。我读了stackoverflow,我将不得不使用一个资源管理器shell接口,但我不知道如何做到这一点。你能提供一个有效的例子吗?

    谢谢和最诚挚的问候, 汉斯

1 个答案:

答案 0 :(得分:1)

我可以重现错误,麻烦制造者似乎出乎意料地在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