考虑以下因素:
$psversiontable # 7.4.6
$a = $null
$null -eq $a # Returns $true
$a.GetType() # You cannot call a method on a null-valued expression.
$b = $a.PSObject.Copy() # You cannot call a method on a null-valued expression.
$c = Get-Process | Where-Object { $_.Name -eq "oiawmij3209j23oifnoeicn" } # Matches nothing, should return nothing
$null -eq $c # Returns $true
$c.GetType() # You cannot call a method on a null-valued expression.
$d = $c.PSObject.Copy() # Works
$d.GetType() # PSCustomObject
我的问题:
$a
和$c
有什么区别?它们显然都等同于 $null
。$c.PSObject.Copy()
有效,而 $a.PSObject.Copy()
不起作用?$c.PSObject.Copy()
有效,而 $c.GetType()
不起作用?Where-Object
有关,还是和PSObject.Copy()
有关,还是别的什么?感谢您的宝贵时间。
Powershell 做了很多隐藏的工作。
在这种情况下,
Where-Object
返回的不是$null
,而是带有空(=$null)值的[System.Object.PSCustomObject]
。
但是 Powershell 喜欢它的自动解包,因此当它自动比较时,对用户透明将对象解包到它的值......这是
$null
。
但它仍然是一个物体!
您还可以在 VSCode 的调试中看到这种差异:
$a
的值为 $null
,但 $c
显示为具有子值,但为空。