![](/img/trans.png)
[英]When a commandlet accepts pipeline input, what is the difference between ByPropertyName and ByValue?
[英]PowerShell: How can I pipeline objects to a parameter that accepts input “ByPropertyName”?
下面是一个示例PowerShell脚本(它不起作用),它说明了我想要做的事情:
$BuildRoot = '_Provided from script parameter_'
$Files = 'a.dll', 'b.dll', 'c.dll'
$BuiltFiles = $Files | Join-Path $BuildRoot
我有一个文件名列表和一个目录名,我想将它们加在一起,很简单。 问题是这不起作用,因为Join-Path
参数-ChildPath
接受来自管道ByPropertyName的输入,因此报告以下错误:
输入对象不能绑定到命令的任何参数,因为该命令不接受管道输入或输入及其属性与采用管道输入的任何参数都不匹配。
我可以通过将行更改为以下内容来“修复”它:
$BuiltFiles = $Files | Select @{ Name = "ChildPath"; Expression = {$_}} | join-path $BuildRoot
基本上, select
操作是将对象转换为属性值。 这有效,但它引入了很多语法噪音来完成看似微不足道的事情。 如果这是唯一的方法,那就这样吧,但是我想让这个脚本在将来可以维护,而且乍一看这有点难以理解。
有没有更清洁的方法来完成我在这里尝试做的事情?
你可以这样做更轻松一点:
$Files = 'a.dll', 'b.dll', 'c.dll'
$Files | Join-Path $BuildRoot -ChildPath {$_}
注意:您不希望在文件周围添加{}
。 这在PowerShell中创建了一个脚本块,它本质上是一个匿名函数。 此外,当参数是管道绑定时,您可以使用提供scriptblock( {}
)的技巧,其中$_
在该scriptblock中定义为当前管道对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.