gpt4 book ai didi

powershell - 为什么空的 PowerShell 管道与 null 不同?

转载 作者:行者123 更新时间:2023-12-04 10:25:14 25 4
gpt4 key购买 nike

我试图理解 @() 数组构造函数的行为,我遇到了这个非常奇怪的测试。

似乎空管道的值与 $null“不完全”相同,即使它是 -eq $null

每个语句的输出显示在### 之后

$y = 1,2,3,4 | ? { $_ -ge 5 }
$z = $null

if ($y -eq $null) {'y is null'} else {'y NOT null'} ### y is null
if ($z -eq $null) {'z is null'} else {'z NOT null'} ### z is null

$ay = @($y)
$az = @($z)

"ay.length = " + $ay.length ### ay.length = 0
"az.length = " + $az.length ### az.length = 1

$az[0].GetType() ### throws exception because $az[0] is null

所以 $az 数组的长度为 1,而 $az[0] 为 $null。

但真正的问题是:怎么可能 $y 和 $z 都是 -eq $null,然而当我用 @(...) 构造数组时,一个数组是空的,另一个包含一个 $空元素?

最佳答案

扩展 Frode F. 的答案,“无”在 PowerShell 中是一个最神奇的值 - 它被称为 [System.Management.Automation.Internal.AutomationNull]::Value。以下将类似地工作:

$y = 1,2,3,4 | ? { $_ -ge 5 }
$y = [System.Management.Automation.Internal.AutomationNull]::Value

PowerShell 在大多数地方将值 AutomationNull.Value 视为 $null ,但并非处处如此。一个值得注意的例子是在管道中:
$null | % { 'saw $null' }
[System.Management.Automation.Internal.AutomationNull]::Value | % { 'saw AutomationNull.Value' }

这只会打印:
saw $null

请注意,即使您没有管道字符,表达式本身也是管道,因此以下内容大致等效:
@($y)
@($y | Write-Output)

理解这一点,应该很清楚,如果 $y 持有值 AutomationNull.Value,则不会向管道写入任何内容,因此数组为空。

有人可能会问为什么 $null 被写入管道。这是一个合理的问题。在某些情况下,脚本/cmdlet 需要在不使用异常的情况下指示“失败”——因此“无结果”必须有所不同,$null 是用于此类情况的明显值。

我从来没有遇到过需要知道你是否有“无值(value)”或 $null 的情况,但如果你有,你可以使用这样的东西:
function Test-IsAutomationNull
{
param(
[Parameter(ValueFromPipeline)]
$InputObject)

begin
{
if ($PSBoundParameters.ContainsKey('InputObject'))
{
throw "Test-IsAutomationNull only works with piped input"
}
$isAutomationNull = $true
}
process
{
$isAutomationNull = $false
}
end
{
return $isAutomationNull
}
}

dir nosuchfile* | Test-IsAutomationNull
$null | Test-IsAutomationNull

关于powershell - 为什么空的 PowerShell 管道与 null 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22343187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com