如果设置了数据类型,则参数值不能设置为null

时间:2015-05-11 23:11:49

标签: powershell

我刚刚输入了一个很长的问题,只是在我发布之前就自己找出了答案。但是,它仍然不是一个完美的解决方案,我想知道我是否能得到解释为什么以下不起作用。

我想要做的是有一个可选参数,如果没有设置,将为null。我希望该参数是一个字符串。

所以我会做这样的事情:

function myfunction {
    param([string]$x = $null)
    set-aduser -identity someuser -officephone $x
}

通过这样做,似乎$x永远不会为null,即使我稍后在代码中明确设置它。如果我要删除[string],它可以正常工作。只是想知道为什么会这样。这不是什么大问题,但我不明白为什么它不起作用。

1 个答案:

答案 0 :(得分:6)

这是因为您要将参数值转换为字符串:

param([string]$x = $null)
      ^^^^^^^^

$null转换为字符串始终返回空字符串:

PS > [string]$x = $null
PS > $x.GetType() 

IsPublic IsSerial Name                                     BaseType                
-------- -------- ----                                     --------                
True     True     String                                   System.Object           


PS > $x.Length
0
PS >

解决此问题的一种方法是使用-is operator删除演员并自行检查变量的类型:

function myfunction {
    param($x)
    if ($x -is [string] -or $x -eq $null) {
        set-aduser -identity someuser -officephone $x
    }
}

如果用户传递了错误类型的参数,那么您可能还应该输出错误,否则该函数显然什么都不做,这可能会令人困惑。

如果你已经完成了这一切,你应该问问自己,让Set-ADUser为你输出错误是不是更好。它会更有效,涉及更少的代码,并最终产生相同的结果。