我正在尝试使用Powershell 6中的Test-Json Cmdlet验证文件夹中的所有json文件:
[array]$myFiles=Get-ChildItem *.json -Recurse| select -expand fullname
foreach ($filePath in $myFiles)
{
try {
$isValid = Get-Content $filePath -Raw | Test-Json
$working = $true
} catch {
$working = $false
}
if ($working) {
Write-Host "Is working for $filePath"
}
else {
Write-Host "Not working for $filePath"
}
}
如果 json 文件不正确,cmdlet Test-json 将显示引用 .ps1 文件而不是 .json 文件的错误,因此使用"正在工作"或"不工作"以及$filePath。
但是,无论 json 文件是否正确,它都会为所有 json 文件显示"正在工作"。 因此,我需要"正在为"/"不工作"才能正常工作,或者如果我可以让 Test-json 显示错误的 json 文件而不是 .ps1 文件,我会更好。
请帮忙吗?
问题在于使用Test-Json
。
根据您的代码片段,您假设如果 JSON 格式不正确,它会抛出错误,但事实并非如此。Test-Json
生成的错误打印在控制台上,但不会引发异常。
在您的情况下Test-Json
cmdlet 将只返回True
或False
值和错误消息将打印在控制台上。
以下是代码的更正版本:
[array]$myFiles=Get-ChildItem *.json -Recurse| select -expand fullname
foreach ($filePath in $myFiles)
{
$isValid = Get-Content $filePath -Raw | Test-Json -ErrorAction SilentlyContinue
if ($isValid)
{
Write-Host "Is working for $filePath"
}
else
{
Write-Host "Not working for $filePath"
}
}
访问此处了解有关Test-Json
的更多信息,此处-ErrorAction
,$ErrorActionPreference
和-ErrorVariable
以及此处的操作首选项枚举。