powershell - 如果设置了数据类型,参数值不能设置为空

标签 powershell

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

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

所以我会做这样的事情:

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/

相关文章:

powershell - 使用 Powershell 将多个二进制文件合并为一个文件

powershell - 使用经过转换的 web.config 发布后更新 Azure CSPKG

sql-server - 如何从 PowerShell 调用 SQL Server 存储过程?

javascript - 如何使用声明为 div 的 html 或 java 脚本单击按钮

powershell - 如何在 PowerShell 中通过管道传输二进制数据

powershell - Powershell中快速简单的二进制连接文件

Powershell - 排除 P : Drive from foreach loop

Powershell getchild-item 按特定日期

powershell - 添加基于注释的帮助中断动态参数的获取帮助

html - PowerShell 电子邮件 - 使用 HTML 发送正文中的 .csv