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

PowerShell脚本try/catch块优雅执行:返回0并输出指定JSON

问题分析与修复方案

核心问题

  1. 初始的throw语句不在try代码块内,抛出的异常无法被后续catch捕获,会直接终止脚本,无法执行到finally中的输出逻辑。
  2. Get-WmiObject默认不会抛出可被catch捕获的终止性异常,需要显式指定参数才能让异常进入catch块。
  3. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:20:39