仅在将严重性设置为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
}
答案 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
}