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

Rya*_*anL 3 powershell

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

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

所以我会做这样的事情:

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

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

iCo*_*dez 6

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

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为您输出错误是否更好.它会更高效,涉及更少的代码,并最终产生相同的结果.