Powershell管道和命令行参数

Powershell管道和命令行参数,powershell,Powershell,我有一个Powershell函数,它接受3个参数(其中两个是可选的),函数的参数定义如下: Param( [parameter(Mandatory=$true, ValueFromPipeline=$true)] [String] $text, [parameter(Mandatory=$false)] [String] $from = "auto", [parameter(Mandatory=$false)] [String]

我有一个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
但我不喜欢一直键入参数的名称。这可以使用吗,有没有快捷方式?不工作(愿望列表)示例(任何都可以):


您可以将
-Text
作为最后一个位置参数:

Param(
[参数(位置=2,必需=$true,ValueFromPipeline=$true)]
[字符串]$text,
[参数(位置=0,强制=false)]
[String]$from=“自动”,
[参数(位置=1,强制=false)]
[String]$to=“lt”
)
但是,如果不从管道读取管理参数或使用3个参数调用函数,则必须使用命名参数调用函数:

Foo -Text 'something'
否则,系统将提示您输入:

PS C:\> Foo 'something'

cmdlet Foo at command pipeline position 1
Supply values for the following parameters: _
PS C:\>Foo'something'
命令管道位置1处的cmdlet Foo
提供以下参数的值:u
因此,基本上您可以选择在哪种情况下提供参数名称:

  • 用于从管道读取时的可选参数,或
  • 用于不从管道读取时的强制参数

似乎最好的选择是保持原样,强制参数出现的频率更高——这就是为什么命名它会变得更加毫无意义的原因
PS C:\> Foo 'something'

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