プログラムでインデックス作成の進行状況に関する情報(移動するファイルの数または「インデックス作成が完了した」)を取得する方法を見つけようとしています。 Win32_PerfFormattedData_WSearchIdxPi_SearchIndexerクラスに出くわし、それが表示するゼロの数、特に「IndexSize」の横のゼロに驚いていました。
インデックスオプションは、インデックスが作成された5055個のアイテムを表示するため、私の単純な考えでは、インデックスのサイズはゼロ以外である必要があります。
これらのゼロが表す情報は何ですか?私は適切なクラスを見ていませんか?もしそうなら、私は別の番号を取得するために何かをすべきですか?
これはWindows8.1ですが、実際にこのようなことをしたいコンピューターはWindows7とWindows10システムです。
現在、Windows 10マシンで作業していますが、外観が少し異なります。 ActiveConnectionsは、ここでは0ではなく2を示しています。また、両方のコンピューターで、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
FormattedData:
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の動作のスクリーンショット:
そのWMIクラスは何らかの方法で壊れているように見えます。幸いなことに、回避策がありますが、もう少し作業が必要です。 Windows Search 3 SDK をダウンロードする必要があります。これは自己解凍型のZipであり、ファイルを好きな場所に置くことができます。関心があるのは、Managedフォルダーの下にあるMicrosoft.Search.Interop.dll
だけです。その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}"
そして、WindowsがRPCを実行するようにCOMタイプを作成します。
$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
function は、現在インデックスを作成しているかどうかを示しますが、その関数は「out」パラメーターを使用するため、参照を渡す必要があります。
$indexStatus = 0
$indexPauseReason = 0
$cat.GetCatalogStatus([ref]$indexStatus, [ref]$indexPauseReason)
これらの2つの変数は、文字列に強制すると、漠然と人間が読める形式になります。 [string]$indexStatus
は現在、私のためにCATALOG_STATUS_PAUSED
を生成します。インデクサーが一時停止している場合、その2番目の変数が作業を行っていない理由です。
インデックスに登録されたアイテムの数を取得するのは非常に簡単です。
$cat.NumberOfItems()
Windowsは、インデックスを作成するものがなくなったときにインデックス作成が行われると思われるため、 NumberOfItemsToIndex
関数を使用します。
$incrementalCount = 0
$notificationQueue = 0
$highPriQueue = 0
$cat.NumberOfItemsToIndex([ref]$incrementalCount, [ref]$notificationQueue, [ref]$highPriQueue)
これらの3つの変数がすべてゼロになると、インデックス作成は完了です。
これらの関数はすべて、Windows 8.1で期待される/正しい結果をもたらしますが、WMIは、私にとっては同じことを行います。