【发布时间】:2019-04-08 14:15:49
【问题描述】:
如果我在 PowerShell 中运行它,我希望看到输出 0(零):
Set-StrictMode -Version Latest
$x = "[]" | ConvertFrom-Json | Where { $_.name -eq "Baz" }
Write-Host $x.Count
相反,我得到了这个错误:
The property 'name' cannot be found on this object. Verify that the property exists and can be set.
At line:1 char:44
+ $x = "[]" | ConvertFrom-Json | Where { $_.name -eq "Baz" }
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
如果我在"[]" | ConvertFrom-Json 周围加上大括号,它会变成这样:
$y = ("[]" | ConvertFrom-Json) | Where { $_.name -eq "Baz" }
Write-Host $y.Count
然后它“工作”。
在引入括号之前有什么问题?
解释“works”周围的引号 - 设置严格模式 Set-StrictMode -Version Latest 表示我在 $null 对象上调用 .Count。这可以通过包装@()来解决:
$z = @(("[]" | ConvertFrom-Json) | Where { $_.name -eq "Baz" })
Write-Host $z.Count
我觉得这很不满意,但这是对实际问题的补充。
【问题讨论】:
-
首先
=不是-eq!第二个变体“有效”,因为从未评估过Where(集合为空)。将"[]"替换为"[{}]"以获得更多信息。至于为什么这同样不适用于第一个变体(即为什么有一个管道,并且应用了Where)——这更有趣,并且可能与ConvertFrom-Json的微妙之处有关。 .. -
投票结束为错字。问题在于
=,仅此而已。 -
@TheIncorrigible1 错字已修复。还取消了设置严格模式,我省略了。问题依然存在。
-
如果您尝试访问不存在的属性,严格模式会导致引发异常。如果您想避免这种情况,您应该使用其他参数集之一,例如:
| ? Name -eq Baz -
为了消除对这个问题的潜在混淆:问题是为什么 JSON 输入在 PowerShell 中通过
ConvertFrom-Json变成 空数组 出人意料地仍然通过管道并执行Where-Object脚本块,而如果您直接使用空数组 (@() | Where ...),则不会执行此操作。
标签: arrays powershell enumeration powershell-core convertfrom-json