Powershell 仅接受命名的可选参数,而不接受位置参数

Powershell 仅接受命名的可选参数,而不接受位置参数,powershell,parameters,optional-parameters,Powershell,Parameters,Optional Parameters,我正在编写一个PowerShell脚本,它是一个.exe的包装。我想有一些可选的脚本参数,并将其余的直接传递给exe。下面是一个测试脚本: param ( [Parameter(Mandatory=$False)] [string] $a = "DefaultA" ,[parameter(ValueFromRemainingArguments=$true)][string[]]$ExeParams # must be string[] - otherwise .exe invo

我正在编写一个PowerShell脚本,它是一个.exe的包装。我想有一些可选的脚本参数,并将其余的直接传递给exe。下面是一个测试脚本:

param (
    [Parameter(Mandatory=$False)] [string] $a = "DefaultA"
   ,[parameter(ValueFromRemainingArguments=$true)][string[]]$ExeParams   # must be string[] - otherwise .exe invocation will quote
)

Write-Output ("a=" + ($a) + "  ExeParams:") $ExeParams
若我和一个命名的param一起运行,一切都很好:

C:\ > powershell /command \temp\a.ps1 -a A This-should-go-to-exeparams This-also
a=A  ExeParams:
This-should-go-to-exeparams
This-also
但是,如果我试图省略我的参数,则会将第一个未命名的参数指定给它:

C:\ > powershell /command \temp\a.ps1 This-should-go-to-exeparams This-also
a=This-should-go-to-exeparams  ExeParams:
This-also
我希望:

a=DefaultA ExeParams:
This-should-go-to-exeparams
This-also
我尝试将
Position=0
添加到参数,但结果相同

有没有办法做到这一点?

可能是不同的参数方案?

默认情况下,所有功能参数都是位置参数。Windows PowerShell按照参数在函数中声明的顺序为参数指定位置号。要禁用此功能,请将
CmdletBinding
属性的
positionbinding
参数的值设置为
$False

看一看


主要答案在第5版中仍然有效(根据评论,在第2版中它可能已经被破坏了一段时间)

还有另一个选项:将位置添加到ValueFromRemainingArgs参数

CommandWrapper.ps1示例:

param(
    $namedOptional = "default",
    [Parameter(ValueFromRemainingArguments = $true, Position=1)]
    $cmdArgs
)

write-host "namedOptional: $namedOptional"
& cmd /c echo cmdArgs: @cmdArgs
样本输出:

>commandwrapper hello world
namedOptional: default
cmdArgs: hello world

这似乎是PowerShell从第一个指定位置的参数分配参数位置之后的结果

我无法在Powershell 2.0中实现此功能-这是预期的吗?我认为这在Powershell 2.0中不起作用(链接的博客文章说它不起作用,并提到)
>commandwrapper hello world
namedOptional: default
cmdArgs: hello world