我刚刚输入一个很长的问题,只是在我发布之前自己找出答案.但是,它仍然不是一个完美的解决方案,我想知道我是否能得到解释为什么以下不起作用.
我想要做的是有一个可选参数,如果没有设置,将为null.我希望该参数是一个字符串.
所以我会做这样的事情:
function myfunction {
param([string]$x = $null)
set-aduser -identity someuser -officephone $x
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,它似乎$x永远不会为null,即使我稍后在代码中明确设置它.如果我要删除[string],它工作正常.只是想知道为什么会这样.这不是什么大问题,但我不明白为什么它不起作用.
这是因为您将参数值转换为字符串:
param([string]$x = $null)
^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
转换$null为字符串始终返回空字符串:
PS > [string]$x = $null
PS > $x.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS > $x.Length
0
PS >
Run Code Online (Sandbox Code Playgroud)
解决这个问题的一种方法是删除强制转换并使用-is运算符自己检查变量的类型:
function myfunction {
param($x)
if ($x -is [string] -or $x -eq $null) {
set-aduser -identity someuser -officephone $x
}
}
Run Code Online (Sandbox Code Playgroud)
如果用户传递了错误类型的参数,或者该函数显然什么都不做,那么您可能还应该输出错误,这可能会造成混淆.
如果您已经完成了所有这些操作,那么您应该问问自己,Set-ADUser为您输出错误是否更好.它会更高效,涉及更少的代码,并最终产生相同的结果.
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |