如何从JSON文件中获取数字?

时间:2018-08-22 10:38:25

标签: powershell powershell-v2.0 powershell-v3.0

仅在将严重性设置为2时,我试图从JSON文件中提取内容以查找作业的错误描述,但遇到以下错误消息:

Error formatting a string: Input string was not in a correct format..
At line:3 char:10
+ $Sev = $("{$i`:N1}" -f $data.value.Severity)
+          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: ({:N1}:String) [], RuntimeException
    + FullyQualifiedErrorId : FormatError

我要运行的代码:

$data = Get-Content -Path 'C:\Users\S\Downloads\Logs.json' | ConvertFrom-Json 
$Sev = $("{$i`:N1}" -f $data.value.Severity)
if ($Sev -eq "2") {
    $error = $("{$i`:N1}" -f $data.value.Description)
}

Write-Host $error

JSON文件内容:

{
    "Id":13253665,
    "SequencerId":95521,
    "Description":"Sequence failed",
    "Severity":2,
    "SequenceStepId":null,
    "SequenceStep":null
}
{
    "Id":13253662,
    "SequencerId":95521,
    "Description":"Missing file variable.htm.",
    "Severity":4,
    "SequenceStepId":null,
    "SequenceStep":null
}

1 个答案:

答案 0 :(得分:1)

我认为您误解了format operator的工作方式。它期望将格式字符串作为第一个操作数,并将数组(或单个值)作为第二个操作数。

$format_string -f $val1, $val2, $val3
$format_string -f $array
$format_string -f $single_value

格式字符串中的占位符{0}引用第二个操作数(数组)的第一个元素,{1}引用第二个操作数,依此类推。如果您指定格式说明以及占位符(例如{0:N5},用于格式化具有给定位数的数字),则还需要确保该值的类型正确。如果要将数字格式与字符串值结合使用,则需要先将该值转换为数字。

PS C:\> $s = '3'
PS C:\> '{0:N5}' -f $s
3
PS C:\> '{0:N5}' -f [int]$s
3.00000

尽管从技术上讲,您可以使用格式字符串占位符形式的变量

PS C:\> $i = 1
PS C:\> $a = 1, 3, 6
PS C:\> "{${i}:N5}" -f $a
3.00000

我会考虑实际上做那种不好的样式,因为它会不必要地混淆代码。这样做比较好:

PS C:\> $i = 1
PS C:\> $a = 1, 3, 6
PS C:\> '{0:N5}' -f $a[$i]
3.00000

话虽如此,您可能一开始就不需要任何这些。一方面,格式字符串中的N1将数字2格式化为字符串"2.0"。将其与字符串"2"进行比较将永远不会找到匹配项。由于来自JSON输入的$data.value似乎是一个数组,并且Severity值已经是整数,因此您可以执行以下操作:

if ($data.value[$i].Severity -eq 2) {
    Write-Host $data.value[$i].Description
}