我最近开始深入研究 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
或以任何方式将其转换为“字符串”值,都会弄乱innerException。
自己尝试一下:
- 使用“错误”名称导致 SocketException
- 看什么
$Error[0].Exception.InnerException
throws
- 看什么
"$($Error[0].Exception.InnerException)"
throws
第一个命令给出No such host is known
而第二个命令给出了完整的错误。
请解释一下为什么会发生这种情况?
最后,我希望弹出错误消息:
No such host is known: $computername
。有没有“简单”的方法来做到这一点,而不是做该死的正则表达式?
我相信区别在于 Powershell 在不同情况下调用哪种方法来获取对象的输出。
当你只是使用它输出到管道时
$error[0].exception.innerexception
它正在调用.GetBaseException()
方法,它只输出 Message 属性。
当您将其转换为 [string] 以与 Write-Host 一起使用时,它会调用.tostring()
方法,输出所有错误信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)