如何列出PowerShell中所有重载Cmdlet(含未加载模块提供的命令)
PowerShell查询未加载模块同名命令的解决方案
默认情况下,Get-Command -All仅扫描已导入到当前会话的模块命令,当会话中已存在同名命令时,会自动跳过未加载模块的同名命令搜索,这是PowerShell为了提升检索效率做的默认优化,并非功能缺陷。
方案1:强制扫描所有可用模块(无需提前导入)
在PowerShell 5.1及更高版本中,给Get-Command加上-ListImported:$false参数,即可强制检索系统所有已注册模块中的匹配命令,不受当前已加载模块限制:
Get-Command Expand-Archive -All -ListImported:$false
执行后会按优先级返回所有模块下的Expand-Archive命令,包含未加载的内置模块命令。
方案2:指定模块范围检索
如果需要定向检索特定前缀的模块(比如系统内置模块),可以通过-Module参数指定通配符范围,无需全量扫描:
# 检索所有微软官方内置模块中的Expand-Archive命令 Get-Command Expand-Archive -All -Module Microsoft.PowerShell.*
方案3:全量审计系统所有可用命令(零模块加载)
如果需要审计系统上所有可用的命令,不想提前导入任何模块,可以直接读取所有模块的导出命令清单:
# 遍历所有已注册的可用模块,读取导出命令,无需加载模块 Get-Module -ListAvailable | ForEach-Object { $_.ExportedCommands.Values } | Where-Object Name -eq 'Expand-Archive'
该方法适合批量排查命令冲突、审计系统命令清单的场景,不会对当前会话产生任何副作用。
Chocolatey包冲突问题的最优修复方案
为了彻底避免第三方模块重载导致的命令冲突,所有公开分发的PowerShell脚本/包,建议统一使用模块限定名调用内置命令:
# 直接指定模块名调用,完全忽略会话命令优先级影响 Microsoft.PowerShell.Archive\Expand-Archive -Path $zipPath -DestinationPath $outputPath
不需要提前导入对应模块,PowerShell会在首次调用时自动加载对应模块,彻底解决同名命令冲突问题。
内容的提问来源于stack exchange,提问作者codewario
相关产品推荐
相关产品推荐

