如何防止PowerShell中的Write-Error CategoryReason截断?

时间:2015-03-24 01:21:27

标签: powershell

当超过40个字符时,powershell ErrorRecord对象的CategoryView参数似乎在输出窗口中截断。

$ErrorView = 'CategoryView'
$ErrorActionPreference = 'continue'
$cr_40 = "Lorem ipsum dolor sit amet, consectetuer"
$cr_41 = "Lorem ipsum dolor sit amet, consectetuer."

Write-Error -Message "No ellipsis" -CategoryReason $cr_40 
Write-Error -Message "Has ellipsis" -CategoryReason $cr_41

输出:(截图here
未指定:( :) [Write-Error],Lorem ipsum dolor sit amet,consectetuer
NotSpecified :( :) [Write-Error],Lorem ipsum dol ...,consectetuer。

有没有办法防止这种情况发生?

关于&管的其他建议,例如管道进入Format-List或使用ExpandProperty不起作用。为了清楚起见,我不是在谈论提取该部分的内容以供其他地方使用(例如here)。我宁愿它不会在第一时间被截断。这可能吗?

1 个答案:

答案 0 :(得分:2)

PowerShell中的错误是一个对象。您正在使用视图查看此对象。 在这种情况下$ ErrorView ='CategoryView'。那么为什么当长度超过40个字符时,CategoryReason显示会被截断?我们来看看你的错误:

Write-Error -Message "Has ellipsis" -CategoryReason "Lorem ipsum dolor sit amet, consectetuer."

NotSpecified: (:) [Write-Error], Lorem ipsum dol..., consectetuer.

要检查此错误对象,可以将其检索为$ error ArrayList

的第一个元素
$error[0]

NotSpecified: (:) [Write-Error], Lorem ipsum dol..., consectetuer.

没有多大区别,但至少我们知道我们有正确的对象。让我们尝试扩展属性。

$error[0] | fl * -force

writeErrorStream      : True
PSMessageDetails      : 
Exception             : Microsoft.PowerShell.Commands.WriteErrorException: No ellipsis
TargetObject          : 
CategoryInfo          : NotSpecified: (:) [Write-Error], Lorem ipsum dol..., consectetuer.
FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {0, 0, 0}

现在你可以看到CategoryReason被埋没在另一个对象CategoryInfo中。

$error[0].CategoryInfo

Category   : NotSpecified
Activity   : Write-Error
Reason     : Lorem ipsum dolor sit amet, consectetuer.
TargetName : 
TargetType : 

这里有你的理由。 $ ErrorView ='CategoryView'显示CategoryInfo对象。作为属性的原因将在该显示中被截断。

如果您想访问原因,可以检索

$error[0].CategoryInfo.Reason
Lorem ipsum dolor sit amet, consectetuer.

除此之外,我怀疑是否有办法重新格式化预定义的ErrorView。

编辑:PowerShell团队目前有一个Active Feature Request来添加此功能。