名古屋出身ソフトウェアエンジニアのブログ

Windows: コマンドラインで優先度を指定しプロセスを起動する方法

公開:
更新:

思ったよりも良い情報がヒットしなかったので、まとめておきます。

start コマンドで基本優先度を指定し起動できる

cmdstart コマンドでは、以下のようにオプションで優先度を指定してプロセスを開始できます。

start " " /HIGH python.exe

このとき、" " の部分は、一見無意味ですが毎回配置しておくと良いです。この " " は以下のヘルプで ["タイトル"] の部分に該当するのですが、[コマンド/プログラム] がダブルクォートされているかつ ["タイトル"] が与えられていない場合に、優先的にコマンド部分をタイトルとして解釈してしまうという、仕様なのかバグなのか分からないような挙動を cmd はします1(どう考えてもタイトルの方が重要ではないと思うんですけどね)。

> help start
指定されたプログラムまたはコマンドを実行するためにウィンドウを開きます。

START ["タイトル"] [/D パス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA ノード>] [/AFFINITY <16 進数の関係マスク>] [/WAIT] [/B]
      [/MACHINE <x86|amd64|arm|arm64>][コマンド/プログラム] [パラメーター]

    "タイトル"  ウィンドウのタイトル バーに表示するタイトル。
    パス        開始するディレクトリ。
    B           新しいウィンドウを作成せずにアプリケーションを起動します。
                アプリケーションは Ctrl + C を無視します。
                アプリケーションで Ctrl + C を有効にしていない場合、
                Ctrl + Break がアプリケーションを中断する唯一の方法です。
    I           新しい環境は、現在の環境ではなく、cmd.exe に渡された元の環境に
                なります。
    MIN         ウィンドウを最小化の状態で起動します。
    MAX         ウィンドウを最大表示の状態で起動します。
    SEPARATE    16 ビットの Windows プログラムを別メモリ領域で起動します。
    SHARED      16 ビットの Windows プログラムを共有メモリ領域で起動します。
    LOW         IDLE 優先度クラスでアプリケーションを起動します。
    NORMAL      NORMAL 優先度クラスでアプリケーションを起動します。
    HIGH        HIGH 優先度クラスでアプリケーションを起動します。
    REALTIME    REALTIME 優先度クラスでアプリケーションを起動します。
    ABOVENORMAL ABOVENORMAL 優先度クラスでアプリケーションを起動します。
    BELOWNORMAL BELOWNORMAL 優先度クラスでアプリケーションを起動します。
    NODE        優先 NUMA
                (Non-Uniform Memory Architecture) ノードを 10 進数の整数で指定します。

使い道

特定のプログラムを高優先度で起動するためのショートカット作成などに使えると思います。

startcmd の組み込みコマンドなので、バイナリの直接指定や Powershell から同じように利用することはできません。ゆえに、ショートカットファイルなどでは、以下のように cmd にコマンドを委譲する形で記述する必要があります。

C:\WINDOWS\system32\cmd.exe /C start /high " " "C:\Program Files\VideoLAN\VLC\vlc.exe"

高優先度での起動は、シングルスレッドでしか動作しない古いゲームの速度改善などに使えるかと思います2。ただ、搭載コア数が多く、CPU が回ってこない状況が発生しにくいマシンでは、あまり意味はないのかもしれません。

VLC メディアプレイヤーでは、優先度を「高」にすると、ややシークが速くなった気がします3

REALTIME 優先度について

どの Windows からこの仕様になったのか定かではないですが (VISTA?)、プロセス優先度クラスを REALTIME_PRIORITY_CLASS に上げるのに、管理者権限が必要です。なので、REALTIME 優先度が必要な場合、cmd を管理者権限で実行したり、ショートカットファイルではショートカットの設定で「管理者として実行」にチェックを入れたりする必要があります。

優先度のスケジュール設定 - Win32 apps
スレッドは、スケジュールの優先順位に基づいて実行するようにスケジュールされます。

リアルタイム優先度は非常に強力であり、慎重に扱う必要があります。リアルタイム優先度は、他のすべての操作(マウスやキーボードの入力、ディスクキャッシュなど)よりも高く、プログラムが CPU を完全に占有する可能性があります。


  1. やはり cmd.exe は壊れている。 ↩︎

  2. 起動後に自身で優先度を書き換えたりするゲームや、最小化時に自身の優先度を下げるゲームもあるようなので、設定時には注意深い観察が必要。 ↩︎

  3. シークが速くなった気がしますが、プラシーボかもしれません。 ↩︎