PowerShell脚本try/catch块优雅执行:返回0并输出指定JSON
问题分析与修复方案
核心问题
- 初始的
throw语句不在try代码块内,抛出的异常无法被后续catch捕获,会直接终止脚本,无法执行到finally中的输出逻辑。 Get-WmiObject默认不会抛出可被catch捕获的终止性异常,需要显式指定参数才能让异常进入catch块。- 使用Here-String拼接JSON时,若异常消息包含双引号等特殊字符,会破坏JSON结构,导致输出无效。
修复后的脚本
$hostName = "" $json_template = $null try { if ([string]::IsNullOrEmpty($hostName)) { throw "Host name cannot be null or empty" } $nameModel = Get-WmiObject Win32_ComputerSystem -ComputerName $hostName -ErrorAction Stop | Select-Object name, model $serialNumber = Get-WmiObject win32_bios -ComputerName $hostName -ErrorAction Stop | Select-Object Serialnumber # 使用ConvertTo-Json生成标准JSON,避免手动拼接的格式问题 $json_template = [PSCustomObject]@{ Info = $nameModel Serial = $serialNumber Message = "" } | ConvertTo-Json } catch { # 同样用ConvertTo-Json生成异常场景的JSON,自动处理特殊字符转义 $json_template = [PSCustomObject]@{ Info = $null Serial = $null Message = $_.Exception.Message } | ConvertTo-Json } finally { Write-Host $json_template exit 0 }
关键修改说明
- 将
$hostName的空值判断逻辑移入try块,确保抛出的异常能被catch捕获。 - 给
Get-WmiObject添加-ErrorAction Stop参数,让命令执行失败时抛出终止性异常,进入catch块处理。 - 改用
PSCustomObject结合ConvertTo-Json生成JSON输出,自动处理特殊字符转义,保证JSON格式的有效性,避免手动拼接Here-String带来的格式错误。 - 移除
catch块中多余的exit 0注释,因为finally块会统一执行输出并退出。
内容的提问来源于stack exchange,提问作者user1829319
相关产品推荐
相关产品推荐

