这是我的第一次,所以让我知道我的问题安排是否有误。
我有很多JSON文件,其文件名遵循命名约定,即file1.json,file2.json等。每个文件都可能具有多个类似于以下内容的对象:
[
{
"Forename": "Jim",
"Surname": "Cook",
"Gender": "M",
"DOB": "12-03-1994"
},
{
"Forename": "Sarah",
"Surname": "Parker",
"Gender": "F",
"DOB": "01-02-1983"
},
{
"Forename": "Alan",
"Surname": "Flemming",
"Gender": "M",
"DOB": "27-10-1989"
}
]
在Powershell中,我想将这些JSON对象转换为Powershell对象,然后为属性选择具有相同值的对象,例如名字为“ Jim”的人。
到目前为止,我已经实现了这一点:
@(Get-ChildItem "file*.json" | %{Get-Content $_.FullName | Out-String | ConvertFrom-Json}) | Where-Object {$_.Forename -eq "Jim"}
当只有一个文件可使用时,此方法有效:
Forename Surname Gender DOB
-------- ------- ------ ---
Jim Cook M 12-03-1994
但是,当与多个文件一起使用时,它将失败并输出所有对象,就像忽略了Where-Object一样。结果可能如下所示:
Forename Surname Gender DOB
-------- ------- ------ ---
Jim Cook M 12-03-1994
Sarah Parker F 01-02-1983
Alan Flemming M 27-10-1989
Bill Preston M 04-07-1975
Helen Smith F 03-12-2001
有人可以建议我在这里做错什么,以及如何解决它才能获得正确的结果?谢谢
问题在于,在PowerShell最高版本为v6.x的情况下,将ConvertFrom-Json
(转换后的)JSON数组作为单个对象而不是逐个元素输出,这在PowerShell中是典型的。
由于成员枚举,如果(至少)其元素之一具有带值的属性,这将导致整个数组得到输出。Where-Object
.ForeName
Jim
的解决方法是将力枚举,其中在最简单的情况下,通过卷绕该命令的实现ConvertFrom-Json
呼叫在(...)
:
Get-ChildItem file*.json | ForEach-Object {
(Get-Content -Raw $_.FullName | ConvertFrom-Json)
} | Where-Object { $_.Forename -eq "Jim" }
请注意,我已经Get-Content $_.FullName | Out-String
用Get-Content -Raw $_.FullName
(PSv3 +)代替了,它更简洁,更有效地以单个,多行字符串的形式检索文件的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句