函数默认命名参数问题

时间:2016-09-21 20:38:23

标签: powershell-v4.0

如果我在没有任何参数的情况下调用该函数,则默认值为

当我调用一个带有命名参数的函数并且我将其中一个留空时我得到一个错误...有什么方法可以解决这个问题吗?

这是函数

function foo {
  Param(
    [string]$a,
    [string]$b = "bar",
    [bool]$c = $false
  )

  Write-Host "a:", $a, "; b:", $b, "; c:", $c
}
foo "hello"

返回a: hello ; b: bar ; c: False

foo -a test -b test -c $true

返回a: test ; b: test ; c: True

foo -a test -b test -c

抛出错误:

  

foo:缺少参数' c'的参数。指定类型的参数   ' System.Boolean'然后再试一次。

2 个答案:

答案 0 :(得分:1)

完全省略参数时,将分配参数的默认值。如果您提供参数但省略了值$null已通过。

使用开关通常更好,而不是使用布尔参数:

function foo {  
  Param(
    [string]$a,
    [string]$b = "bar",
    [Switch][bool]$c
  )

  Write-Host "a: $a`nb: $b`nc: $c"
}

当省略时,开关的值会自动$false,当存在时会自动$true

PS C:\> foo -a test -b test -c
a: test
b: test
c: True
PS C:\> foo -a test -b test
a: test
b: test
c: False

您还可以显式传递如下值:

PS C:\> foo -a test -b test -c:$true
a: test
b: test
c: True
PS C:\> foo -a test -b test -c:$false
a: test
b: test
c: False

答案 1 :(得分:0)

您使用[bool]作为$ c的类型。如果您这样做,PowerShell需要通过调用:

来获取值
foo -a test -b test -c

这是因为你告诉PowerShell:不要使用声明的默认值,我想覆盖默认值,但你不知道PowerShell应该使用哪个值而不是默认值。

我认为你要找的是你的功能的[开关]。 尝试:

function foo {  
    param([string] $a, [string]$b = "bar", [switch] $c) 

    Write-Host "a:", $a, "; b:", $b, "; c:", $c 
} 

foo "hello" -c

结果将是:

a: hello ; b: bar ; c: True

如果不使用-c开关,则$ c将为$ false。

可在此处找到更多信息:https://msdn.microsoft.com/en-us/library/dd878252(v=vs.85).aspx - >切换参数