Windows中的性能计数器名称是本地化的,因此例如计数器\Processor(_Total)\% Processor Time
在其他语言版本的Windows中被称为其他名称。这意味着为了找到正确的名称,必须首先找到计数器的索引,然后使用PdhLookupPerfNameByIndex函数获取本地化名称(如果应支持Windows XP,则使用PdhAddEnglishCounter)
这对于上面的计数器路径的性能对象(Processor
)和计数器(% Processor Time
)部分都有好处,但是实例名称(_Total
)呢?我在注册表中找不到这个字符串,所以我认为它是由提供信息的任何系统组件提供的。
在不同语言版本的Windows中,系统提供的性能计数器的实例名称是否保证相同?
如果没有,我该如何确定哪个实例与_Total
个实例相对应?
答案 0 :(得分:2)
根据this support KB,只有对象和计数器具有友好名称:
因此,这使我相信给定计数器的实例名称是动态地(例如,用于处理的ProcessId)或静态地(例如,硬编码的)获得的。当然,没有什么能阻止某人在英语版本中硬编码“_Total”以及德语版本中的其他内容,尽管通常的做法是将语言内容限制在注册表中并通过以下方式处理对象和计数器索引和动态或静态名称的实例。我认为微软一直使用“_Total”,就像我在一些外语安装上看到的那样。但是,实例在每种语言中都没有用户友好名称。
答案 1 :(得分:1)
def _find_pdh_counter_localized_name(eng_names,machine_name=None):
'''
Create a map of english names to indexes. We then lookup the english
name in the map to get the localized name.
Shamefully lifted from win32pdhutil, only this one uses a transient map
instead of a persistent one.
Will throw KeyError if a name is asked for that is not in the list.
'''
import win32api, win32con
counter_reg_value = win32api.RegQueryValueEx(
win32con.HKEY_PERFORMANCE_DATA, "Counter 009"
)
counter_list = counter_reg_value[0]
eng_map={}
for i in range(0, len(counter_list) - 1, 2):
try:
counter_id = int(counter_list[i])
except ValueError:
continue
eng_map[counter_list[i+1].lower()] = counter_id
ret = []
for name in eng_names:
ret.append(win32pdh.LookupPerfNameByIndex(
machine_name, eng_map[name.lower()])
)
del eng_map
return tuple(ret)
构建计数器名称:
names = _find_pdh_counter_localized_name(['processor','% processor time'])
counter_name = r'\%s(_Total)\%s' % names
产生所需的值。例如,意大利语中的“\ Processore(_Total)\%Tempo Processore”。