【问题标题】:Edit JSON data in PowerShell 2.0在 PowerShell 2.0 中编辑 JSON 数据
【发布时间】:2019-02-11 18:07:14
【问题描述】:

我有一个脚本,它应该在 json 首选项数据中写入以更改不同扩展的自动打开。

我从here 得到的第一部分,但是这个脚本使用了ConvertFrom-JsonConvertTo-Json,这仅在Powershell >= 3.0 中受支持。

然后我找到了一个模仿这个Cmdlethere的函数。现在我的问题是它根本不起作用,我不知道为什么,因为我没有收到任何错误或其他东西。

$neededFileExt = "2er"
$path = $env:LOCALAPPDATA + "\Google\Chrome\User Data\Default\Preferences"
$prefContent = Get-Content $path -Encoding utf8

我认为接下来的两个功能是它不能正常工作的原因。

function ConvertTo-Json([object] $prefcontent) {
    add-type -assembly system.web.extensions
    $prefs = new-object system.web.script.serialization.javascriptSerializer
    return $prefs.Serialize($prefcontent)
}

function ConvertFrom-Json([object] $prefcontent) { 
    add-type -assembly system.web.extensions
    $prefs = new-object system.web.script.serialization.javascriptSerializer
    return , $prefs.DeserializeObject($prefcontent)
}

$prefs = ConvertFrom-Json $prefContent
if (($prefs | gm).name -contains "download") {
    if (($prefs.download | gm).name -contains "extensions_to_open") {
        if ($prefs.download.extensions_to_open) { #if it has value, grab the contents
            [string[]]$existingFileExt = 
            $prefs.download.extensions_to_open.tostring().split(":")
        }
        else {
            [string[]]$existingFileExt = $null
        }
    }
    else {
        #if extensions_to_open doesn't exist, create it
        $prefs.download | Add-Member -MemberType NoteProperty -Name extensions_to_open -Value ""
        [string[]]$existingFileExt = $null
    }
    foreach ($ext in $neededFileExt) {
        if ($existingFileExt -notcontains $ext) { #only add the necessary extension if it isn't already there
            [string[]]$existingFileExt += $ext
        }
    }
    $prefs.download.extensions_to_open = $existingFileExt -join ":" 
    ConvertTo-Json $prefs -Compress -depth 100 | Out-File $path -Encoding utf8 
}

不胜感激任何建议或帮助。

  • 我的问题不是 this post 的重复,因为我使用了这篇文章中的函数,但我的代码不相关

【问题讨论】:

  • 欢迎来到 StackOverflow!很高兴您添加了代码。但是,由于它被格式化,它被破坏了,因为您在注释行中添加了换行符。我修复它并重新格式化它。希望它现在更具可读性。
  • 请更具体地说明“根本不工作”。什么不起作用?您是否尝试过执行部分脚本来缩小问题范围?我尝试了你的大部分代码,它似乎工作正常,但我有 PS 5。找出你的代码的哪一部分没有给出预期的结果。
  • 首先,在 powershell 3.0 中工作,但后来我需要将 convertfrom-json 和 convertto-json 交换为一个函数,所以我很确定其他代码行正常工作。不工作我的意思是没有任何文件类型添加到 json 文件中而没有给出任何响应。
  • @marsze,您没有安装 PowerShell 2 应该不是问题。您可以通过使用命令 PowerShell -Version 2 打开 PowerShell 版本 2 提示符来模拟问题

标签: json powershell powershell-2.0


【解决方案1】:

PowerShell 版本 2 不允许像您一样直接从对象列表中扩展属性:

($prefs | gm).name -contains "download"

对于 PowerShell 版本 2,您应该使用 Select-Object -ExpandProperty cmdlet/参数:

($prefs | gm | Select -ExpandProperty Name) -contains "download"

【讨论】:

  • 很多人都知道我不在办公室,如果可行的话我明天写
  • 用你说的 Ps2.0 不支持的代码重新编辑两行后,它没有像以前一样返回错误,但它仍然没有写入它自己的 json 文件。跨度>
  • 这应该是故障排除和缩小问题范围的问题。我建议使用相同的系统来测试 PSv5 和 PSv2(通过使用命令 PowerShell -Version 2(以排除 Preferences 文件根本没有包含 Name 属性的 download)。然后问自己以下问题: $prefs 是否包含任何数据?它是否通过了第一个 if 语句(例如通过添加 Write-Host 'ok')?Write-Host $prefs.download 是否返回任何内容?等等。
猜你喜欢
  • 2021-04-28
  • 2022-10-14
  • 2020-08-07
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2013-05-09
  • 2019-11-10
相关资源
最近更新 更多