【问题标题】:Change content of some JSON file using powershell pipeline使用 powershell 管道更改某些 JSON 文件的内容
【发布时间】:2019-12-10 05:07:10
【问题描述】:

我想从 bat 文件中更改 JSON 文件的内容。我想通过调用 powershell 并使用单行管道命令来做到这一点。

到目前为止,我在这里:

Get-Content test.json -raw | ConvertFrom-Json | Set-ItemProperty -Name "ServiceAccess.Host" -Value "localhost:5000" |  ConvertTo-Json | Set-Content test.json

这是我的 JSON 文件:

{
    "ServiceAccess":  
    {
        "Host":  "localhost:3000"
    }
}

它不起作用:

Set-ItemProperty : 输入对象不能绑定到命令的任何参数,因为命令确实 不接受管道输入或输入及其属性与接受管道输入的任何参数都不匹配。 在行:1 字符:49 + ... 来自-Json | Set-ItemProperty -Name "ServiceAccess.Host" -Value "local ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ + CategoryInfo : InvalidArgument: (@{ServiceAccess=}:PSObject) [Set-ItemProperty], ParameterBindingExcept 离子 + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.SetItemPropertyCommand

在 powershell 管道中更改 JSON 对象的正确方法是什么?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    如果您必须在单个管道中完成所有操作(为了便于阅读而分散在多行中):

    Get-Content test.json -Raw | ConvertFrom-Json |
      ForEach-Object { $_.ServiceAccess.Host = 'localhost:5000'; $_ } |
        ConvertTo-Json | Set-Content test.json
    

    请注意,使用-Raw 一次读取整个输入文件可以在同一管道中写回同一文件(如果没有-Raw,您必须将Get-Content 调用包含在@ 中987654326@ 强制一次读取所有行)。

    ForEach-Object块中,输入对象首先被修改($_.ServiceAccess.Host = 'localhost:5000'),然后(;)通过($_)到ConvertTo-Json重新转换为JSON,Set-Content然后写回输入文件。


    至于你尝试了什么

    *-Item* cmdlet(例如 Set-ItemProperty)不是为一般的内存对象操作而设计的。

    相反,itemPowerShell provider 公开的特定类型的对象,例如文件系统提供程序中的文件或文件夹,或注册表提供程序。

    【讨论】:

      【解决方案2】:

      试试这个:

      $json = get-content test.json | ConvertFrom-Json           
      $json | % { $_.ServiceAccess.Host = "localhost:5000" }     
      $json | ConvertTo-Json | out-file test1.json               
      

      【讨论】:

        【解决方案3】:
        $Json = Get-Content test.json -Raw | ConvertFrom-Json
        $Json.ServiceAccess.Host = 'localhost:5000'
        $Json | ConvertTo-Json | Set-Content test.json
        

        如果您使用它一段时间,您可能会在一行代码中完成此操作,但是当 Get-ContentSet-Content 在同一管道中对同一文件进行操作时,您可能会遇到文件锁定问题。

        请注意,PowerShell 的 JSON 支持有点古怪。这部分是由于它使用 JSON 的 .Net 方言,这并不总是与其他系统使用的 JSON 相同。其次,JSON 支持是一个相对较新的添加,因此 Windows PowerShell(v5.1 及更低版本)比 PowerShell Core(v6+)更加古怪。例如,如果最外层的 JSON 元素是一个未命名的数组,PowerShell 将倾向于去掉方括号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-08
          • 2021-07-04
          相关资源
          最近更新 更多