0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Win11で環境変数をいじってたらPowerShellでコマンドが動作しなくなった件

Posted at

今回起きた問題についてドンピシャな内容がなくてちょっと苦労したので、言語化して自分の学びにするとともに、同じ問題を抱えている人の解決または原因をつぶすきっかけになればと思いこの記事を作成しました。

結論

環境変数 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 などをためしたが「そんなコマンドやらバッチファイルはあらへんで」みたいなエラーしか出なくなってしまった。
failed to run cargo and winget

試したこと

1. 環境変数 PATH の確認

正しく通っているか以下の要素を確認も問題なさそうだった。

  • PowerShell 上で $env:PATH を打って確認
  • タスクバー上の検索ボックスで「システム環境変数の編集」→ 「環境変数」をクリックしてGUI上で確認
  • 使いたい PATH が追加されているか
  • 余計な文字がないか( "' など)

2. PowerShell の再インストール

winget が使えないので GitHub からインストーラをダウンロードして、リペアと削除からの再インストールを実行。しかし解決せず。

3. コマンドプロンプトでコマンドを実行

こちらではなぜか PowerShell で使えなかったコマンドが使えた。
Succeeded at the command prompt

解決の糸口: 拡張子付きでコマンドを打った

私の環境では where コマンドを実行する際に .exe をつけないとちゃんと動作しないことを思い出したため、使えないコマンドに対して拡張子付きで実行したらどうなるか試した。

cargo.exewinget.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 を作ったことで環境変数が重複してしまって動かなくなり、焦って削除してしまったことでややこしくなってしまった。

問題解決ができて良かったのだが二つ疑問がある。

  1. PATHEXT が設定されていないにも関わらず、 PowerShell では実行できないのにコマンドプロンプトでは実行できたのか
  2. なぜ拡張子付きで実行すると別ウィンドが起動し、そこで実行されるのか

あと疑問ではないが、 PATHEXT をデフォルト値に戻したのはいいものの実は必要なものが抜けていてその時にエラーが出ないかが心配。

この経験から学んだこと

  • 環境変数を追加するときは、すでに存在していないか確認する
  • コマンドのパスを通すには PATHPATHEXT の二つが関係している
    • パスを通すことについてはこの Qiita の記事に詳しく乗っているので、問題が起きた時には参考にしようと思う。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?