今回起きた問題についてドンピシャな内容がなくてちょっと苦労したので、言語化して自分の学びにするとともに、同じ問題を抱えている人の解決または原因をつぶすきっかけになればと思いこの記事を作成しました。
結論
環境変数 PATHEXT
を削除してしまっていた。
なので以下の値を再設定した。
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
問題発生の経緯
1. luaを導入していた
Windows11上でNeovimの環境を整えている際にプラグイン導入関係でluaとluarocksを入れようとしていた。しかしNeovimプラグイン側ではluaは認識されていたがluarocksは認識されなかったためlua関係のファイルを削除してやり直していた。
2. 環境変数をいじった
luarocksのインストールが完了した際に表示されたコンソール画面をよく読んでみると、この環境変数を設定して!って言われたので追加した。
3. 元に戻そうとしてタイトルの問題が発生
それでも読み込まれないので設定した環境変数をもとに戻した(つもり)ところで、いろんなコマンドが使えなくなっていた。 cargo
winget
wsl
などをためしたが「そんなコマンドやらバッチファイルはあらへんで」みたいなエラーしか出なくなってしまった。
試したこと
1. 環境変数 PATH
の確認
正しく通っているか以下の要素を確認も問題なさそうだった。
- PowerShell 上で
$env:PATH
を打って確認 - タスクバー上の検索ボックスで「システム環境変数の編集」→ 「環境変数」をクリックしてGUI上で確認
- 使いたい
PATH
が追加されているか - 余計な文字がないか(
"
や'
など)
2. PowerShell の再インストール
winget
が使えないので GitHub からインストーラをダウンロードして、リペアと削除からの再インストールを実行。しかし解決せず。
3. コマンドプロンプトでコマンドを実行
こちらではなぜか PowerShell で使えなかったコマンドが使えた。
解決の糸口: 拡張子付きでコマンドを打った
私の環境では where
コマンドを実行する際に .exe
をつけないとちゃんと動作しないことを思い出したため、使えないコマンドに対して拡張子付きで実行したらどうなるか試した。
cargo.exe
や winget.exe
などではエラーメッセージは出ずに一瞬だけ別のウィンドが表示され、wsl.exe
では別のウィンドで使用しているディストリビューションが起動できた。
ここで、「拡張子付きでコマンドを実行するとそのコマンドが別ウィンドで実行されるのではないか」という説を立てた。
解決へ
先ほどの説について「powershell コマンド実行 別ウィンドウが開かれる」で調べると、以下の記事が見つかった。
こちらの記事の最後のほうに環境変数の PATHEXT
についての説明があり、この環境変数に設定した拡張子を持つファイルは拡張子なしで実行できる、すなわち ファイル名.exe
ではなく ファイル名
で実行できるとのことだった。
この PATHEXT
について、luarocksの設定をするときに .LUA
を追加してと言われたのを思い出した。その時は、最初のインストールのために PATHEXT
を新規に作成し、再インストールのために環境変数を元に戻そうとして削除した。
そこで、自分の環境変数を確認して、PATHEXT
を改めて作成し .EXE
を設定するとコマンドが実行できるようになり、晴れて問題を解決することができた。
どうやら PATHEXT
のデフォルト値は .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
のようなのでこれを設定して問題解決とした。
振り返って
luaとluarocksの設定の際に、既存のものとは別に PATHEXT
を作ったことで環境変数が重複してしまって動かなくなり、焦って削除してしまったことでややこしくなってしまった。
問題解決ができて良かったのだが二つ疑問がある。
-
PATHEXT
が設定されていないにも関わらず、 PowerShell では実行できないのにコマンドプロンプトでは実行できたのか - なぜ拡張子付きで実行すると別ウィンドが起動し、そこで実行されるのか
あと疑問ではないが、 PATHEXT
をデフォルト値に戻したのはいいものの実は必要なものが抜けていてその時にエラーが出ないかが心配。
この経験から学んだこと
- 環境変数を追加するときは、すでに存在していないか確認する
- コマンドのパスを通すには
PATH
とPATHEXT
の二つが関係している- パスを通すことについてはこの Qiita の記事に詳しく乗っているので、問題が起きた時には参考にしようと思う。