![](/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.