查找不带参数的 PowerShell-Cmdlet

问题描述 投票:0回答:1

我想获取当前会话中没有参数(如果有的话)的所有 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 的正确方法是什么?

powershell reflection
1个回答
0
投票

但是,您不应该从过滤器中得到任何结果,正如您所说,您得到了错误的结果,这很可能是由于每个命令的参数信息的延迟加载,连续的管道到

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($_)) })
}
© www.soinside.com 2019 - 2024. All rights reserved.