
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
今日の質問: スクリプトを使用してプロセスの優先度を下げる方法はありますか
| Q | Scripting Guy さん、よろしくお願いします。スクリプトを使用してプロセスの優先度を下げる方法はありますか。 -- HS | ||||||||||||||
| A | HS さん、こんにちは。多くの方がご存知のように、すべてのプロセスは等しく作られていません。代わりに、プロセスには優先度の値が割り当てられます。優先度の高いプロセスは、優先度の低いプロセスよりも頻繁に実行されるため、より速く実行されているように見えます。たとえば、キーボードとマウスはどちらも、システム プロセスにおいて非常に高い優先度で実行されます。そうでなければ、キーボードでキー入力したり、マウスを動かしたりするたびに遅延を感じます。 一般に、ほとんどのプロセスは "通常" の優先度で実行されます。速すぎることも、遅すぎることもありません。それで問題なく機能しているように思えます。しかし、特定のプロセスの優先度を変更したい場合があるかもしれません。たとえば、深夜にプロセス X の優先度を上げて、プロセスで実行されているタスクがより早く完了するようにできます。反対に、プロセス X を日中に実行している場合は、優先度を "下げる" ことで、コンピュータ上で実行されている他のタスクを妨げないようにできます。以上は簡単な概要で、プロセスの優先度の変更を始める前に検討する点は他にもあります。しかし、少なくとも何の話をしているのかはおわかりいただけましたね。 それでは、実際に "プロセスの優先度を変更する" と仮定しましょう。優先度は、タスクマネージャを使用して簡単に変更できます。プロセスを右クリックし、[優先度の設定] を選択して、使用可能なオプションのいずれかを設定するだけです。 ![]()
Windows XP または Windows Server 2003 を実行していれば、答えはイエスです (申し訳ありませんが、Windows 2000 ユーザーの場合はノーです)。これは、上記のバージョンの Windows にある WMI クラスの Win32_Process には、SetPriority という名前のメソッドが含まれ、このメソッドを使用して実行中のプロセスの優先度を変更できるためです。たとえば、Notepad.exe (メモ帳) の優先度を通常以下に設定するスクリプトを次に示します。
Const BELOW_NORMAL = 16384
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Notepad.exe'")
For Each objProcess in colProcesses
objProcess.SetPriority(BELOW_NORMAL)
Next
このスクリプトでは、まず BELOW_NORMAL という名前の定数を定義し、値を 16384 に設定します。ご想像のとおり、後でこの定数を使用してメモ帳の優先度を通常以下に変更します。他の値を使用して、プロセスに "異なる" 優先度を割り当てることはできるでしょうか。もちろん、できます。
スクリプトでは、定数を作成したら WMI サービスに接続し、次のコード行を使用して Notepad.exe という名前のすべてのプロセスのコレクションを取得します。
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Notepad.exe'")
コレクションが返されたら、For Each ループを使用して Notepad.exe のすべてのインスタンスを順に処理します (このスクリプトでは、このようなインスタンスが 1 つしかないか、またはインスタンスが複数ある場合はすべてを通常以下の優先度に設定すると仮定しています)。ループの内部で、SetPriority メソッドを呼び出し、定数 BELOW_NORMAL を単一のパラメータとして渡します。 objProcess.SetPriority(BELOW_NORMAL) Notepad.exe の優先度を (スクリプトまたはタスク マネージャを使用して) 確認すると、優先度が通常以下に設定されていることがわかります。 ここで、注意する点が 1 つあります。このスクリプトをファイル サーバーなどで実際に実行する前に、テスト コンピュータでさまざまな優先度を試してみることをお勧めします。メモ帳の優先度を通常以下に変更しても、おそらく問題はありません。しかし、データベース アプリケーションの優先度を通常以下に変更すると、ユーザーにとって問題が発生する可能性があります。同様に、どのプロセスについても優先度をリアルタイムに設定することはお勧めしません。リアルタイムに設定した場合、そのプロセスによってすべてのシステム リソースが消費され、主要なオペレーティング システム機能を含む他の機能の実行が妨げられる可能性が高くなります。Scripting Guys から、役立つヒントをお伝えしました。 |
Hey, Scripting Guy! - アーカイブもチェックしてください。