使用powershell

时间:2017-04-26 15:10:39

标签: json windows powershell user-data

我有一个需要在用户数据中编辑的.json文件,因此我必须使用powershell来完成此操作。 json看起来像这样:

{
"EngineConfiguration": {
    "PollInterval": "00:00:15",
    "Components": [
        {
            "Id": "CustomLogs",
            "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
            "Parameters": {
                "LogDirectoryPath": "C:\\CustomLogs\\",
                "TimestampFormat": "MM/dd/yyyy HH:mm:ss",
                "Encoding": "UTF-8",
                "Filter": "",
                "CultureName": "en-US",
                "TimeZoneKind": "Local"
            }
        }
    ],
    "Flows": {
        "Flows": 
        [
            "(ApplicationEventLog,SystemEventLog),CloudWatchLogs"
            ]
        }
    } 
}

我希望它看起来像这样 -

{
"EngineConfiguration": {
    "PollInterval": "00:00:15",
    "Components": [
        {
            "Id": "CustomLogs",
            "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
            "Parameters": {
                "LogDirectoryPath": "C:\\ProgramData\\Amazon\\CodeDeploy\\deployment-logs",
                "TimestampFormat": "[yyyy-MM-dd HH:mm:ss.fff]",
                "Encoding": "UTF-8",
                "Filter": "",
                "CultureName": "en-US",
                "TimeZoneKind": "Local"
            }
        }
    ],
    "Flows": {
        "Flows": 
        [
            "(ApplicationEventLog,SystemEventLog, CustomLogs),CloudWatchLogs"
            ]
        }
    } 
}

在自定义日志参数中,LogDirectoryPath和TimestampFormat都已更改。另外,在Flows部分,我添加了' CustomLogs'到CloudWatch Group。

我尝试使用这样的代码:

$a = Get-Content 'C:\PATH\TO\file.json' -raw | ConvertFrom-Json
$a.EngineConfiguration.Components[0].Parameters = '{"LogDirectoryPath": "","TimestampFormat": "[yyyy-MM-dd HH:mm:ss.fff]","Encoding": "UTF-8","Filter": "","CultureName": "en-US","TimeZoneKind": "Local"}'
$a | ConvertTo-Json | set-content 'C:\PATH\TO\output.json'

但这会产生非常难看的输出

{
"EngineConfiguration":  {
                            "PollInterval":  "00:00:15",
                            "Components":  [
                                               "@{Id=CustomLogs; FullName=AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch; Parameters={\"LogDirectoryPath\": \"\",\"TimestampFormat\": \"[yyyy-MM-dd HH:mm:ss.fff]\",\"Encoding\": \"UTF-8\",\"Filter\": \"\",\"CultureName\": \"en-US\",\"TimeZoneKind\": \"Local\"}}",
                                               "@{Id=CloudWatchLogs; FullName=AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch; Parameters=}"
                                           ],
                            "Flows":  {
                                          "Flows":  "(ApplicationEventLog,SystemEventLog),CloudWatchLogs"
                                      }
                        }
}

有更优雅的方法吗?任何建议将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

尝试使用-Depth切换ConvertTo-Json。默认情况下,这会将超出深度2的所有子元素压缩到您看到的对象的字符串表示形式:

"@{Id=CustomLogs; etc."

通过指定更深的深度,您可以获得更像您想要的格式。将其与压缩过多空格的东西结合起来:

((ConvertFrom-Json $a) | ConvertTo-Json -Depth 4) -replace ((" "*4)," ")

答案 1 :(得分:0)

可以使用正则表达式减少前导空格。但是,这并不能真正产生你想要的重新格式化,漂亮的印刷品。

$a | ConvertTo-Json | % {$_ -replace "        ","  "} | set-content 'output.json'
相关问题