gpt4 book ai didi

powershell - 奇怪的合并行为

转载 作者:行者123 更新时间:2023-12-04 02:26:09 28 4
gpt4 key购买 nike

好吧,最近我正在寻找一种在 PowerShell 中进行空合并的方法,并且遇到了这篇文章:Null coalescing in powershell

我看到了@Zenexer 的评论,并且很感兴趣。语法如下:

Clear-Host
#expected one
"Test 1: " + ("one", "two", 1 -ne $null)[0]
#expected two
"Test 2: " + ($null, "two", 1 -ne $null)[0]

这非常有效。然而,我和一位同事(Walter Puckett)非常感兴趣,并进一步深入研究了语法,发现了一些真正的奇怪之处。

在我开始讨论这个奇怪的问题之前,有人可以指出任何解释此语法的文档吗?

## THE WEIRDNESS:

# it does not matter what the number is evidently
"Test 3: " + ($null, "two", 8675309 -ne $null)[0]

# reversing the comparison test breaks the coalesce
"Test 4: " + ($null, "two", $null -ne 1)[0]

# Moving the test into the middle of the array evidently cuts the array off
"Test 5: " + ($null, 1 -ne $null, "two").Length

# Moving the test into the middle of the array evidently cuts the array off,
# UNLESS you wrap the test with parens
"Test 6: " + ($null, (1 -ne $null), "two").Length

# The number used in the test is returned for the array value at that index
"Test 7: " + ($null, $null, 8675309 -ne $null)[0]

# The number used in the test is returned for the array value at that index,
# UNLESS you wrap the test with parens
"Test 8: " + ($null, $null, (8675309 -ne $null))[0]

# wrapping the test with parens will break the coalesce
"Test 9: " + ($null, "two", (1 -ne $null))[0]

# if all elements are null, the default value will be the value on the left
# side of the test
"Test 10: " + ($null, $null, 123456789 -ne $null)[0]

# test with an object
$conn = New-Object System.Data.SqlClient.SqlConnection
"Test 11: " + ($null, $conn, 1 -ne $null)[0].GetType()

经验教训:

  • 测试应该进入数组的最后一个元素
  • 测试不应用括号括起来,因为它会破坏合并
  • 默认值必须位于测试的左侧,或者硬编码为数组中倒数第二个项目
  • 我们使用数字和简单的对象测试进行了测试,因此它应该适用于任何类型的对象

最佳答案

这里有两个主要感兴趣的文档主题:


其缺点是,对于你的工作方法来说,空合并是这样的:

  • -ne $null 必须用作过滤器

  • 并且过滤器必须应用于整个数组

这样,索引 [0] 将返回输入数组中的第一个非 null 元素。

由于它可能并不明显,所以让我指出,如 about_Operator_Precedence 中所述。 :

$null, 2, 3 -ne $null # returns array without $nulls: 2, 3

解析为:

($null, 2, 3) -ne $null

it does not matter what the number is evidently

"Test 3: " + ($null, "two", 8675309 -ne $null)[0]

测试 3 按预期工作:-ne $null 过滤掉 $null 元素,因此索引 0 访问第一个非 null元素。


reversing the comparison test breaks the coalesce

"Test 4: " + ($null, "two", $null -ne 1)[0]

-ne 1 返回所有非 1 的元素,其中包括 $null 元素;因此,访问索引 0 会在此处返回 $null


Moving the test into the middle of the array evidently cuts the array off

"Test 5: " + ($null, 1 -ne $null, "two").Length

$null, 1 -ne $null, "two" 等同于:($null, 1) -ne ($null, "two")并产生 $null, 1,即未修改的 LHS。这是因为 -ne 与任何 LHS 元素都不匹配,因为 RHS 是一个数组,而这并不受支持。[1]


所有其他测试都只是上述测试的变体。


[1] 隐晦地发生的情况是,RHS 数组在比较之前被字符串化,因此只有与字符串化数组匹配的 LHS 元素才会被过滤;例如,'1 2', 3 -ne 1, 2 结果为 @(3),因为 "$(1, 2)"结果是一个值为 1 2 的字符串,它与第一个 LHS 元素匹配。

关于powershell - 奇怪的合并行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57511726/

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