为何ConvertFrom-Json搭配Select-Object无临时变量时出现异常?
解答
这是PowerShell中ConvertFrom-Json的管道行为差异导致的:
- 当把
ConvertFrom-Json的结果存入临时变量$cde时,$cde是一个数组对象。将$cde传入管道时,PowerShell会自动枚举数组的每个元素,Select-Object -First 1会捕获第一个元素,因此只输出单条数据。 - 而直接通过管道串联执行时,
ConvertFrom-Json会将整个JSON数组作为单个对象发送到管道中。Select-Object -First 1选中的是这个数组对象本身(这是管道内的第一个对象),当PowerShell输出这个数组对象时,会自动展开它的所有元素,所以最终显示了全部条目。
如果要在不使用临时变量的情况下得到预期结果,可以强制枚举ConvertFrom-Json的输出,比如添加ForEach-Object来触发元素枚举:
$json | ConvertFrom-Json | ForEach-Object { $_ } | Select-Object -First 1
另外,PowerShell 7及以上版本中,ConvertFrom-Json的默认行为已调整为自动枚举JSON数组的元素,直接串联管道也能得到预期结果。
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

