コマンドプロンプトで永続的なエイリアスを作成する

TL;DR

本編

序章

窓の桜にも緑が目立つ昼下がりです。僕は半身に春の色を浴びながら、目の前の黒窓がgit cloneしているのをじっと見守っていました。

黒窓が仕事を終えたことを目配せして伝えます。僕はひとつ頷くと、彼にcd <repo-name>と告げました。そして、まるで生まれる前からそうすべきと知っていたかのように、何年も前からずっとそうし続けてきたかのように、僕はこう続けたのです:

vscode .

黒窓は応えました:

'vscode' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

……は?

当然。そう、当然 VSCode の実行ファイル名はvscode.exeであるはずだと思い込んでいました。そうじゃなかったらなんなんだ。

何かに急かされるようにディレクトリを掘り進んでいくと、そこにヤツはいました。不敵な笑みを浮かべ、僕を待ち構えていたヤツの名はそう……

f:id:penpenpng:20190412163439p:plain

なんで😡😡😡😡😡💢💢💢

エイリアスを作ろう

いや、 MS のおもしろセンスは今に始まったことではありません。あいつらは Visual Studio の実行ファイルにdevenv.exeと名付けるような集団です。

いいのです、そんなことは。僕らにはエイリアスがあります。bash にあるんだから cmd にだってどうせあります*1Google 先生に聞けば doskey コマンドを使った方法が山とヒットしました。

doskey で得られるエイリアスは cmd が実行終了するまでの一時的なものです。したがってエイリアスを永続化するには、まずエイリアスを登録する bat を予め書いておき、cmd の起動時に引数で bat を渡すことになります。……え?いちいち渡すの*2.bashrcみたいなのって cmd にはないんですか?

どうやら cmd 起動時に設定ファイルを自動で走らせるためにはレジストリを弄る必要があるそうです*3レジストリはあんまり触りたくないなあ……。

最近覚えたものを使いたがる小学生としてここはひとつ、bat を使ってエイリアスをアレするものを作ればいいのでは?

作った

で、作りました。解説するほどのものでもないのでコードだけペタッと貼ります:

@echo off
setlocal enabledelayedexpansion
  set programName=%0
  set aliasDir=パスの通った空のディレクトリ

  call :main %*
  goto :EOF
endlocal


:main
  if "%1" == "create" (
    call :create %2 %3
    goto :EOF
  )
  if "%1" == "remove" (
    call :remove %2
    goto :EOF
  )
  if "%1" == "list" (
    call :list %2
    goto :EOF
  )
  call :help
  goto :EOF


:create
  if not "%1" == "" if not "%2" == "" (
    echo @%~2 %%* > %aliasDir%\%~1.bat
    goto :EOF
  )
  echo ERROR: Positional arguments ^<alias^> and ^<original^> cannot be empty.
  goto :EOF


:remove
  if exist %aliasDir%\%1.bat (
    del %aliasDir%\%1.bat
  ) else (
    echo ERROR: Alias "%1" is not found.
  )
  goto :EOF


:list
  for %%f in (%aliasDir%\*.bat) do (
    for /f %%c in (%%~f) do set content=%%c
    echo %%~nf -^> !content:~1!
  )
  goto :EOF


:help
  echo Usage:
  echo   %programName% create ^<alias^> ^<original^>
  echo   %programName% remove ^<alias^>
  echo   %programName% list
  goto :EOF

これをalias.batの名前でパスの通った適当な場所に置けば、

> vscode .
'vscode' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
> alias create vscode Code
> alias list
vscode -> Code
> vscode .
(VSCodeが起動する)

といった感じで使えます。お粗末さまでした。

bat のお作法みたいなのがわかんないので雰囲気で書いてますけど、どんなもんなんですかねえ……

*1:多くの場合に偽

*2:引数を渡して cmd を起動するようなショートカットを作るのも悪くありませんが、VSCode に統合された cmd を使う場合や、エクスプローラで "Ctrl+L cmd enter" して呼び出す cmd を使う場合には効果がありません。

*3:https://superuser.com/questions/144347/is-there-windows-equivalent-to-the-bashrc-file-in-linux