PowerShell数组中移除尾逗号为何会消除空条目?
PowerShell数组尾逗号对元素计数与空条目的影响解析
问题现象
以下PowerShell代码中,当"E"条目后保留尾逗号时,数组计数为7且包含一个null条目;移除该尾逗号后,数组计数变为6且null条目消失。
原始代码(保留尾逗号)
$Entries = @( "A", $(if ($false) { "B" }), "C", "D", "E", "F", "G" ) $Entries.Count $Counter = 0 foreach ($entry in $Entries) { if ($entry -eq $null) { Write-Host "Entry ${Counter}: null" } else { Write-Host "Entry ${Counter}: $entry" } $Counter++ }
保留尾逗号的输出
7 Entry 0: A Entry 1: null Entry 2: C Entry 3: D Entry 4: E Entry 5: F Entry 6: G
移除尾逗号后的代码
$Entries = @( "A", $(if ($false) { "B" }), "C", "D", "E" "F", "G" ) $Entries.Count $Counter = 0 foreach ($entry in $Entries) { if ($entry -eq $null) { Write-Host "Entry ${Counter}: null" } else { Write-Host "Entry ${Counter}: $entry" } $Counter++ }
移除尾逗号后的输出
6 Entry 0: A Entry 1: C Entry 2: D Entry 3: E Entry 4: F Entry 5: G
原因解析
1. 保留尾逗号时的逻辑
PowerShell数组通过逗号分隔元素,@()会严格收集每一个逗号分隔的表达式结果:
$(if ($false) { "B" })因为条件不成立且没有else分支,PowerShell中无返回值的表达式默认返回$null,这个$null会被当作独立元素加入数组。- 所有元素都被逗号正确分隔,最终数组包含7个元素:
"A"、$null、"C"、"D"、"E"、"F"、"G",因此计数为7,且第二个元素是$null。
2. 移除尾逗号时的逻辑
当"E"后移除尾逗号,"E"与下一行的"F"之间没有逗号分隔,触发了PowerShell的表达式解析规则变化:
- 此时PowerShell不再将
$(if ($false) { "B" })返回的$null视为独立数组元素,而是将其与后续的"C"进行隐式合并——$null与字符串拼接时会被当作空字符串,最终合并结果为"C",相当于原本的两个元素($null和"C")被合并成了一个元素"C"。 - 同时,
"E"和"F"虽然没有逗号,但换行后的"F"前由于后续存在逗号("F",),PowerShell会将其解析为独立元素,最终数组包含6个元素:"A"、"C"、"D"、"E"、"F"、"G",计数为6且不再有$null条目。
内容的提问来源于stack exchange,提问作者jcjuarez
相关产品推荐
相关产品推荐

