• Windows Terminal ベスト設定 第11回「Windows Terminalのコマンドライン」

Windows Terminalは、コマンドラインから起動することができ、このとき、コマンドラインオプションを指定することで、起動時の状態や、タブなどの状態を指定することができる。今回は、そのためのコマンドラインオプションを解説する。

Windows Terminalの起動

Windows Terminalは、現在2つの配布形態、5つのインストール形態があり、起動方法は大きく2つある(表01)。インストール形態などの詳細に関しては、第7回「安定版v1.17 プレビューv1.18と今後の方向性」を参考にしていただきたい。

  • ■表01

簡単に言うと、「プレインストール版」(および、「パッケージ版」、「Microsoftストア版」)の場合には、アプリ実行エイリアスwt.exeで起動を行う。

非パッケージ版およびポータブル版では、インストール先ディレクトリにある「WindowsTerminal.exe」または「wt.exe」を使って起動を行う。

前者の場合、環境変数PATHの指定や、実行パスの指定は不要だが、後者の場合に関しては、PATHの設定もしくは、フルパスによる指定が必要になる。ただし、どの場合も、起動オプションは共通である。

ただし、アプリ実行エイリアスの場合、wt.exeで起動できるのは、安定版またはプレビュー版のどちらか1つのみになる。どちらを起動するのかは、「設定 ⇒ アプリ ⇒ アプリの詳細設定 ⇒ アプリ実行エイリアス」で指定を行う。

安定版、プレビュー版を同時にインストールしたとき、双方が「パッケージ版」、「Microsoftストア版」である場合、片方は、コマンドラインから起動することはできず、スタートメニューやタスクバー登録などGUIでの起動を行うことになる。このため、両者を併用する場合、片方を「ポータブル版」としてインストールしておくと、安定版、プレビュー版の両方をコマンドラインから起動することか可能になる。

また、起動オプションは、Windows Terminal内のコマンドパレットの「コマンドラインモード」でも利用することができる。「コマンドラインモード」は、コマンドラインオプションを指定してWindows Terminalを制御するモードである。

コマンドラインモードを使う場合、コマンドパレットを起動したら、行頭にある“>”をバックスペースキーなどで削除する。逆にいうと、コマンドパレットでは、行頭に“>”があると、後続する文字列は、すべてコマンド(Windows Terminalのアクション)として解釈される。

コマンドラインモードでも、シェルのコマンドラインでもWindows Terminalの挙動は同じである。ただし、シェル側のコマンドラインで起動すると、シェルが持つヒストリ機能などが利用できるというメリットがある。

コマンドラインの概要

Windows Terminalのコマンドラインは、大きく3つに分類できる。1つは、Windows Terminalのウィンドウの位置やサイズなどを設定する「ウィンドウオプション」、もう1つは、ヘルプウィンドウやバージョン表示ダイアログを表示する「単独オプション」、そして、タブやペインの作成制御などを行う「サブコマンド」の3つである。

このうち、「単独オプション」は、他のオプションよりも優先され、他のオプションは無効になる。「ウィンドウオプション」と「サブコマンド」は、同時指定が可能だ。つまり、Windows Terminalのコマンドラインは、


wt.exe <単独オプション>
wt.exe <ウィンドウオプション>
wt.exe [<ウィンドウオプション>] <サブコマンド> [; <サブコマンド>]

の3つのパターンのどれかになる。

Windows Terminalのコマンドラインをシェル上で使う場合、コマンドラインは最初にシェルで解釈されるため、複雑なコマンドラインでは、コマンド側のオプションが、シェルによって解釈され、思わぬエラーを引き起こすことがある。

PowerShellの場合、文字のエスケープやシングルクオート、ダブルクオートによる文字列化、あるいは「解析停止」演算子(--%)を使う必要がある。また、条件によっては、Windows Terminalの特殊文字“--”(POSITIONAL MARK)を使わねばならないことがある。

特にサブコマンドに含まれる起動コマンドなどの指定では、起動されるコマンドがさらにオプション文字を扱うことがあるため、エラーになりやすい。cmd.exeや旧来のWindows付属コマンドは、オプション指定文字として“/”を使うため、エラーになりにくいが、Windows TerminalやPowerShellなどの最近のWindowsのコマンドでは、Unix流儀の“--”や“-”を使うため、どう解釈されるのかを予測するのが難しい。

たとえば、以下のようなコマンドラインをPowerShellで起動することを考える。


wt.exe -w test1 new-tab powershell.exe -nol ; split-pane pwsh.exe -nop

意図としては、「新規タブ」(new-tab)でpowershell.exe(Windows PowerShell 5.1)を起動し、そのタブをペインで分割して、片方でpwsh.exe(PowerShell 7.x)を起動したい。しかし、実際には、これを実行するとエラーが表示される(写真01)。

  • 写真01: PowerShellでは、セミコロンをコマンド区切りと解釈するため、Windows Terminalの引数にあるサブコマンド区切りのセミコロンを解釈してしまう。これをシングルクオートで囲むとエラーがなくなる。なお、この問題は、cmd.exeでは起こらない

これは、Windows Terminalのサブコマンドの区切り文字セミコロンが、PowerShellのコマンド区切りとして解釈されてしまい、後半が独立したコマンドのように扱われてしまうからだ。これはPowerShell固有の問題で、たとえばcmd.exeならば上記のコマンドはエラーにならない。

これを防ぐには、セミコロンをシングルクオートなどでくくるか、wt.exeの直後に、PowerShellの解析停止演算子を入れる必要がある。具体的には、


wt.exe -w test1 new-tab powershell.exe -nol ';' split-pane pwsh.exe -nop

のようにセミコロンをシングルクオートでくくって、PowerShellが解釈しないようにするか、あるいは、


wt.exe --% -w test1 new-tab powershell.exe -nol ; split-pane pwsh.exe -nop

のように、wt.exeの直後にPowerShellの解析停止演算子を入れる。解析停止演算子は、コマンドの引数としてPowerShellに解釈させる必要があり、コマンドファイル名(ここではwt.exe)の後で、かつセミコロンの前に来る位置に入れることができる。


wt.exe -w test1 new-tab powershell.exe -nol --% ; split-pane pwsh.exe -nop

解析停止演算子は、シェルとして実行されているPowerShell/Windows PowerShellが解釈して取り除く。

単独オプションとウィンドウオプション

表02は、単独オプションの一覧だ。単独オプションは、Windows Terminalのウィンドウを開かない。ただし、専用のウィンドウを開いて情報を表示する。

  • ■表02

表03は、ウィンドウオプションの一覧である。このオプションでは、Windows Terminalのウィンドウの位置やサイズを制御する。サブコマンドのオプションを指定しなければ、デフォルトのプロファイルでウィンドウが開く。プロファイルに関しては、以下の記事を参照されたい。

・Windows Terminal ベスト設定 第3回「プロファイル 基本編」
https://news.mynavi.jp/article/20220407-2315883/
・Windows Terminal ベスト設定 第4回「プロファイルのカスタマイズとフラグメント機能編」
https://news.mynavi.jp/article/20220623-2376329/

  • ■表03

ウィンドウモードは、大きく3つある。「最大化」(--maximized)、「フォーカスモード」(--focus)、「フルスクリーンモード」(--fullscreen)である。「最大化」は、通常のウィンドウと同じく、タイトルバーの最大化ボタンを使った状態と同じで、ウィンドウをディスプレイ内で最大化状態にする(図01)。このとき、ウィンドウのタイトルバーやタブバーはそのまま表示され、デスクトップのタスクバーもそのまま残る。

  • 図01: --maximizedオプションは、ウィンドウを最大表示する。--focusオプションは、タイトルバー、タブバーを省略して表示する。これは--maximizedオプションと併用が可能。--fullscreenは、さらにタスクバーを覆い隠してディスプレイ全体に表示される

これに対してフォーカスモードは、Windows Terminalのタイトルバーやタブバーを省略した状態である。ウィンドウは通常状態、最大状態(--maximizedを併用)の両方がある。

フルスクリーン状態は、タスクバーを覆ってウィンドウをディスプレイ内で最大表示する。画面がすべてWindows Terminalのウィンドウとなり、タイトルバーやタブバーも表示されない。

前記3つとは併用できないオプションが、ウィンドウのサイズ指定オプション(--size)と位置指定オプション(--pos)である。これらは通常ウィンドウ表示のときにのみ有効である。前記3つのウィンドウモードを同時指定した場合、モードを解除して通常状態としたときに、サイズや位置の指定が有効になる。

“--window”オプションは、コマンドラインの対象となるウィンドウを限定するものだ。任意のウィンドウIDをつけてWindows Terminalを起動すると、そのウィンドウは、ウィンドウIDを持つ。

“identifyWindows”アクションをコマンドパレットなどから実行することで、すべてのWindows TerminalウィンドウのウィンドウIDを表示させることができる。また、renameWindowアクションを使って、ウィンドウの名前をあとから変更することも可能だ。

--windowオプションの振る舞いを示すのが(図02)である。1回、ウィンドウIDを指定してWindows Terminalを起動したあと、同じウィンドウIDに対して実行されるサブコマンドを含むコマンドラインは、すべて該当のウィンドウIDを持つWindows Terminalウィンドウに対して実行される。ただし、1回、ウィンドウが表示されてしまうと、位置やサイズ指定などのウィンドウオプションは有効にならない。ウィンドウを動かすなどの場合には、PowerShellなどを使って、WindowsのAPIを利用してウィンドウを操作する必要がある。

  • 図02: --window/-wオプションを使うことで、過去にウィンドウIDを付けて起動したウィンドウに対して、サブコマンドを適用させることができる。test1ウィンドウは、最初ペインなしで起動するが、3つ目のコマンドでペイン分割が行われる

一度ウィンドウIDを設定したあと、コマンドラインでウィンドウIDを指定して、サブコマンドなどで新規タブを作成すると、それは、指定されたウィンドウIDを持つウィンドウに対する指示となる。このとき、常に新しいウィンドウを意味するウィンドウIDとして「new」または「-1」が、最後に使ったウィンドウを指定するウィンドウIDとして「last」または「0」が利用できる。--windowオプションを指定しない場合、最後に使ったウィンドウが仮定される。

次回は、コマンドラインのサブコマンドについて解説を行う予定だ。

>> Windows Terminal ベスト設定 連載バックナンバー
https://news.mynavi.jp/tag/winterminal/