Powershell管道和命令行参数

时间:2015-03-26 09:22:24

标签: powershell

我有一个Powershell函数,它接受3个参数(其中两个是可选的),函数的参数定义如下:

Param(
    [parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [String]
    $text,

    [parameter(Mandatory=$false)]
    [String]
    $from = "auto",

    [parameter(Mandatory=$false)]
    [String]
    $to = "lt"
)

如果我使用1,2或3个命令行参数运行脚本 - 一切正常。如果我没有参数运行,但从管道传递值 - 一切正常。工作实例:

Foo "hello"
Foo "hola" es
Foo "hola" es lt
"hello" | Foo

我希望能够将值从管道传递到第一个参数并提供其他命令行参数,但我收到错误:"输入对象无法绑定到命令的任何参数,因为命令执行不接受管道输入或输入及其属性与管道输入的任何参数都不匹配"。

如果按名称提供参数,有一个工作示例:

"hello" | Foo -from en -to ru

但我并不是真的喜欢一直输入参数名称。这可以被忽略,有没有捷径?不工作(愿望清单)的例子(任何人都会这样做):

"hello" | Foo en es
"hello" | Foo - en es
"hello" | Foo -- en es

1 个答案:

答案 0 :(得分:2)

您可以使-Text成为最后一个位置参数:

Param(
    [Parameter(Position=2, Mandatory=$true, ValueFromPipeline=$true)]
    [String]$text,

    [Parameter(Position=0, Mandatory=$false)]
    [String]$from = "auto",

    [Parameter(Position=1, Mandatory=$false)]
    [String]$to = "lt"
)

但是当你没有从管道中读取manadatory参数或者使用3个参数调用该函数时,你必须使用命名参数调用该函数:

Foo -Text 'something'

否则会提示您输入:

PS C:\> Foo 'something'

cmdlet Foo at command pipeline position 1
Supply values for the following parameters: _

因此,基本上您可以选择在哪种情况下提供参数名称:

  • 用于从管道读取时的可选参数,或
  • 为未读取管道时的必需参数。