LoginSignup
1
2

More than 1 year has passed since last update.

Windows Terminalで cmd.exeからの exitで tabを残さない

Last updated at Posted at 2021-04-28

Update

普通に対応できる方法が見つかりました。

  • 分割されたWindowやTabが残ったときは CTRL+SHIFT+W で閉じれる
  • プロファイル>詳細設定にある、「プロファイルの終了動作」を「プロセスの終了、失敗、クラッシュ時に閉じる」にしておけば、そもそも残らない
    プロファイル設定.png

はじめに

私は Windows環境を CLIで操作するのですが、いまだに cmd.exe1 を使っています。
ただ、Windows Terminalを使っていると exitしたときに Tabが残ってしまうことがあり ちょっと鬱陶しいです。

↓ こんなの

2021-04-28 12_13_21-CMD.png

これは exitの、終了コードが指定されないとき、cmd.exeが最後に得ていた終了コードを返すという仕様があるためです。
直前に入力したコマンドがエラー終了していた場合等、このような形で Tabが残留することになります。

このとき Tabの × にマウスカーソルを重ねると 「タブを閉じる(Ctrl+F4)」 と表示されるのですが、単にCtrl+F4押しても閉じません

Tabのタイトルをクリックしてフォーカスをそこに移すか、設定を入れる事で回避できますがマウスなりキー操作なりの追加操作が必要です。

EXITしたら 普通に消えて欲しいと思ったので、その方法です。

……もっと簡単に出来るんじゃない?って気もしてますので やり方あれば教えてください。

結論から

  • Windows Terminal cmd.exeを /k doskey で マクロ設定を入れる
  • マクロで EXIT=TYPE NUL & EXIT $* としてパラメータ無しEXITの終了コードを0にする

EXITを終了コード無しで実行したときに 0 で終了させる

やりたいのは、たったこれだけの事なので面倒臭がらずに

exit 0

と打てば良いのではないかと思いますが、
exitを素で叩くのは既に30年身体にしみついてしまった習慣なので変えられません。

「exitするときは exit 0」と、自分ルールを決めたとしても、
exitだけ叩いてしまい、残ったtabを見る度にイラっとするのが目に見えています。

ならバッチファイルでも作れば?と思いますが

exit.cmd
@EXIT 0

これも内部コマンド優先なので exit.cmd は呼ばれないですし、
呼ばれたとしても exit.cmd の再帰ループが終わりません。

ではどうするかというと、

doskey

そう、doskeyです。

このコマンド、見る度に DOSかよ!山岡さん2にSM-DOSって叱られるよ!って思っちゃいますが、
素の cmd.exeで aliasを実現しようと思うとこれしかないのです。ksh3 とか無いし。

まずは Windows Terminalの設定で cmd.exe 起動時に doskey で macro を設定するようにします。

{
    "commandline": "cmd.exe /k doskey /macrofile=\"%USERPROFILE%\\macros.txt\"",
    "hidden": false,
    "name": "CMD"
}

マクロで EXIT=EXIT 0

あとは 終了コードを0にして exit すれば良いだけですので、マクロの設定ファイルに一行追加

macros.txt
EXIT=EXIT 0

これで良いといえば良いのですが、これだと逆に エラー終了が出来ないです。

設定入れたのを忘れて exit 1 して「あれ、エラー終了にならない?」とかなる
ありえそうにもない未来を予想してしまいます。

私がやりたいのは パラメータを省略したときの EXIT 0 です。

ERRORLEVELを設定する

バッチファイル等で 終了コードを得るときは %ERRORLEVEL% と、環境変数参照のような書き方をします。

が、これはただの罠です。ERRORLEVELは 環境変数ではありません。

次の様なマクロを書いても目的は達成できません。

macros.txt
EXIT=SET ERRORLEVEL=0 & EXIT $*

それならと、こんな風に書いてみたのですが……

macros.txt
EXIT=CMD /C EXIT 0 & EXIT $*

なんか……これどうなん?
cmd.exe終わらせるために cmd.exeのプロセスを起動するの? 何それ?
と、心がざわつくのでもう少しなんとかしたいです。

そもそも CMD.EXEの内蔵コマンドって終了コード返さない事が結構あるし、
返すにしても 確実に 0 になるオペレーションって何か良い物が無いかな?と
思ってたどり着いたのが 以下です。

macros.txt
EXIT=TYPE NUL & EXIT $*

……TYPEなら内蔵コマンドだし。

この設定で、exitしたときに パラメータ指定をしなければ 0 で、
終了コードやオプションを指定したときは それに従って終了するようになります。

ちなみに文字数的には "CD ." で カレントフォルダへの移動も終了コードが設定されるので、
それでも良いかと思います。

おまけ

chocolatey使って パッケージをインストールするとき等、
いちいち管理者権限得るのに右クリックしてWindows Terminal開きなおすの面倒臭い。

という方は以下のadminマクロみたいなのも一緒に定義しておくと
管理者権限 Windows Terminalをコマンドで開けます。

macros.txt
ADMIN=powershell -command start-process wt -verb runas
  1. Power-Shell は Scriptを書くときには強力で良いのですが、普段使うには少し鬱陶しく感じてしまうので……。

  2. 某漫画のキャラクター。mac狂信者。

  3. Un*xのkshではありません。正式名称は KI-Shell だったかな?。vectorに残ってないかなと探してみたのですが見つかりませんでした

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2