$null 和Where-Object 的空输出有什么区别?

问题描述 投票:0回答:1

考虑以下因素:

$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 null
1个回答
0
投票

Powershell 做了很多隐藏的工作。

在这种情况下,

Where-Object
返回的不是
$null
,而是带有空(=$null)值的
[System.Object.PSCustomObject]

但是 Powershell 喜欢它的自动解包,因此当它自动比较时,对用户透明将对象解包到它的值......这是

$null

但它仍然是一个物体!

您还可以在 VSCode 的调试中看到这种差异:

$a
的值为
$null
,但
$c
显示为具有子值,但为空。

© www.soinside.com 2019 - 2024. All rights reserved.