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
。