本周早些时候,我问了这个question找到浏览包含 JSON 格式日志信息的文本文件目录并计算每条唯一消息的数量的最佳方法。
我能够根据提供的答案做到这一点。但是,我现在遇到的问题是其中一个文件的格式是 ConvertFrom-JSON 不喜欢的。它抛出错误:
ConvertFrom-Json : Invalid object passed in, ':' or '}' expected.
最初,我认为我可以使用“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 {
}
最佳答案
您必须将错误处理插入管道中。这就是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
,以便调用者可以选择加入。
关于json - ConvertFrom-Json : Invalid object passed in, ':' 或 '}' 预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699127/