为什么可选参数没有指定位置?Powershell

3

使用以下示例函数:

Function Test {
  param(
    [Parameter(Position=0)]
    [string]$Optional="some optional string",
    [Parameter(Position=1, Mandatory=$true)]
    [string]$Required
  )
  Process { }
}

我期望以下内容是相同的:

Test -Optional "optional" "required"

并且

Test "required"

不是这样的,为什么呢?可选参数并非必需,但第二个示例会失败,显示出错信息:
“无法使用指定的命名参数解析参数集。一个或多个已发出的参数不能一起使用,或提供的参数数量不足。”
如果只指定了一个参数,那么它应该是强制性参数,因为它必须被指定。
有没有办法实现我想做的事情呢?

在C#中,可选参数必须出现在必需参数之后,因此您的示例/问题可能归因于CLR。为什么不将可选参数放在最后? - derekbaker783
1个回答

1
当你在必须参数之前给一个参数指定位置时,它不是必需的,但是 期望 第一个输入将是你的可选参数。为了使你的第二个示例工作,你只需要删除非必需参数的位置引用。当然,然后Required将成为第一个位置参数或0
Function Test {
  param(
    [Parameter()]
    [string]$Optional,
    [Parameter(Position=0, Mandatory=$true)]
    [string]$Required
  )
  Process {
     Write-Host $Required
     if ($PSBoundParameters.ContainsKey('Optional')) {
        Write-Host $Optional -ForegroundColor Cyan
     }
  }
}

我添加了一些输出并删除了Optional参数的默认值,这样您就可以看到发生了什么。
如果您不想为可选参数命名,则将其放在必需参数之前。
Function Test {
  param(
    [Parameter(Position=1)]
    [string]$Optional,
    [Parameter(Position=0, Mandatory=$true)]
    [string]$Required
  )
  Process {
     Write-Host $Required
     if ($PSBoundParameters.ContainsKey('Optional')) {
        Write-Host $Optional -ForegroundColor Cyan
     }
  }
}

关于函数高级参数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接