PowerShell 管道输入 ByPropertyName

PowerShell 管道输入 ByPropertyName

modules.txt给定一个包含以下内容的文本文件:

Microsoft.Powershell.Archive
Microsoft.Powershell.Management
Microsoft.Powershell.Utility

我想要获取每个模块中定义的命令。

这有效:

Get-Command -Module (Get-Content .\modules.txt)

但事实并非如此,尽管模块被定义为通过变量名接受管道输入:

get-content .\modules.txt |select @{n='Module';e={$_}} | Get-Command

返回此错误:

Get-Command: The term '@{Module=Microsoft.Powershell.Archive}' is not recognized as a 
name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is 
correct and try again.

Module我的问题是:如果参数定义为接受管道输入,为什么第二种方法会失败ByPropertyName?有什么方法可以使管道方法起作用吗?(示例来自《午餐月》中 PowerShell 第 10 章)。

更新

为了确定问题是否是不string匹配string[],我尝试了以下操作:

[string[]]$a = @("Microsoft.Powershell.Archive")
$b = [PsCustomObject]@{Module=$a}
$b | Get-Command

这收到了:

Get-Module: The specified wildcard character pattern is not valid: @{Module=System.String[]}

但我直接创建 CSV 更成功:

"Module","Verb"
"Microsoft.Powershell.Archive","Get"
"Microsoft.Powershell.Utility","Get"
"Microsoft.Powershell.Management","Get"

现在

import-csv .\modules.csv | Get-Command

产生了预期的结果。

答案1

ByParameterBinding 似乎仅限于绑定多个参数的情况。

这有效:

gc .\modules.txt |
Select @{Name='Module';Expression={$_}}, @{Name='Verb';Exp={'*'}} |
Get-Command

但这失败了:

gc .\modules.txt |
Select @{Name='Module';Expression={$_}} |
Get-Command

由于括号语法可用,因此这不是功能限制,并且表明它ByParameterName是可用的,只要它是传递的一组参数的一部分。

注意:Windows PowerShell 5.1 和 PowerShell 7.4 也会出现同样的行为,因此这似乎是一个稳定的限制ByParameterName

相关内容