我想获取当前会话中没有参数(如果有的话)的所有 PowerShell-Cmdlet。
当我尝试时
Get-Command -CommandType Cmdlet | Where-Object { $_.Parameters.Count -eq 0 } | Select-Object -Property Name, @{n="PCount";e={$_.Parameters.Count}}
我将获得很多 Cmdlet。但事实证明它们实际上是有参数的:
(Get-Command -Name Write-Host).Parameters.Count
获取没有参数的 Cmdlet 的正确方法是什么?
但是,您不应该从过滤器中得到任何结果,正如您所说,您得到了错误的结果,这很可能是由于每个命令的参数信息的延迟加载,连续的管道到
Get-Command
强制 cmdlet 的模块加载后问题就消失了,使用 CimCmdlets
模块为例:
PS ..\pwsh> Get-Command -CommandType Cmdlet |
Where-Object { $_.Parameters.Count -eq 0 -and $_.ModuleName -eq 'CimCmdlets' }
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Export-BinaryMiLog 7.0.0.0 CimCmdlets
Cmdlet Get-CimAssociatedInstance 7.0.0.0 CimCmdlets
Cmdlet Get-CimClass 7.0.0.0 CimCmdlets
Cmdlet Get-CimInstance 7.0.0.0 CimCmdlets
Cmdlet Get-CimSession 7.0.0.0 CimCmdlets
Cmdlet Import-BinaryMiLog 7.0.0.0 CimCmdlets
Cmdlet Invoke-CimMethod 7.0.0.0 CimCmdlets
Cmdlet New-CimInstance 7.0.0.0 CimCmdlets
Cmdlet New-CimSession 7.0.0.0 CimCmdlets
Cmdlet New-CimSessionOption 7.0.0.0 CimCmdlets
Cmdlet Register-CimIndicationEvent 7.0.0.0 CimCmdlets
Cmdlet Remove-CimInstance 7.0.0.0 CimCmdlets
Cmdlet Remove-CimSession 7.0.0.0 CimCmdlets
Cmdlet Set-CimInstance 7.0.0.0 CimCmdlets
PS ..\pwsh> Get-Command -CommandType Cmdlet | Get-Command |
Where-Object { $_.Parameters.Count -eq 0 -and $_.ModuleName -eq 'CimCmdlets' }
PS ..\pwsh>
CommonParameters
和 OptionalCommonParameters
的 cmdlet,您可以使用:
$common = [System.Management.Automation.PSCmdlet]::CommonParameters
$optional = [System.Management.Automation.PSCmdlet]::OptionalCommonParameters
Get-Command -CommandType Cmdlet | Get-Command | Where-Object {
-not $_.Parameters.Keys.Where({ -not ($common.Contains($_) -or $optional.Contains($_)) })
}