Windows 11 で PowerShell を使っているときだけ「ping は内部コマンドまたは外部コマンド…として認識されていません」と表示されるのに、同じ PC のコマンドプロンプト(CMD)では問題なく動く──そんな不可解なトラブルに悩まされていませんか。本記事では、その代表的な原因である PATHEXT 環境変数の破損を中心に、具体的な確認方法・復旧手順・再発防止策までを詳しく解説します。
Windows 11 の PowerShell だけで ping などが実行できない現象
今回取り上げるのは、次のような状況です。
- Windows 11
- PowerShell では
ping/java/nodeなどがエラーになる - しかし同じ PC の CMD(コマンドプロンプト)では問題なく動作する
PATH環境変数には System32 など必要なパスはすでに含まれている- PowerShell の再インストールをしても直らない
PowerShell でコマンドを打つと、例えば次のようなメッセージが表示されます。
ping : 用語 'ping' は、コマンドレット、関数、スクリプト ファイル、
または操作可能なプログラムの名前として認識されません。
名前が正しく記述されていることを確認し、パスが含まれている場合は
そのパスが正しいことを確認してから、再試行してください。
あるいは英語環境では、よく見慣れたこのメッセージです。
'ping' は内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
CMD では動くのに PowerShell だけダメ、PATH も合っている──この条件がそろっている場合、かなり高い確率で「PATHEXT 環境変数の設定不良」が原因です。
なぜ CMD では動くのに PowerShell では動かないのか
PowerShell と CMD は、どちらも Windows 上でコマンドを実行するためのシェルですが、「コマンド名から実行ファイルをどう探すか」の仕組みが微妙に異なります。
共通しているのは、次の 2 点です。
PATH環境変数に登録されたフォルダを順番に探すPATHEXT環境変数に登録された拡張子を順番に試す
たとえば、あなたがシェルに ping とだけ入力したとき、実際にはこんな流れで解決されます。
PATHに登録されているフォルダを上から順番に見る- 各フォルダに対して、
PATHEXTに登録された拡張子を順番に付けて探すping.comping.exeping.bat… など
- 最初に見つかった実行ファイルを起動する
つまり、PATHEXT に .EXE などが登録されていないと、いくら PATH が正しくても ping.exe を見つけられなくなるわけです。
CMD は、起動時に読み込まれた環境変数をそのまま使います。PowerShell も基本的には同じですが、PowerShell のプロファイルやスクリプトの中で $env:PATHEXT を上書きしていると、「PowerShell だけ PATHEXT が壊れている」状態が簡単に発生します。
PATHEXT 環境変数とは? デフォルト値をおさらい
PATHEXT は、拡張子の省略を許可するリストです。ここに登録されている拡張子を持つファイルは、拡張子を省略して実行できます。
Windows 11 での典型的な初期値は、次のような文字列です。
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
代表的な拡張子だけ表にすると、以下のようになります。
| 拡張子 | 概要 | 例 |
|---|---|---|
.COM | MS-DOS 時代の実行ファイル | COMMAND.COM |
.EXE | 一般的な Windows 実行ファイル | ping.exe / java.exe |
.BAT | バッチファイル | build.bat |
.CMD | CMD 用バッチファイル | script.cmd |
.CPL | コントロールパネルのプラグイン | inetcpl.cpl(インターネットのプロパティ) |
この一覧から .EXE が抜け落ちていたり、PATHEXT 自体が空になっていたりすると、次のような現象が起こります。
ping→ エラー(ping.exeが見つからない)java→ エラーnode→ エラー- しかし
ping.exeと拡張子付きで実行すると動く
これがまさに、PowerShell でだけ「コマンドが認識されない」ときの典型的な症状です。
PowerShell から PATHEXT の現在値を確認する
まずは、実際に PATHEXT がどうなっているのかを確認しましょう。PowerShell を開き、次のコマンドを実行します。
PS> $env:PATHEXT
期待どおりなら、次のような出力になります。
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
もし、
- 何も表示されない(空になっている)
.EXEだけが抜けている- まったく別の文字列になっている
といった状態であれば、ほぼ確実にこれが原因です。
CMD 側と見比べたい場合は、コマンドプロンプトを開いて次のように入力します。
C:\> echo %PATHEXT%
PowerShell と CMD の値が大きく違っていれば、どこかで PowerShell だけ PATHEXT を上書きしている可能性が高いと判断できます。
PATHEXT を正しい値に戻す(GUI での復旧)
PATHEXT は「システム環境変数」として定義されていることが多いので、まずはシステム側の値を確認・復旧します。
システム環境変数 PATHEXT の修正手順
- Win + X キーを押して、「システム」(または「設定」→「システム」)を開く
- 「システムの詳細設定」を開き、「システムのプロパティ」ダイアログを表示する
- 「詳細設定」タブの右下にある 「環境変数(N)…」 をクリック
- 下側の「システム環境変数」から
PATHEXTを探して選択し、「編集」をクリック - 値を次の文字列に修正する
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL - 「OK」で各ダイアログを閉じる
- PowerShell をすべて閉じてから、新しく開き直す
再起動した PowerShell で、もう一度 $env:PATHEXT を確認し、修正した値が反映されていることを確認します。そのうえで、ping や java を試してみてください。
PATH の基本フォルダが揃っているかも再確認する
PATHEXT が正しくても、そもそも PATH に System32 などの重要フォルダが含まれていない場合は、やはりコマンドは見つかりません。今回のケースでは「追加済み」との前提ですが、念のため確認しておく価値があります。
PowerShell で現在の PATH を一覧表示するには、次のようにします。
PS> ($env:Path).Split(';')
表示された一覧の中に、少なくとも次の 4 つが含まれていることを確認してください。
| 推奨パス | 役割 | コメント |
|---|---|---|
C:\Windows\system32 | 主要な OS コマンド(ping.exe など) | ここが抜けていると多くの基本コマンドが使えない |
C:\Windows | 一部のシステム実行ファイル | notepad.exe などが存在 |
C:\Windows\System32\Wbem | WMI 関連コマンド | wmic.exe など |
C:\Windows\System32\WindowsPowerShell\v1.0\ | Windows PowerShell 本体 | 古い表記だが互換性のため残されている |
もしこれらが抜けている場合は、環境変数の「Path」を開き、必要なフォルダを先頭のほうに追加してください(ユーザー環境変数・システム環境変数の両方を確認するのがおすすめです)。
トラブルシューティングに役立つ PowerShell コマンド集
原因調査を効率よく進めるために、PowerShell で使える便利なコマンドをまとめておきます。
| コマンド | 用途 | ポイント |
|---|---|---|
$env:PATHEXT | PATHEXT の現在値を表示 | .EXE が含まれているか要チェック |
($env:Path).Split(';') | PATH を 1 行ずつ一覧表示 | System32 などの基本フォルダがあるか確認 |
where.exe ping | ping.exe がどこにあるかを確認 | where は CMD のコマンドなので where.exe として呼ぶ |
Get-Command ping | PowerShell がどう解決しようとしているか確認 | エラーになる場合は「コマンドが見つからない」状態 |
[Environment]::GetEnvironmentVariable("PATHEXT","Machine") | システム環境変数としての PATHEXT を取得 | ローカルな上書きがあるか切り分けに有効 |
[Environment]::GetEnvironmentVariable("PATHEXT","User") | ユーザー環境変数としての PATHEXT を取得 | ユーザー単位で上書きされていないか確認 |
where.exe ping で C:\Windows\System32\PING.EXE が見つかるのに、ping コマンドがエラーになる場合は、「ファイルは存在するが PATHEXT のせいで見つけられない」状態とほぼ断定してよいでしょう。
PowerShell プロファイルやスクリプトによる PATHEXT の上書きに注意
企業環境や開発用 PC では、ログイン時やシェル起動時に各種スクリプトが自動実行されることがよくあります。この中で不用意に $env:PATHEXT を書き換えてしまうと、PowerShell だけ挙動がおかしくなります。
PowerShell プロファイルを確認する
PowerShell には、「プロファイル」と呼ばれる自動読み込みスクリプトがあります。現在のプロファイルファイルのパスは、次のようにして確認できます。
PS> $profile
そのパスにあるファイル(例: C:\Users\ユーザー名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1)をエディタで開き、
$env:PATHEXT = "..."$env:PATHEXT += "..."
といった行がないかどうかを確認してください。もし存在し、内容が不適切な場合は、コメントアウトするか、正しい値を追加するよう修正します。
たとえば、誤って次のように書いてしまっているケースがあります。
# これは NG な例
$env:PATHEXT = ".PY"
この場合、PATHEXT が .PY だけになってしまい、.EXE は完全に無視されます。正しくは、既存値を保ったまま追加するか、明示的に必要な拡張子をすべて列挙する必要があります。
# まだマシな例(ただし推奨はしない)
$env:PATHEXT = ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL;.PY"
PATHEXT をコマンドで復旧する(上級者向け)
GUI 操作ではなく、PowerShell から直接 PATHEXT を修正したい場合は、次のようなコマンドが使えます。管理者として PowerShell を起動したうえで実行してください。
システム環境変数 PATHEXT の上書き
PS (Admin)> [Environment]::SetEnvironmentVariable(
>> "PATHEXT",
>> ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL",
>> "Machine"
>> )
続いて、ユーザー環境変数側に不要な PATHEXT があれば削除しておきます。
PS (Admin)> [Environment]::SetEnvironmentVariable("PATHEXT", $null, "User")
その後、PowerShell をすべて閉じてから再起動し、値が期待どおりかどうか確認しましょう。
環境変数のバックアップ・復旧スクリプトの例
グループポリシーやインストーラ、サードパーティツールの影響で環境変数が書き換えられることがあります。定期的にバックアップを取っておくと、トラブル時の復旧が格段に楽になります。
環境変数を JSON 形式でバックアップする例
# 環境変数を JSON としてエクスポート
$envInfo = @{
Machine = [Environment]::GetEnvironmentVariables("Machine")
User = [Environment]::GetEnvironmentVariables("User")
Process = [Environment]::GetEnvironmentVariables("Process")
}
$envInfo | ConvertTo-Json -Depth 5 | Set-Content -Encoding UTF8 `
"$HOME\env-backup-$(Get-Date -Format yyyyMMdd-HHmmss).json"
このようなスクリプトを用意しておけば、何かインストールする前に 1 回実行しておくだけで、その時点の環境変数の状態を丸ごと保存できます。
逆に、PATHEXT だけをサクッと直したいときは、次のようなワンライナーを用意してショートカットから実行してもよいでしょう。
# PATHEXT を既定値に戻す簡易スクリプト(管理者権限で実行)
[Environment]::SetEnvironmentVariable(
"PATHEXT",
".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL",
"Machine"
)
それでも直らないときに確認したいポイント
PATHEXT と PATH を直しても解決しない場合、次のような点も確認してみてください。
- 32bit / 64bit の PowerShell を混在して使っていないか
まれに、x86 用 PowerShell だけPATHが異なっている環境があります。 - ウイルス対策ソフトやセキュリティソフトが特定の EXE をブロックしていないか
実行ファイル自体が削除・隔離されていると、当然コマンドは見つかりません。 - ユーザープロファイルが損傷していないか
新規ユーザーを作成して同じ現象が再現するかどうか試してみると切り分けになります。 - 企業環境ではログオンスクリプトや GPO で環境変数が上書きされていないか
情シスに確認し、最近のポリシー変更がないかをチェックします。
とはいえ、今回のように「CMD では動くが PowerShell だけダメ」というパターンでは、やはり PATHEXT・プロファイル・PATH あたりの設定不良が 9 割以上を占めます。
最終手段としての PowerShell 再インストール
ここまで試してもどうしても直らない場合の最後の手段として、「PowerShell 自体の再インストール」があります。ただし、環境変数は OS 側の設定なので、PowerShell を入れ直しても環境変数の問題は原則としてそのまま残る点には注意してください。
Windows PowerShell の有効化 / 無効化
- スタートメニューで「Windows の機能の有効化または無効化」を検索し、開く
- 一覧から「Windows PowerShell」にチェックが入っているか確認
- 一度チェックを外して「OK」→ 再起動
- 再度同じ画面を開き、「Windows PowerShell」にチェックを入れて「OK」→ 再起動
PowerShell(新しいバージョン)を winget でインストール
Windows 11 では、新しい PowerShell(旧称 PowerShell Core)を winget からインストールすることもできます。
PS (Admin)> winget install --id Microsoft.PowerShell
インストール後、新しくインストールされた PowerShell を起動し、同じ問題が再現するかを確認します。ここでもうまく動くようなら、「環境変数ではなく、元の PowerShell 環境だけに問題がある」という切り分けができます。
再発防止のポイント
一度直しても、環境変数が再び書き換えられてしまえば、同じトラブルが再発します。ここでは、再発防止のためにできる工夫をいくつか挙げておきます。
- 環境変数を変更するスクリプトにはコメントを残す
$env:PATHEXTや$env:PATHを書き換える箇所には、「なぜ変更が必要なのか」をコメントで明記しておきましょう。 - インストーラ実行前に環境変数をバックアップする
Java / Node.js / 各種 CLI ツールなどのインストール前に、前述のバックアップスクリプトを一度流しておくと安心です。 - グループポリシーで環境変数を配布する場合は慎重にテストする
テスト用 OU で検証し、PowerShell と CMD の両方で基本コマンドが問題なく動作するか確認してから、本番 OU に適用しましょう。 - 定期的にチェックする簡易スクリプトをプロファイルに入れておく
PowerShell 起動時にPATHEXTやPATHの異常を検出して警告するミニスクリプトを入れておくのも有効です。
例えば、起動時に .EXE が含まれているかだけチェックする簡易な例は次のようになります。
# $profile に追記する例
if (-not ($env:PATHEXT -split ';' | Where-Object { $_ -ieq '.EXE' })) {
Write-Warning "PATHEXT に .EXE が含まれていません。基本コマンドが動かない可能性があります。"
}
まとめ:原因の本質は「PATHEXT による実行ファイル拡張子の解決失敗」
本記事で解説した内容を整理すると、次のようになります。
- 現象:Windows 11 の PowerShell で
ping・java・nodeなどが「コマンドとして認識されない」と表示されるが、CMD では問題なく動く。 - 典型的な原因:
PATHEXT環境変数が空、または.EXEが欠落している。 - 確認ポイント:
$env:PATHEXTで.EXEが含まれているか($env:Path).Split(';')で System32 など基本フォルダが見えているかwhere.exe pingでping.exeが存在するか- PowerShell プロファイルなどで
$env:PATHEXTを上書きしていないか
- 解決策:
- システム環境変数
PATHEXTを既定値に戻す - 必要であれば
PATHに基本フォルダを追加する - PowerShell プロファイルから不要な上書きを削除する
- システム環境変数
- 再発防止:
- 環境変数のバックアップを定期的に取る
- 環境変数を変更するスクリプトには十分なコメントを付ける
- 起動時チェック用の簡易スクリプトを用意する
「PATH は正しいのにコマンドが動かない」「PowerShell だけ動作がおかしい」といったトラブルは、どうしても原因が見えづらく、つい PowerShell の再インストールや OS 再インストールといった重い手段に走りがちです。しかし、多くの場合は PATHEXT を含む環境変数の設定を落ち着いて確認・修正するだけで解決できます。
同じような症状に遭遇したときは、まず本記事のチェックリストどおりに PATHEXT と PATH を確認してみてください。それだけで、これまで数時間かかっていたトラブルシューティングが数分で終わるはずです。

コメント