Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell转换为Json的格式不正确_Json_Powershell_Ansible - Fatal编程技术网

Powershell转换为Json的格式不正确

Powershell转换为Json的格式不正确,json,powershell,ansible,Json,Powershell,Ansible,我正在使用win_shell将powershell输出转换为json格式,以便稍后对其进行过滤。问题是我的Json格式不好 这是密码 - win_shell: | Get-ChildItem -Path <some_path> | Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending | Select-Object -First 20

我正在使用win_shell将powershell输出转换为json格式,以便稍后对其进行过滤。问题是我的Json格式不好

这是密码

    - win_shell: |
         Get-ChildItem -Path <some_path> |
         Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
         Select-Object -First 20 | ConvertTo-Json
         register: register_results

     - debug:
         var: register_results
当我尝试过滤例如“parent”或“Name”时,这些额外的空格会导致错误。看起来除了“ConvertToJson”之外还必须有其他参数才能获得更清晰的输出

还有其他方法吗?

根据,计划在PowerShell 6中改进
转换为JSON
的JSON格式。您可以在
转换为Json
后自行覆盖格式设置,如帖子所示。文章中提到的一些代码可能会解决您的问题:

# Formats JSON in a nicer format than the built-in ConvertTo-Json does.
function Format-Json([Parameter(Mandatory, ValueFromPipeline)][String] $json) {
  $indent = 0;
  ($json -Split '\n' |
    % {
      if ($_ -match '[\}\]]') {
        # This line contains  ] or }, decrement the indentation level
        $indent--
      }
      $line = (' ' * $indent * 2) + $_.TrimStart().Replace(':  ', ': ')
      if ($_ -match '[\{\[]') {
        # This line contains [ or {, increment the indentation level
        $indent++
      }
      $line
  }) -Join "`n"
}

$obj = @{}
$json = $obj | ConvertTo-Json | Format-Json
或者,您应该能够使用
converttojsonnewtonsoft
,或者通过安装和导入模块直接使用它,而不是
converttojson

Install-Module Newtonsoft.Json
Import-Module Newtonsoft.Json

$obj = @{}
$json = $obj | ConvertTo-JsonNewtonsoft

# or Newtonsoft.Json directly (same code)

$obj = @{}
$json = [Newtonsoft.Json.JsonConvert]::SerializeObject($obj, [Newtonsoft.Json.Formatting]::Indented)

将其输出到一个文件应该会使正确读回更容易,而不是试图为主机输出进行复制。这实际上取决于您稍后尝试使用哪种语言进行过滤

Get-ChildItem -Path <some_path> |
         Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
         Select-Object -First 20 | ConvertTo-Json | Out-File C:\Some\Where\Awesome\OutputJson.json
  • 转换为Json
    输出的不是糟糕的Json,而是打印精美的Json:

    • 打印精美的JSON使用多行输出和基于空格的缩进,以提高可读性

    • 然而,漂亮打印的JSON仍然是有效的JSON,任何JSON解析器都应该识别它

  • 您可以使用
    -Compress
    开关选择退出此漂亮的打印,以获得更高效但可读性较差的表示:

    • 您将得到一个单行输出字符串(即使对于多个输入),没有多余的空白
您显示的输出显示嵌入另一个JSON字符串中的漂亮打印JSON字符串作为字符串属性值(因此将嵌入的
转义为
\”

因此,为了处理此类嵌入式JSON,您必须:

  • 解析包含JSON的
  • 获取包含嵌入JSON的属性的值(
    .stdout\u行
  • 然后解析它
如果生成包含JSON的内容将多行
ConvertTo JSON
输出字符串分解为一个行数组(正如属性名
stdout_lines
所建议的那样),那么在将数组元素作为JSON处理之前,您必须首先将其连接回单个字符串


如果您想避免这一步,请使用
ConvertTo Json-Compress

这篇文章似乎也与此相关。如果您只是寻找单行,没有额外的空白输出,请使用
ConvertTo Json-Compress
。可能重复+1,指出它在v6及更高版本中得到了改进。我切换到Powershell Core,它非常完美!
Get-ChildItem -Path <some_path> |
         Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
         Select-Object -First 20 | ConvertTo-Json | Out-File C:\Some\Where\Awesome\OutputJson.json
Get-ChildItem -Path "C:\Scripts" |
         Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
         Select-Object -First 20 | Export-Clixml C:\Some\Where\Awesome\Exported.xml