2015-04-07 2 views
3

Join-Path предположительно принимает параметр Path из конвейера.Протокол пуска Powershell при прохождении по трубопроводу

Это говорит о том, что эти две функции ниже оба должны работать так:

join-path 'c:\temp' 'x'  #returns c:\temp\x 
'c:\temp' | join-path 'x' #throws an error 

Однако второй вызов (т.е. с использованием пропускания параметра Path по значению к трубопроводу) дает ошибку ниже:

join-path : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input. At line:1 char:13 + 'c:\temp' | join-path 'x' + ~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (c:\temp:String) [Join-Path], ParameterBindingException + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.JoinPathCommand

NB: Начиная с path может быть массив Я также пробовал [array]('c:\temp') | join-path 'x'; но это не имело значения.

Я что-то не понял или это ошибка в PowerShell?

ответ

3

В первом примере, выражение join-path 'c:\temp' 'x' интерпретируется PowerShell, как Join-Path -Path 'c:\temp' -ChildPath 'x' (потому что имена для позиционных параметров Path и ChildPath не являются обязательными).

В вашем втором примере вы передаете параметр трубопровода 'c:\temp' на команду Join-Path -Path 'x' (а не на отсутствие параметра ChildPath). Это не сработает, потому что Join-Path принимает только параметр Path из конвейера, но вы уже определили его.

Если вы хотите связать другой, не первый параметр, вы должны написать это имя явно, как в

'c:\temp' | Join-Path -ChildPath 'x' 
# => 'c:\temp\x' 
+0

Ах, конечно; поэтому передача параметра 1 по конвейеру не приводит к тому, что параметр 2 перемещается вверх по цепочке. Немного раздражающий дизайн языка, но, по крайней мере, это имеет смысл; Спасибо. – JohnLBevan

+2

@JohnLBevan, я бы просто сказал, что привязка параметров происходит на этапе синтаксического анализа выражения, перед парсером известно, что вы собираетесь передать что-то из конвейера. – ForNeVeR

+0

Спасибо @ForNeVeR; хорошо знать, что есть основополагающая причина для этого выбора дизайна. – JohnLBevan