Function 函数中的空参数不为Null

Function 函数中的空参数不为Null,function,powershell,if-statement,Function,Powershell,If Statement,鉴于这一基本功能: Function TestFunction { Param ( [int]$Par1, [string]$Par2, [string]$Par3 ) If ($Par1 -ne $Null) { Write-Output "Par1 = $Par1" } If ($Par2 -ne $Null -or $Par2 -ne '') { Write-Output "Par2 = $Par2" } If ($Par3 -ne $Null) { Wri

鉴于这一基本功能:

Function TestFunction {
    Param ( [int]$Par1, [string]$Par2, [string]$Par3 )
    If ($Par1 -ne $Null) { Write-Output "Par1 = $Par1" }
    If ($Par2 -ne $Null -or $Par2 -ne '') { Write-Output "Par2 = $Par2" }
    If ($Par3 -ne $Null) { Write-Output "Par3 = $Par3" }
}
TestFunction -Par1 1 -Par3 'par3'
…输出为:

Par1 = 1
Par2 = 
Par3 = par3
即使我没有向
$Par2
变量传递任何内容,它仍然不是Null或空的。发生了什么,我如何重写该语句,以便第二个If语句的计算结果为False,并且脚本块不会被执行


(我添加了
-或$Par2-ne'
只是为了测试,它的行为与没有它的情况相同。)

您的程序中有一个逻辑错误:
$Par2
将始终不等于
$null
不等于
'

要修复逻辑,应在此处使用
-和
而不是
-或

If($Par2-ne$Null-和$Par2-ne''){Write Output“Par2=$Par2”}
但是,由于您将
$Par2
参数强制转换为函数参数列表中的字符串:

Param([int]$Par1,[string]$Par2,[string]$Par3)
^^^^^^^^
检查
$Par2-ne$Null
是不必要的,因为
$Par2
始终是字符串类型(如果不给它赋值,它将被分配给
'
)。所以,你应该写:

If($Par2-ne“”){Write Output“Par2=$Par2”}
或者,由于
'
的计算结果为false,您可以只执行以下操作:

If($Par2){Write Output“Par2=$Par2”}
您可以检查(检查$variablename是否将$null作为值):

如果(!$variablename){Write Host“变量为空”}

如果要检查$variablename是否有除$null以外的任何值:


如果($variablename){Write Host“变量不是空的”}

那太快了。但是,
$Par2
中到底有什么?如果我向它传递一个值,
$Par2-ne$Null
将为true。但是如果我不向它传递任何信息,
$Par2-ne$Null
应该是false,并且不应该执行,对吗?然而,它确实…看到了我的编辑
$Par2
将始终是一个字符串,因为您在函数的参数列表中将其强制转换为一个字符串。另外,对于将来,您可以使用
GetType
方法获取任何变量的类型:
$Par2.GetType()
。这将大大有助于调试。所以,因为我在参数块中铸造了它,它将始终存在,因此永远不会为null?即使我将默认值更改为null(
[string]$Par2=$null
)?整数总是0?因此,如果我不向
$par1
传递任何内容,那么
if($par1)
将为真,因为它包含0?因此,在试图通过强制转换变量类型来编写更好的脚本时,我实际上让自己更加困难。是的,这是正确的
$Par2
将永远不会是
$null
,因为您将其转换为字符串。即使您执行了
[string]$Par2=$Null
,它仍将被分配给
'
(您可以使用
$Par2.GetType()
测试此操作)。是的,
[int]$Par1=$Null
将使
$Par1
变成
0
。但是,
If($Par1)
将不为真,因为
0
在布尔上下文中计算为假(所有其他数字计算为真)。我想我明白了,谢谢。你救了我的头痛。为了这个线程的完整性,我刚刚发现了
[string]$Par2=[System.Management.Automation.Language.NullString]::Value
毕竟可以将字符串转换为null,现在我知道了谷歌搜索的目的。虽然这不适用于整数。