【问题标题】:Why aren't optional parameters assigned positions? Powershell为什么不为可选参数分配位置?电源外壳
【发布时间】:2020-05-09 09:09:42
【问题描述】:

使用以下示例函数:

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。为什么不将可选参数放在最后?

标签: powershell


【解决方案1】:

当你在一个必需参数之前给一个参数一个位置时,它不是必需的,但是预计第一个输入将是你的可选参数。要使您的第二个示例正常工作,您只需删除非必需参数的 Position 引用。当然,那么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
     }
  }
}

About Functions Advanced Parameters

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多