我一直在尝试找到一种以编程方式获取索引进度信息的方法(还有多少文件需要处理或“索引已完成”)。我偶然发现了 Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer 类,它显示的零的数量让我感到惊讶,尤其是“IndexSize”旁边的零。
索引选项显示已索引 5055 个项目,因此,以我简单的想法来说,索引的大小应该是非零的。
这些零代表什么信息?我是不是看错了类别?如果是,我应该做些什么来得到不同的数字吗?
这是在 Windows 8.1 上,但我实际上想在其上执行此类操作的计算机是 Windows 7 和 Windows 10 系统。
我现在正在使用 Windows 10 计算机,它看起来有点不同。ActiveConnections 在这里显示 2 而不是 0。我还注意到,在两台计算机上,FormattedData 中缺少的一些属性 Frequency_Sys100NS 都显示在 RawData 中:
原始数据:
PS C:\WINDOWS\system32> gwmi Win32_PerfRawData_WSearchIdxPi_SearchIndexer
__GENUS : 2
__CLASS : Win32_PerfRawData_WSearchIdxPi_SearchIndexer
__SUPERCLASS : Win32_PerfRawData
__DYNASTY : CIM_StatisticalInformation
__RELPATH : Win32_PerfRawData_WSearchIdxPi_SearchIndexer.Name="SystemIndex"
__PROPERTY_COUNT : 72
__DERIVATION : {Win32_PerfRawData, Win32_Perf, CIM_StatisticalInformation}
__SERVER : WRW-MXM0121
__NAMESPACE : root\cimv2
__PATH : \\WRW-MXM0121\root\cimv2:Win32_PerfRawData_WSearchIdxPi_SearchIndexer.Name="SystemIndex"
ActiveConnections : 2
Caption :
CleanWidSets : 0
Description :
DirtyWidSets : 0
DocumentsFiltered : 0
Frequency_Object : 0
Frequency_PerfTime : 0
Frequency_Sys100NS : 10000000
IndexSize : 0
L0IndexesWordlists : 1
L0MergeFlushCount : 0
L0MergeFlushSpeedAverage : 0
L0MergeFlushSpeedLast : 0
L0MergesflushesNow : 0
L1MergeCount : 0
L1MergesNow : 0
L1MergeSpeedaverage : 0
L1MergeSpeedlast : 0
L2MergeCount : 0
L2MergesNow : 0
L2MergeSpeedaverage : 0
L2MergeSpeedlast : 0
L3MergeCount : 0
L3MergesNow : 0
L3MergeSpeedaverage : 0
L3MergeSpeedlast : 0
L4MergeCount : 0
L4MergesNow : 0
L4MergeSpeedaverage : 0
L4MergeSpeedlast : 0
L5MergeCount : 0
L5MergesNow : 0
L5MergeSpeedaverage : 0
L5MergeSpeedlast : 0
L6MergeCount : 0
L6MergesNow : 0
L6MergeSpeedaverage : 0
L6MergeSpeedlast : 0
L7MergeCount : 0
L7MergesNow : 0
L7MergeSpeedaverage : 0
L7MergeSpeedlast : 0
L8MergeCount : 0
L8MergesNow : 0
L8MergeSpeedaverage : 0
L8MergeSpeedlast : 0
MasterIndexLevel : 0
MasterMergeProgress : 0
MasterMergesNow : 0
MasterMergestoDate : 0
Name : SystemIndex
PersistentIndexes : 4
PersistentIndexesL1 : 0
PersistentIndexesL2 : 0
PersistentIndexesL3 : 0
PersistentIndexesL4 : 0
PersistentIndexesL5 : 0
PersistentIndexesL6 : 0
PersistentIndexesL7 : 0
PersistentIndexesL8 : 0
Queries : 520
QueriesFailed : 1
QueriesSucceeded : 519
ShadowMergeLevels : 0
ShadowMergeLevelsThreshold : 0
Timestamp_Object : 0
Timestamp_PerfTime : 0
Timestamp_Sys100NS : 131122139817760000
UniqueKeys : 0
WorkItemsCreated : 0
WorkItemsDeleted : 0
PSComputerName : WRW-MXM0121
格式化数据:
PS C:\WINDOWS\system32> gwmi Win32_PerfRawData_WSearchIdxPi_SearchIndexer
__GENUS : 2
__CLASS : Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer
__SUPERCLASS : Win32_PerfFormattedData
__DYNASTY : CIM_StatisticalInformation
__RELPATH : Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer.Name="SystemIndex"
__PROPERTY_COUNT : 72
__DERIVATION : {Win32_PerfFormattedData, Win32_Perf, CIM_StatisticalInformation}
__SERVER : WRW-MXM0121
__NAMESPACE : root\cimv2
__PATH : \\WRW-MXM0121\root\cimv2:Win32_PerfFormattedData_WSearchIdxPi_SearchIndexer.Name="SystemIn
dex"
ActiveConnections : 2
Caption :
CleanWidSets : 0
Description :
DirtyWidSets : 0
DocumentsFiltered : 0
Frequency_Object :
Frequency_PerfTime :
Frequency_Sys100NS :
IndexSize : 0
L0IndexesWordlists : 1
L0MergeFlushCount : 0
L0MergeFlushSpeedAverage : 0
L0MergeFlushSpeedLast : 0
L0MergesflushesNow : 0
L1MergeCount : 0
L1MergesNow : 0
L1MergeSpeedaverage : 0
L1MergeSpeedlast : 0
L2MergeCount : 0
L2MergesNow : 0
L2MergeSpeedaverage : 0
L2MergeSpeedlast : 0
L3MergeCount : 0
L3MergesNow : 0
L3MergeSpeedaverage : 0
L3MergeSpeedlast : 0
L4MergeCount : 0
L4MergesNow : 0
L4MergeSpeedaverage : 0
L4MergeSpeedlast : 0
L5MergeCount : 0
L5MergesNow : 0
L5MergeSpeedaverage : 0
L5MergeSpeedlast : 0
L6MergeCount : 0
L6MergesNow : 0
L6MergeSpeedaverage : 0
L6MergeSpeedlast : 0
L7MergeCount : 0
L7MergesNow : 0
L7MergeSpeedaverage : 0
L7MergeSpeedlast : 0
L8MergeCount : 0
L8MergesNow : 0
L8MergeSpeedaverage : 0
L8MergeSpeedlast : 0
MasterIndexLevel : 0
MasterMergeProgress : 0
MasterMergesNow : 0
MasterMergestoDate : 0
Name : SystemIndex
PersistentIndexes : 4
PersistentIndexesL1 : 0
PersistentIndexesL2 : 0
PersistentIndexesL3 : 0
PersistentIndexesL4 : 0
PersistentIndexesL5 : 0
PersistentIndexesL6 : 0
PersistentIndexesL7 : 0
PersistentIndexesL8 : 0
Queries : 523
QueriesFailed : 1
QueriesSucceeded : 522
ShadowMergeLevels : 0
ShadowMergeLevelsThreshold : 0
Timestamp_Object :
Timestamp_PerfTime :
Timestamp_Sys100NS :
UniqueKeys : 0
WorkItemsCreated : 0
WorkItemsDeleted : 0
PSComputerName : WRW-MXM0121
下面是 mmc.exe 中搜索索引器性能计数器的示例(这也是在 Windows 10 计算机上,但在 Windows 8.1 计算机上看起来相同)。它只是一条在屏幕上移动的垂直线 - 在这种情况下,计数器是索引大小。
Powershell 的 get-counter 运行截图:
答案1
该 WMI 类似乎在某种程度上被破坏了。幸运的是,有一个解决方法,尽管它确实需要更多的工作。您需要下载Windows 搜索 3 SDK。这只是一个自解压的 ZIP 文件,您可以将文件放在任何您喜欢的位置。我们只对Microsoft.Search.Interop.dll
Managed 文件夹下的一个文件感兴趣。将该 DLL 加载到 PowerShell 中:
Add-Type -Path "Microsoft.Search.Interop.dll"
那么你需要一个搜索管理器对象。如果你想获取本地机器的,只需这样:
$manager = New-Object Microsoft.Search.Interop.CSearchManagerClass
如果您想访问远程机器,那么是时候绕道了。
我们需要 COM 类的 GUID,它是我从某个 C 头文件中提取出来的:
$guid = New-Object guid "{7D096C5F-AC08-4F1F-BEB7-5C22C517CE39}"
我们将以这样一种方式创建 COM 类型,以便 Windows 为我们执行 RPC:
$managerType = [Type]::GetTypeFromCLSID($guid, $targetMachine, $true)
实例化类型:
$comManager = [Activator]::CreateInstance($managerType)
将该 COM 对象重新转换为普通 .NET 对象:
$manager = [System.Runtime.InteropServices.Marshal]::CreateWrapperOfType($comManager, [Microsoft.Search.Interop.CSearchManagerClass])
绕行完成。该对象现在将引用目标机器的搜索管理器。
然后得到目录对象对于主目录:
$cat = $manager.GetCatalog("SystemIndex")
这GetCatalogStatus
功能告诉您它当前是否正在进行索引,但该函数使用“out”参数,因此我们需要传递引用:
$indexStatus = 0
$indexPauseReason = 0
$cat.GetCatalogStatus([ref]$indexStatus, [ref]$indexPauseReason)
如果您强制将这两个变量设置为字符串,它们现在将包含一个模糊的人类可读状态。[string]$indexStatus
目前为我生成CATALOG_STATUS_PAUSED
。如果索引器暂停,则第二个变量就是它不工作的原因。
获取索引项目的数量非常容易:
$cat.NumberOfItems()
当没有更多内容需要索引时,Windows 可能已完成索引,因此我们将使用NumberOfItemsToIndex
函数,再次引用:
$incrementalCount = 0
$notificationQueue = 0
$highPriQueue = 0
$cat.NumberOfItemsToIndex([ref]$incrementalCount, [ref]$notificationQueue, [ref]$highPriQueue)
如果这三个变量都为零,则索引完成。
所有这些功能在 Windows 8.1 上都给出了预期/正确的结果,而 WMI 对我的作用与对您的作用相同。