You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PowerShell中不使用ConvertFrom-Json添加JSON键值对的方法

问题:合并多个独立JSON对象为单个有效JSON对象(无需使用ConvertFrom-Json)

现有PowerShell脚本生成的JSON文件包含多个独立顶级对象,无法正常解析,需要合并为单个统一对象。尝试用ConvertFrom-Json转换时出现以下错误:

ConvertFrom-Json : Cannot bind argument to parameter 'InputObject' because it is null.
At line:24 char:25
+   $hostJSON = $hostJSON | ConvertFrom-Json

原脚本生成的JSON示例:

{
  "HostName": "MMuns-L2314"
}
{
  "SerialNumber": "BNW35Y3"
}
{
  "LatestUptime": "2025-06-10T11:54:17.5000000-04:00"
}

目标JSON格式:

{
  "HostName" : "MMuns-L2314",
  "SerialNumber" : "BNW35Y3",
  "LatestUptime" : "2025-06-10T11:54:17.5000000-04:00"
}

当前使用的脚本:

Function Get-Hostname { 
  $hostname = hostname
  $hostObj = @{
    HostName = $hostname
  }
  $hostJSON = $hostObj | ConvertTo-Json
  $hostJSON | Out-File -FilePath "$HOME/Downloads/serverscript.json"
}

Function Get-SerialNumber { 
  $SerialNumber = (Get-CimInstance Win32_BIOS).SerialNumber
  $serialObj = @{
    SerialNumber = $SerialNumber
  }
  $serialJSON = $serialObj | ConvertTo-Json
  Add-Content -Path "$HOME\Downloads\serverscript.json" -Value $serialJSON
}

Function Get-Upt { 
  $upt = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime.ToString('o')
  $uptObj = @{
    LatestUptime = $upt
  }
  $uptJSON = $uptObj | ConvertTo-Json
  Add-Content -Path "$HOME\Downloads\serverscript.json" -Value $uptJSON
}

解决方案

方案1:直接构建完整对象(最简洁)

根本不需要生成多个JSON片段再合并,直接把所有属性收集到一个哈希表,一次性转换为合法JSON:

# 收集所有系统信息到统一哈希表
$systemInfo = @{
    HostName = hostname
    SerialNumber = (Get-CimInstance Win32_BIOS).SerialNumber
    LatestUptime = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime.ToString('o')
}

# 转换为JSON并写入文件(覆盖原有内容)
$systemInfo | ConvertTo-Json | Out-File -FilePath "$HOME/Downloads/serverscript.json"

方案2:保留原有函数结构,维护统一对象

如果必须保留分函数的写法,让每个函数向同一个对象添加属性,而不是各自生成JSON:

# 初始化空哈希表用于存储所有信息
$systemInfo = @{}

Function Get-Hostname { 
    param([ref]$targetObj)
    # 向目标对象添加HostName属性
    $targetObj.Value['HostName'] = hostname
}

Function Get-SerialNumber { 
    param([ref]$targetObj)
    $targetObj.Value['SerialNumber'] = (Get-CimInstance Win32_BIOS).SerialNumber
}

Function Get-Upt { 
    param([ref]$targetObj)
    $targetObj.Value['LatestUptime'] = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime.ToString('o')
}

# 调用所有函数填充对象
Get-Hostname -targetObj ([ref]$systemInfo)
Get-SerialNumber -targetObj ([ref]$systemInfo)
Get-Upt -targetObj ([ref]$systemInfo)

# 转换为JSON并写入文件
$systemInfo | ConvertTo-Json | Out-File -FilePath "$HOME/Downloads/serverscript.json"

原脚本问题说明

原脚本的核心问题是每次生成单个键的JSON对象并追加到文件,导致文件内容是多个独立的JSON顶级对象,这不符合JSON语法规范(合法JSON只能有一个顶级对象或数组)。后续尝试用ConvertFrom-Json读取时,因为内容格式错误,可能导致读取失败或变量为空,从而触发null绑定错误。

内容的提问来源于stack exchange,提问作者mimi m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:23:29