本周早些时候,我问这个question来找到浏览文本文件目录的最佳方法,该目录包含JSON格式的日志信息,并计算每个唯一消息的数量。
我能够提供所提供的答案。但是,我现在遇到的问题是,其中一个文件的格式被ConvertFrom-JSON不喜欢。它引发错误:
ConvertFrom-Json:传入的无效对象,应为“:”或“}”。
最初,我以为我可以使用'erroraction -silentlycontinue'跳过该文件并继续前进(只有一行没有任何意义)。但是,似乎known issue不能与ConvertFrom-JSON一起使用,替代方法是使用Try / Catch。
我将如何使用try / catch绕过一个错误的文件?还是有另一种方法可以完全跳过该文件而不必将其从目录中删除?
这就是我开始的目的。数量不多,但是对此的一些指导会很棒。我还在线上看到了一些信息,我将在ConvertFrom-JSON之前使用gc -Raw
或Out-string
,但这给了我相同的结果。
try {
gci -Path "path" | gc | ConvertFrom-Json | Group-Object message -NoElement
}
catch {
write-host "can't convert file to JSON"
}
finally {
}
答案 0 :(得分:4)
您必须将错误处理插入管道中。这是ForEach-Object
派上用场的地方:
Get-ChildItem -Path "path" |
ForEach-Object -Process {
try {
$_ | Get-Content | ConvertFrom-Json
} catch {
write-host "can't convert file '$_' to JSON"
}
} | Group-Object message -NoElement
成功的转换将通过。
此外,考虑使用Write-Warning
代替Write-Host
来解决错误情况。似乎最适合这种情况,并且可以由调用者重定向或选择退出。
如果您认为这种情况比警告更严重,请考虑使用Write-Verbose
,以便调用者可以选择加入。
答案 1 :(得分:2)
答案对我有用 ConvertFrom-Json cannot read my JSON
使用-Raw
cmdlet的Get-Content
参数,否则Get-Conten
t分别读取每一行,并将其作为数组存储在变量中。
$json = Get-Content c:\temp\net\cars.json -Raw
ConvertFrom-Json $json
尝试一下,您将得到一个很好用的对象:
$cars = Get-Content c:\temp\net\cars.json -Raw | ConvertFrom-Json | Select -ExpandProperty cars