3

Windows のパフォーマンス カウンター名はローカライズされているため、たとえば、カウンター\Processor(_Total)\% Processor Timeは Windows の他の言語バージョンでは別の名前で呼ばれています。つまり、正しい名前を見つけるには、最初にカウンターのインデックスを見つけてから、PdhLookupPerfNameByIndex関数を使用してローカライズされた名前を取得する必要があります ( Windows XP をサポートする必要がある場合、PdhAddEnglishCounter を使用することはできません)

上記のカウンター パスのパフォーマンス オブジェクト ( Processor) とカウンター ( % Processor Time) の部分についてはこれで問題ありませんが、インスタンス名 ( _Total) についてはどうでしょうか。レジストリにこの文字列が見つからないため、情報を提供するシステム コンポーネントによって提供されていると思われます。

システム提供のパフォーマンス カウンターのインスタンス名は、異なる言語バージョンの Windows 間で同じであることが保証されていますか?

そうでない場合、どのインスタンスがインスタンスに対応するかをどのように判断でき_Totalますか?

4

2 に答える 2

2

このサポートKBによると、オブジェクトとカウンターのみがフレンドリ名を持っています。

ただし、インスタンスには、各言語でわかりやすい名前が付いていません。

したがって、これにより、特定のカウンターのインスタンス名は動的に(たとえば、プロセスのProcessId)または静的に(たとえば、ハードコーディングされて)取得されると思います。もちろん、誰かが英語のビルドで「_Total」をハードコーディングし、ドイツ語のビルドで他の何かをハードコーディングすることを妨げるものは何もありませんが、一般的な方法は、言語をレジストリに限定し、オブジェクトとカウンターを次のように処理することです。動的または静的な名前によるインデックスとインスタンス。いくつかの外国語のインストールで見たように、Microsoftは一貫して「_Total」を使用していると思います。

于 2011-08-27T02:50:52.897 に答える
1

ルカは正しいです。Processor(_Total)\% Processor Time のローカライズされたバージョンを取得するには、「(_Total)」が定数であるパス「Processor」および「%Processor Time」の各コンポーネントのローカライズされた名前を取得する必要があります。 . インデックスは OS のバージョンによって異なる可能性があるため、実行ごとに検出する必要があります。win32pyutilモジュールには、english-to-index マップをロードするが保持するメソッドが含まれています。一度だけ必要な場合は小さくないため、メモリの浪費になる可能性があります。以下を使用します。

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」。

于 2013-05-03T17:18:03.007 に答える