当超过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)。我宁愿它不会在第一时间被截断。这可能吗?
答案 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来添加此功能。