4

Я пытался найти способ получить информацию о прогрессе индексации программным способом (сколько файлов нужно выполнить или "индексирование завершено"). Я наткнулся на класс 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

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

И вот пример того, как выглядят счетчики производительности Search Indexer в mmc.exe (это снова на компьютере с Windows 10, но на компьютере с Windows 8.1 это выглядит так же). Это просто вертикальная линия, движущаяся по экрану - в данном случае счетчик имеет размер индекса.

И скриншот с Get-Counter от Powershell в действии:

1 ответ1

2

Этот класс WMI каким-то образом нарушен. К счастью, есть обходной путь, хотя он требует немного больше работы. Вам нужно будет загрузить Windows Search 3 SDK. Это просто самораспаковывающийся ZIP, и вы можете помещать файлы куда угодно. Мы заинтересованы только в одном, Microsoft.Search.Interop.dll в папке Managed. Загрузите эту DLL в PowerShell:

Add-Type -Path "Microsoft.Search.Interop.dll"

Тогда вам нужен объект менеджера поиска. Если вы хотите получить тот для локальной машины, это просто так:

$manager = New-Object Microsoft.Search.Interop.CSearchManagerClass

Если вы хотите получить доступ к удаленной машине, пришло время для объезда.


Нам понадобится GUID класса COM, который я где-то извлек из заголовка 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 делает для меня то же самое, что и для вас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .