我需要在powershell中编写一个函数,该函数从一个``参数''中分开,而'参数未通过'传递给一个用字符串空(或任何其他字符串)
传递给一个'参数我这样写了:
function Set-X {
param(
[AllowNull()][string]$MyParam = [System.Management.Automation.Language.NullString]::Value
)
if ($null -ne $MyParam) { write-host 'oops' }
else { write-host 'ok' }
}
如果我调用ISE的无参数的set-x,它可以按照我的期望和打印"确定"。
但是,如果我从普通控制台中这样做,它会打印"哎呀"。
发生了什么事?什么是正确的方法?
允许用户传递$null
的参数参数值不会改变PowerShell将尝试将其转换为[string]
的事实。
将powershell中的 $null
值转换为字符串会导致一个空字符串:
$str = [string]$null
$null -eq $str # False
'' -eq $str # True
($null -as [string]
和"$null"
也是如此)
如果您不仅要允许 $null
,又要 accept $null
作为参数值:
MyParam
参数上的类型约束。 function Set-X {
param(
[AllowNull()]$MyParam = [System.Management.Automation.Language.NullString]::Value
)
if ($null -ne $MyParam) { write-host 'oops' }
else { write-host 'ok' }
}
正如Mathias和Benh所写的那样,罪魁祸首将$ null投入到[字符串]类型上,这会导致一个空字符串:
[string]$null -eq '' #This is True
但是,对于Mathias中的示例代码正确工作,我们还必须替换
[System.Management.Automation.Language.NullString]::Value
with $ null
function Set-X {
param(
[AllowNull()]$MyParam = $null
)
if ($null -ne $MyParam) { write-host 'oops' }
else { write-host 'ok' }
}