我需要在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,它会按照我的预期工作并打印“确定”。
但是,如果我从普通控制台那样做,那就会打印出#oops'。
发生了什么事?这样做的正确方法是什么?
答案 0 :(得分:1)
允许用户传入参数参数值$null
并不会改变powershell将尝试将其转换为[string]
的事实。
将powershell中的$null
值转换为字符串会产生一个空字符串:
$str = [string]$null
$null -eq $str # False
'' -eq $str # True
(同样适用于$null -as [string]
和"$null"
)
如果您不仅要允许 MyParam
,还要接受 $null
,请删除$null
参数上的类型约束参数值:
function Set-X {
param(
[AllowNull()]$MyParam = [System.Management.Automation.Language.NullString]::Value
)
if ($null -ne $MyParam) { write-host 'oops' }
else { write-host 'ok' }
}
答案 1 :(得分:0)
正如Mathias和BenH所写,罪魁祸首将$ null强制转换为[string]类型,这将导致一个空字符串:
[string]$null -eq '' #This is True
但是要使Mathias答案中的示例代码正常工作,我们还必须替换
[System.Management.Automation.Language.NullString]::Value
带有$ null
function Set-X {
param(
[AllowNull()]$MyParam = $null
)
if ($null -ne $MyParam) { write-host 'oops' }
else { write-host 'ok' }
}