我刚刚输入了一个很长的问题,只是在我发布之前就自己找出了答案。但是,它仍然不是一个完美的解决方案,我想知道我是否能得到解释为什么以下不起作用。
我想要做的是有一个可选参数,如果没有设置,将为null。我希望该参数是一个字符串。
所以我会做这样的事情:
function myfunction {
param([string]$x = $null)
set-aduser -identity someuser -officephone $x
}
通过这样做,似乎$x
永远不会为null,即使我稍后在代码中明确设置它。如果我要删除[string]
,它可以正常工作。只是想知道为什么会这样。这不是什么大问题,但我不明白为什么它不起作用。
答案 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
为你输出错误是不是更好。它会更有效,涉及更少的代码,并最终产生相同的结果。