#命令找不到
运行命令时出现 CommandNotFoundException,通常意味着 PowerShell 在当前会话中找不到该名称对应的命令或程序:
Get-Command: The term 'foo' is not recognized as a name of a cmdlet, function,
script file, or executable program.
#常见原因
- 命令名拼写错误,或大小写、连字符不一致。
- 命令来自尚未安装或尚未导入的模块。
- 可执行文件不在
PATH环境变量中。 - 同名别名或函数覆盖了原本的命令。
- 命令只存在于 Windows PowerShell,PowerShell 7 中已被移除或改名。
#使用 Get-Command 排查
Get-Command 用于查找命令是否存在以及它的来源,详见 Get-Command 帮助手册。
> Get-Command nonexistent
查看同名命令的所有来源,或按名称模式搜索:
> Get-Command ls -All
> Get-Command -Name *service* -CommandType Cmdlet
#检查 PATH
外部程序依赖 PATH 环境变量。查看当前路径列表,或临时追加目录:
> $env:Path -split [System.IO.Path]::PathSeparator
> $env:Path += [System.IO.Path]::PathSeparator + '/opt/tools'
PATH 的修改只对当前会话有效。永久修改需要在系统中设置,Windows 与 Linux 的方式不同。
#导入或安装模块
命令来自模块但尚未导入时,先确认模块是否可用:
> Get-Module -ListAvailable
> Import-Module Az.Accounts
如果没有安装,可以从 PowerShell 库安装:
> Find-Module -Name Az
> Install-Module -Name Az -Scope CurrentUser
安装后如果仍然找不到命令,关闭并重新打开 PowerShell,让模块路径重新加载。
#别名与函数冲突
别名和函数的优先级高于同名外部程序。查看命令的实际来源:
> Get-Command ping -All
> Get-Alias -Name ls
如果确认是别名导致的问题,可以删除当前会话中的别名:
> Remove-Item Alias:ls
#版本差异
部分命令只在 Windows PowerShell 中存在,PowerShell 7 中需要使用替代命令:
| 旧命令 | 替代命令 |
|---|---|
Get-WmiObject | Get-CimInstance |
Get-EventLog | Get-WinEvent |
Out-GridView | Out-ConsoleGridView(需安装模块) |
在脚本中调用外部命令时,使用完整路径或先验证命令是否存在:
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
throw '未找到 git,请先安装并加入 PATH'
}