如何获取当前会话中无参数的PowerShell Cmdlet?
获取PowerShell中无自定义参数的Cmdlet的正确方法
你之前的命令之所以返回大量实际带有参数的Cmdlet,核心原因是$_.Parameters包含了所有PowerShell Cmdlet默认继承的通用参数(如-Verbose、-ErrorAction等)和可选通用参数(如-Confirm、-WhatIf)——哪怕一个Cmdlet没有自己定义的参数,$_.Parameters.Count也不会为0。
要筛选出真正没有自定义参数(仅保留通用参数)的Cmdlet,需要先排除通用参数集,再检查剩余参数数量:
- 先定义通用参数的集合:
$commonParams = [System.Management.Automation.PSCmdlet]::CommonParameters + [System.Management.Automation.PSCmdlet]::OptionalCommonParameters
- 过滤并输出目标Cmdlet:
Get-Command -CommandType Cmdlet | Where-Object { # 筛选当前Cmdlet中不属于通用参数的自定义参数 $customParams = $_.Parameters.Keys | Where-Object { $_ -notin $commonParams } # 判断自定义参数数量是否为0 $customParams.Count -eq 0 } | Select-Object Name, @{ Name = 'CustomParameterCount' Expression = { ($_.Parameters.Keys | Where-Object { $_ -notin $commonParams }).Count } }
补充说明
- 几乎所有PowerShell Cmdlet都继承了通用参数,因此不存在完全没有任何参数(包括通用参数)的Cmdlet。
- 如果需要覆盖动态参数(部分Cmdlet的参数仅在特定上下文/模块加载时才显示)的场景,可以给
Get-Command添加-All参数,确保获取所有可能的参数:
Get-Command -CommandType Cmdlet -All | Where-Object { $customParams = $_.Parameters.Keys | Where-Object { $_ -notin $commonParams } $customParams.Count -eq 0 } | Select-Object Name, @{n='CustomParameterCount'; e={ ($_.Parameters.Keys | Where-Object { $_ -notin $commonParams }).Count }}
内容的提问来源于stack exchange,提问作者Peter M.
相关产品推荐
相关产品推荐

