2023年9月1日金曜日

独自の Windows10 プログラムランチャーを作ろう!

実行すると一斉に指定のフォルダーを開いたり、複数のプログラムを起動するランチャーを Windows の標準機能だけで実現します。

  1. メモ帳を開き以下を入力

    start notepad
    start explorer
  2. launcher.bat など、拡張子を .bat にして保存します。

  3. launcher.bat をダブルクリックで実行すると メモ帳とエクスプローラーが開きます。

解説

  • start に続いてプログラムを指定します。

    コントロールパネルを開く

    start control
  • スタート時に開くファイルを指定する。

    start notepad C:\nonsubject.txt
    start explorer C:\Program Files\KeePass Password Safe 2
  • 実行ファイルのパスにスペースを含む場合は""(ダブルクォーテーション)で囲います。

    start "" "C:\Program Files (x86)\Internet Explorer\iexplore.exe"

    start コマンドのオプションに"タイトル"があり、タイトルバーの文字列として扱われてしまうため空の "" を最初に付けます。

  • プログラムは上に記述されたものから実行され、最後に実行されたプログラムのウィンドウが一番手前に表示されます。

    オプションを付けないと、ほぼ同時に開きます。

    START コマンドのオプションはコマンドプロンプトから start /? で確認できます。Windows のバージョンにより微妙な違いがあるので注意。

START コマンドのオプション (Win10)

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

START ["タイトル"] [/D パス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/NODE <NUMA ノード>] [/AFFINITY <16 進数の関係マスク>] [/WAIT] [/B] [コマンド/プログラム] [パラメーター]
"タイトル" ウィンドウのタイトル バーに表示するタイトル。
パス 開始するディレクトリ。
B 新しいウィンドウを作成せずにアプリケーションを起動します。
アプリケーションは Ctrl + C を無視します。
アプリケーションで Ctr l+ 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 進の整数で指定します。
AFFINITY プロセッサの関係マスクを 16 進数で指定します。
プロセスはこれらのプロセッサで実行されるように制限されます。

/AFFINITY と /NODE を組み合わせると、関係マスクは異なって解釈されます。NUMA ノードのプロセッサ マスクを右にシフトしてビット 0 で始まるかのように関係マスクを指定します。
プロセスは、指定した関係マスクと NUMA ノードの間で共通するプロセッサ上で実行されるように制限されます。共通するプロセッサがない場合は、プロセスは指定した NUMA ノード上で実行されるように制限されます。
WAIT アプリケーションを起動し、終了するまで待ちます。
コマンド/プログラム 内部コマンドまたはバッチ ファイルの場合、コマンド プロセッサは cmd.exe の /K オプションを使用して実行されます。これはコマンドの後でもウィンドウが残ることを意味します。

内部コマンドまたはバッチ ファイルではない場合、そのプログラムはウィンドウ モードのアプリケーションまたはコンソール アプリケーションとして動作します。
パラメーター コマンド/プログラムに渡すパラメーターです。

注意: SEPARATE および SHARED オプションは 64 ビット プラットフォームでは サポートされません。

/NODE を指定すると、NUMA システム上のメモリ局所性を利用する方法でプロセスが作成されるようにできます。たとえば、共有メモリ経由で互いに頻繁に通信する2 つのプロセスを、メモリ待ち時間を最小限に抑えるために同じ優先 NUMA ノードを共有するように作成できます。これらのプロセスは可能であれば同じ NUMA ノードからメモリを割り当て、指定したノード外のプロセッサ上で実行されることもあります。

start /NODE 1 application1.exe
start /NODE 1 application2.exe

これら 2 つのプロセスは、さらに、同じ NUMA ノード内の特定のプロセッサ上で実行されるように制限できます。次の例では、application1 がノードの低順位の2 つのプロセッサ上で実行されるのに対し、application2 はノードの次の 2 つのプロセッサ上で実行されます。この例では、指定したノードに少なくとも 4 つの論理プロセッサがあることを想定しています。ノード番号は、関係マスクを変更しなくても、そのコンピューターの任意の有効なノード番号に変更できることに注意してください。

start /NODE 1 /AFFINITY 0x3 application1.exe
start /NODE 1 /AFFINITY 0xc application2.exe

コマンド拡張機能を有効にすると、コマンド ラインまたは START コマンドによる外部コマンドの起動は、次のように変更されます:

非実行可能ファイルは、ファイル名をコマンドとして入力することによって、ファイルの関連付けを使って開くことができます (例: WORD.DOC は .DOC ファイル拡張子に関連付けられているアプリケーションを起動します)。
コマンド スクリプト内でファイルの関連付けを作成する方法については、ASSOC と FTYPE コマンドを参照してください。

32 ビット GUI アプリケーションを実行する場合、CMD.EXE は、アプリケーションの終了を待たずにコマンド プロンプトに戻ります。
コマンド スクリプト内で実行する場合は、この動作は発生しません。

最初のトークンが拡張子やパス修飾子を持たない文字列 "CMD" であるコマンド ラインを実行する場合、"CMD" が COMSPEC 変数の値で置き換えられます。
これにより現在のディレクトリの CMD.EXE が使われないようにします。

最初のトークンが拡張子を含まないコマンド ラインを実行する場合、CMD.EXE は、PATHEXT 環境変数の値を使って拡張子の種類と順序を判断します。
PATHEXT 変数の既定値は、次のとおりです:

.COM;.EXE;.BAT;.CMD

この構文は PATH 変数と同じであり、各要素はセミコロンで区切られていることに注意してください。

実行可能なファイルを検索するときにどの拡張子でも一致するファイルが見つからない場合は、拡張子なしの名前がディレクトリ名と一致するかどうかを 調べます。
一致する場合は、START コマンドがそのパスでエクスプローラーを起動します。コマンド ラインから実行した場合は、そのパスに対する CD /D の実行と同じになります。

応用編

START コマンドのオプションはプログラマでないとわからないものも多いですが、実用できそうなものをいくつかピックアップしてみます。

  • /WAIT オプションを追加するとプログラムが終了した後に次の start を実行します。

    start /WAIT notepad C:\arinco.txt
    start "" %windir%\regedit.exe

    メモ帳を閉じるとレジストリ エディターが起動。

  • 非実行可能ファイルのくだりについて。

    関連付けがされている場合はファイル名の指定だけで開きます。

    start C:\arinco.png

    画像(arinco.png) を Windows フォトで開く。

  • コマンド/プログラムのくだりについて。

    コマンドはコマンドプロンプトの命令文。プログラムは.exeなどの実行ファイルのことです。

    start dir
    start wordpad.exe C:\nonsubject.txt

    dir がコマンド、wordpad.exe がプログラム。

    パラメーターコマンド/プログラムに渡す引数C:\nonsubject.txt の部分です。

  • 拡張子を含まないコマンドのくだりについて。

    mspaint.exewordpad.exe.exe を省略しても動作します。

    start mspaint
    start wordpad

    CMD.EXE は、拡張子がない場合に環境変数 PATHEXT の値を前から当てはめます。

    SET PATHEXT コマンドで値を確認できます。

    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

  • start を & でつないで一行でも記述できます。

    start notepad C:\nonsubject.txt & start msedge.exe

    ただし、わかりにくいので非推奨。レジストリのコマンドに組み込むときなどに使用します。

📖Microsoft Learn による strat コマンドの解説