在PowerShell中解析输出

oaxa6hgo  于 2022-11-29  发布在  Shell
关注(0)|答案(1)|浏览(204)

我有以下PowerShell脚本输出:

{
  "parameter": "p1",
  "device": "d1",
  "assignee": "me"
}

{
  "Name": "N",
  "device": "d4"
  }

{
  "alart": "C1"
  }

我只想拿到第一套:

{
  "parameter": "p1",
  "device": "d1",
  "assignee": "me"
}

我尝试了ConvertTo-Json,但它没有按预期工作。
注意:每一组的长度每次都可以不同,所以我不能硬编码选择的行数。

$output[0..3]

以上代码在我的情况下不起作用

h9vpoimq

h9vpoimq1#

一个简单的方法是使用switch语句收集脚本的输出行(您声明脚本 * 逐行 * 发出其输出),直到遇到第一个 * 空 * 行。

$firstParagraph = 
  switch (.\yourScript.ps1) {
    ''      { break } # first empty line found; stop processing
    default { $_ }    # non-empty line: pass it through.
  }

如果还需要检测 * 空白 *,即 * 全空白 * 行:

$firstParagraph = 
  switch -Regex (.\yourScript.ps1) {
    '\S'    { $_ }    # non-blank line: pass it through
    default { break } # first blank line: stop processing
  }

如果JSON对象 * 和 * 之间没有空行,则可以使用} * 在其自己的行 * 上关闭第一个对象:

$firstParagraph = 
  switch -Regex (.\yourScript.ps1) {
    '^\s*}\s*$'   { $_; break } # closing line of the first object: emit and stop processing
    '\S'          { $_ }        # other non-blank line: pass it through
    default       { break }     # first blank line: stop processing
  }

最后,可以反复尝试将收集到的行解析为JSON,并在解析成功后停止处理;请注意,此解决方案返回一个 object,表示第一个JSON对象,与ConvertFrom-Json返回的一样:

$linesSoFar = ''
$firstObject = 
  switch -Regex (.\yourScript.ps1) {
    '}' { # potentially the end of a complete JSON object
      $linesSoFar += "`n" + $_
      # Try to convert from JSON and output the resulting object,
      # if successful.
      ConvertFrom-Json -ErrorAction Ignore $linesSoFar
      if ($?) { break } # Conversion succeeded, stop processing.
    }
    default { $linesSoFar += "`n" + $_ }   # first blank line: stop processing
  }

相关问题