在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
相关产品推荐
相关产品推荐

