何が起きているのか
コマンドを実行すると、PowerShell が次のエラーを表示します:
foo : The term 'foo' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
つまり:PowerShell が把握しているすべてのディレクトリを検索したが、見つからなかったということです。修正方法はなぜコマンドが見つからないかによって異なります — PATH の未登録、未ロードのモジュール、シェルの違い、またはスクリプトをブロックしている実行ポリシーが原因として考えられます。
修正前に原因を診断する
1. コマンド自体が存在するか確認する
まず Get-Command を使います:
Get-Command foo
出力がなければ、PowerShell が本当にそのコマンドを認識していません。パスが出力される場合は、バイナリは存在するものの、権限の問題、インストールの破損、またはバージョンの不一致など別の原因があります。
2. PATH の内容を確認する
$env:PATH -split ';'
ツールが格納されているディレクトリがリストにあるか確認します。リストにない場合、それがほぼ確実に原因です。
3. バイナリの実際の場所を確認する
# カスタムパスにインストールされた CLI ツールの例
Test-Path "C:\Tools\mytool\mytool.exe"
True が返ればファイルは存在しています — ただし、まだ PATH に登録されていないだけです。
修正 1:不足しているディレクトリを PATH に追加する
ほとんどの場合、これが原因です。ユーザーアカウントに対して永続的にディレクトリを追加します:
# ユーザー PATH に追記 — 再起動後も有効
$dir = "C:\Tools\mytool"
$current = [Environment]::GetEnvironmentVariable("PATH", "User")
if ($current -notlike "*$dir*") {
[Environment]::SetEnvironmentVariable("PATH", "$current;$dir", "User")
Write-Host "Added $dir to PATH"
} else {
Write-Host "Already in PATH"
}
実行後は PowerShell を閉じて再度開いてください。現在のセッションには変更が反映されません。
再起動せずに今すぐ使いたい場合は、次のワンライナーを使います — ただし現在のセッションのみ有効です:
$env:PATH += ";C:\Tools\mytool"
修正を確認する
Get-Command mytool
mytool --version
修正 2:実行ポリシーが .ps1 スクリプトをブロックしている
パスプレフィックスなしでスクリプト名だけで .ps1 スクリプトを実行しようとするとこのエラーが発生します。また、Restricted の実行ポリシーはすべてのスクリプトをデフォルトでブロックします。
# 現在のポリシーを確認
Get-ExecutionPolicy
# ローカルで作成したスクリプトを許可する(開発環境向けの安全な設定)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
PowerShell は cmd.exe のようにスクリプトの検索にカレントディレクトリを使用しません。ローカルスクリプトは必ず明示的なパスで呼び出してください:
# 誤り — PowerShell はスクリプト検索でカレントディレクトリを無視する
myscript
# 正しい
.\myscript.ps1
# またはフルパスで
"C:\Scripts\myscript.ps1"
修正 3:モジュールがインポートされていない
多くのコマンドレットはデフォルトでロードされないモジュールに含まれています。Connect-AzAccount、Get-AzVM、およびほとんどのベンダー製コマンドレットがこれに該当します。
# 現在ロードされているモジュールを確認
Get-Module
# コマンドレットに対応するモジュールを検索
Get-Module -ListAvailable | Where-Object { $_.Name -like "*Az*" }
# モジュールをロード
Import-Module Az.Accounts
モジュールがまだインストールされていない場合は、まず PowerShell Gallery から取得します:
Install-Module -Name Az -Scope CurrentUser -Force
その後、元のコマンドを再実行してください。
修正 4:シェルが違う
cmd.exe と PowerShell は互換性がありません。簡単な確認方法:
# 実行して — バージョン番号が表示されれば PowerShell にいます
$PSVersionTable.PSVersion
# エラーが出た場合は cmd.exe にいます。PowerShell を起動してください:
powershell
# または PowerShell 7 の場合:
pwsh
もう一つの注意点:Windows PowerShell 5.1 と PowerShell 7 は別々のインストールで、モジュールのディレクトリも異なります。5.1 でインストールしたモジュールは 7 では利用できず、その逆も同様です。もう一方のバージョンにも再インストールする必要があります。
修正 5:タイポまたはコマンド名の間違い
PowerShell のコマンドレットは厳密な 動詞-名詞 の形式に従っています。正確な名前がわからない場合は検索してください:
# 部分一致で検索
Get-Command *process*
Get-Command -Verb Get -Noun *service*
# または最初の数文字を入力した後に Tab キーを押す
修正 6:別のユーザーまたはスコープでインストールされたコマンド
ユーザー単位のインストーラー(npm グローバルパッケージ、pip、Scoop など)は、システム PATH に含まれないユーザー固有のディレクトリにバイナリを配置することがあります。
# npm: グローバルの bin ディレクトリを確認
npm config get prefix
# 典型的な出力例: C:\Users\you\AppData\Roaming\npm
# このフォルダを PATH に追加する必要があります
# pip: ユーザースクリプトのディレクトリを確認
python -m site --user-scripts
出力されたパスをコピーし、修正 1 の手順で追加してください。
確認チェックリスト
Get-Command <toolname>を実行 — 有効なパスが含まれた結果が返されること- コマンドを直接実行 — "not recognized" エラーが出ないこと
- 新しい PowerShell ウィンドウを開いて再実行 — PATH の変更がセッション限りではなく永続的であることを確認
- モジュールの問題だった場合、
Get-Moduleにインポート済みモジュールが表示されること
得られた教訓
- PowerShell は(cmd.exe と異なり)実行ファイルの検索にカレントディレクトリを使用しません。ローカルスクリプトには明示的な
.\script.ps1プレフィックスが必要です。 - システムのプロパティや
[Environment]::SetEnvironmentVariableによる PATH の変更は、新しいシェルセッションを開始しないと反映されません。セッション内での$env:PATHの変更は一時的なものです。 - PowerShell 5.1 と PowerShell 7 はモジュールの保存場所が別々です。バージョンを切り替える場合は、もう一方のバージョンにモジュールを再インストールする必要があります。
- インストーラーが「PATH に追加しました」と表示した場合でも、
$env:PATH -split ';'で確認してください。一部のインストーラーは通知なく失敗することがあり、また変更がシステム全体に反映されるまで完全なログアウトが必要な場合もあります。

