使用powershell修改json文件

使用powershell修改json文件,json,powershell,Json,Powershell,我需要为用户修改Chrome的首选项文件 这是我们想要的结果: 这就是我目前所做的,但它失败了: get-childitem -path "$env:systemdrive\Users" | foreach-object { $path = "$env:systemdrive\Users\$_\appdata\local\google\chrome\user data\default\preferences" if(test-path $path){ $prefs = ge

我需要为用户修改Chrome的首选项文件

这是我们想要的结果:

这就是我目前所做的,但它失败了:

get-childitem -path "$env:systemdrive\Users" | foreach-object {

  $path = "$env:systemdrive\Users\$_\appdata\local\google\chrome\user data\default\preferences"

  if(test-path $path){
    $prefs = get-content $path | convertfrom-json 
    if($prefs){

      if(!($prefs.protocol_handler.excluded_schemes.alfaoffline.swe)){
        $prefs.protocol_handler.excluded_schemes.alfaoffline | add-member -name "swe" -value false -MemberType NoteProperty #-Force
      } else {
        if(!($prefs.protocol_handler.excluded_schemes.alfaoffline.swe -match "false")){
          write-host "Alfaoffline swe not set to false"
          $prefs.protocol_handler.excluded_schemes.alfaoffline.swe = $prefs.protocol_handler.excluded_schemes.alfaoffline.swe + ":false"
        } else {
          write-host "alfaoffline already set to false, ignoring."
        }
      }
      $prefs | convertto-json -depth 100 | out-file $path -encoding utf8
    }
  }
}
我收到的错误信息:

PS C:\WINDOWS\system32> C:\Temp\Chrome_Alfa.ps1
Add-Member : Cannot bind argument to parameter 'InputObject' because it is null.
At C:\Temp\Chrome_Alfa.ps1:11 char:64
+ ... faoffline | add-member -name "swe" -value false -MemberType NotePrope ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Add-Member], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.AddMemberCommand

您正在双重输入C:\Users路径。此外,还需要首先创建父级JSON对象。这可以通过使用PSCustomObject作为值来实现。 改变这一点

get-childitem -path "$env:systemdrive\Users" | foreach-object {

  $path = "$_\appdata\local\google\chrome\user data\default\preferences"

  if(test-path $path){
    $prefs = get-content $path | convertfrom-json
    if($prefs){

      if(!($prefs.protocol_handler.excluded_schemes.alfaoffline.swe)){
        $prefs.protocol_handler.excluded_schemes | add-member -membertype NoteProperty -name "alfaoffline" -value ([PSCustomObject]@{swe=$false})
      } else {
        if(!($prefs.protocol_handler.excluded_schemes.alfaoffline.swe -match "false")){
          write-host "Alfaoffline swe not set to false"
          $prefs.protocol_handler.excluded_schemes.alfaoffline.swe = $prefs.protocol_handler.excluded_schemes.alfaoffline.swe + ":false"
        } else {
          write-host "alfaoffline already set to false, ignoring."
        }
      }
      $prefs | convertto-json -depth 100 | out-file $path -encoding utf8
    }
  }
}

您正在双重输入C:\Users路径。此外,还需要首先创建父级JSON对象。这可以通过使用PSCustomObject作为值来实现。 改变这一点

get-childitem -path "$env:systemdrive\Users" | foreach-object {

  $path = "$_\appdata\local\google\chrome\user data\default\preferences"

  if(test-path $path){
    $prefs = get-content $path | convertfrom-json
    if($prefs){

      if(!($prefs.protocol_handler.excluded_schemes.alfaoffline.swe)){
        $prefs.protocol_handler.excluded_schemes | add-member -membertype NoteProperty -name "alfaoffline" -value ([PSCustomObject]@{swe=$false})
      } else {
        if(!($prefs.protocol_handler.excluded_schemes.alfaoffline.swe -match "false")){
          write-host "Alfaoffline swe not set to false"
          $prefs.protocol_handler.excluded_schemes.alfaoffline.swe = $prefs.protocol_handler.excluded_schemes.alfaoffline.swe + ":false"
        } else {
          write-host "alfaoffline already set to false, ignoring."
        }
      }
      $prefs | convertto-json -depth 100 | out-file $path -encoding utf8
    }
  }
}

我认为你原来的路径地址是正确的。但看起来您需要迭代该层次结构并验证该层次结构的每个“.”步骤:

$prefs.protocol_handler.excluded_schemes.alfaoffline.swe
检查是否存在,如果不存在则创建,然后继续。我查看了一下,如果您试图创建一个成员,是否有某种内置的Force命令可以创建整个层次结构,但我没有看到

一旦正确设置了上下文,这对于您想要完成的实际添加是一个很好的解决方案:


请随意评论或更正我的假设,我很乐意进一步提供帮助。

我认为您原来的路径地址是正确的。但看起来您需要迭代该层次结构并验证该层次结构的每个“.”步骤:

$prefs.protocol_handler.excluded_schemes.alfaoffline.swe
检查是否存在,如果不存在则创建,然后继续。我查看了一下,如果您试图创建一个成员,是否有某种内置的Force命令可以创建整个层次结构,但我没有看到

一旦正确设置了上下文,这对于您想要完成的实际添加是一个很好的解决方案:


请随意评论或更正我的假设,我很乐意提供进一步帮助。

错误消息告诉您,
$prefs.protocol\u handler.excluded\u schemes.alfaoffline
的计算结果为
$null
,您不能将成员添加到
$null
。错误消息告诉您
$prefs.protocol\u handler.excluded\u schemes.alfaoffline
的计算结果为
$null
,您不能将成员添加到
$null
。是的,这就是我面临的问题。我只有protocol_处理程序,但如果没有,我需要创建excluded_schemes.alfaoffline.swe。我不知道怎么做。是的,这是我面临的问题。我只有protocol_处理程序,但如果没有,我需要创建excluded_schemes.alfaoffline.swe。我不知道该怎么做。如果文件没有“excluded_schemes.alfaoffline.swe”我该如何迭代该层次结构并验证每个步骤。如果文件没有“excluded_schemes.alfaoffline.swe”我该如何迭代该层次结构并验证该层次结构的每个步骤