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

警告输出流应为字符串却成对象,如何提取纯警告信息?

解决PowerShell警告流捕获后转JSON出现额外属性的问题

你尝试从警告输出流捕获内容,存入哈希表后转换为JSON,但最终得到的result字段包含了Context、Filename等额外属性,而非预期的纯警告字符串。

原代码

$res = $newSQLInstallation.InstallSQLServer() 3> warning.txt 
$err = get-content warning.txt # 此处值为: [11:53:35][Invoke-DbaAdvancedInstall] Installation failed with exit code -2068643838. Expand 'ExitMessage' and 'Log' "
...
    $table = @{
    retvalue = @{
        result = ""
        definition = "SQL Server Installation: $($newSQLInstallation.ServerName)"
        }
    }

if($err)
{
    $table.retvalue.result = $err
    throw $table
} 
else
{
    $table.retvalue.result = "Success"    
}   
return $table | ConvertTo-Json 

实际输出的JSON

{
"retvalue": {
"definition": "SQL Server Installation: sqlserver1",
"result": {
  "Context": null,
  "Filename": "InputStream",
  "IgnoreCase": true,
  "Line": "[11:53:35][Invoke-DbaAdvancedInstall] Installation failed with exit code -2068643838. Expand 'ExitMessage' and 'Log' ",
  "LineNumber": 1,
  "Matches": "failed",
  "Path": "InputStream",
  "Pattern": "failed"
}
}
}

问题原因

从输出的result结构可以看出,$err实际上是MatchInfo类型的对象,而非纯字符串。这是因为你在代码省略的...部分,大概率对$err执行了Select-String之类的正则匹配操作,导致变量被转换成了包含匹配元数据的对象。

解决方案

要获取纯警告消息,只需提取MatchInfo对象的Line属性即可。修改赋值逻辑如下:

if($err)
{
    # 提取纯警告字符串,兼容字符串和MatchInfo两种情况
    $table.retvalue.result = if ($err -is [Microsoft.PowerShell.Commands.MatchInfo]) { $err.Line } else { $err }
    throw $table
} 
else
{
    $table.retvalue.result = "Success"    
}   

如果确认$err一定是MatchInfo对象,也可以直接简化为:

$table.retvalue.result = $err.Line

修改后,JSON输出的result字段就会是纯警告字符串,不再包含额外属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:50:37