我最近开始深入研究Powershell中的错误处理,我发现了一些我不太懂的东西(我无法分辨出这种行为来自哪里)。
我有一个简单的函数,它使用[System.Net.DNS]::GetHostByName()
如果此变量传递给不存在的主机,则会引发一个讨厌的错误
Exception calling "GetHostByName" with "1" argument(s): "No such host is known"
然后我想抓住错误并在其周围做一些化妆品
$Error[0].Exception.InnerException
给出了非常好的输出:
No such host is known
而没有别的 - 我喜欢它,我希望它是出现的消息而不是错误。
当我将上述内容放入catch子句时,一切正常。
但当我看到用分号,或使用Write-host
或以任何方式将其转换为' string'时,我感到多么惊讶。值,弄乱了innerException。
亲自试试:
$Error[0].Exception.InnerException
投掷"$($Error[0].Exception.InnerException)"
投掷第一个命令给出No such host is known
,而第二个命令给出完整错误。
请解释一下为什么会发生这种情况?
最后,我希望弹出错误消息:
No such host is known: $computername
。是否容易'这样做的方式而不是做血腥的正则表达式?
答案 0 :(得分:2)
此?
"$($Error[0].Exception.InnerException.message): $computername"
你有恕我直言的行为归因于custom formatting file
答案 1 :(得分:2)
我认为不同之处在于Powershell正在调用哪种方法来获取不同情况下对象的输出。
当您使用
将其输出到管道时$error[0].exception.innerexception
它正在调用.GetBaseException()
方法,它只输出Message属性。
当您将其转换为[string]以与Write-Host一起使用时,它会调用.tostring()
方法,该方法输出所有错误信息。