我想从一个目录列出我的所有PowerShell功能。以下命令有效:
Get-ChildItem -Path ($env:USERPROFILE + "\somewhere\*.psm1") -Recurse | ForEach-Object {Get-Command -Module $_.BaseName}
现在,我尝试将Get-ChildItem
的输出直接传递给cmdlet Get-Command
。像这样的东西,这是行不通的:
Get-ChildItem -Path ($env:USERPROFILE + "\somewhere\*.psm1") -Recurse | Get-Command -Module {$_.BaseName}
显然,我真的不明白如何将对象从Get-ChildItem
以正确的方式传递到-Module
中的参数Get-Command
。
我有两个问题:
-Module
,或者对象是否总是移交给一个默认参数?答案 0 :(得分:3)
参数可以用四种不同的方式绑定:
Get-ChildItem C:\
(仅限某些参数)Get-ChildItem -Path C:\
1..5 | Get-Random
(仅限某些参数)'C:\Windows' | Get-ChildItem
(仅限某些参数)您可以通过Get-Help <command> -Parameter *
检查参数绑定的各种方式。然后,您可以看到Get-Command
允许Module
参数仅由属性名称绑定:
-Module [<String[]>]
Specifies an array of modules. ...
Required? false
Position? named
Default value none
Accept pipeline input? True (ByPropertyName)
Accept wildcard characters? false
因此输入必须是具有Module
属性的对象,以允许绑定。在您的情况下,您需要在两者之间进行额外的步骤:
Get-ChildItem -Path ($env:USERPROFILE + "\somewhere\*.psm1") -Recurse |
Select-Object @{l='Module';e={$_.Basename}} |
Get-Command
现在,这个实例有点烦人,因为Module
参数是由属性名绑定的,但是大多数事情都没有给你一个具有Module
属性的对象。哎呀,即使Get-Module
也没有,因为返回的对象使用Name
作为属性名称,所以你甚至不能这样做
Get-Module | Get-Command
然而,在许多其他地方(特别是关于路径)工作得非常好。如果您可以控制输入对象,例如从CSV或其他数据源读取时,您最终可以得到相当简洁的代码。
编辑:Ansgar Wiechers指出,虽然应工作,但实际上并非如此。这可能是PowerShell参数绑定算法的缺陷(如上所述,它非常复杂,我们也从未在Pash中正常工作),或者Get-Command
cmdlet可能只是简单地描述参数因为原因不能允许绑定。