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