警告输出流应为字符串却成对象,如何提取纯警告信息?
解决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
相关产品推荐
相关产品推荐

