PowerShell函数为何只有保留参数变量内联引用行才能正常返回值?
问题原因分析
- PowerShell函数返回规则的影响
PowerShell中函数的返回值不是仅由return语句决定,所有未被捕获的输出都会被自动加入到返回结果集合中。你保留$Ex这行时,单独写的$Ex会将整个异常对象输出到返回流,后续return返回的错误消息也会被追加到返回流中,最终返回的是一个包含异常对象+错误消息的数组。你输出$msg时PowerShell会自动将数组转为字符串拼接,所以能看到正常内容。 - 属性拼写错误的叠加影响
你代码中判断内部异常的属性名拼写错误:$Ex.innerExecption多写了一个字母e,正确拼写为$Ex.InnerException。访问不存在的属性时PowerShell会默认返回$null,所以你的内部异常判断永远不生效。 - 函数定义顺序错误导致调用异常
PowerShell是顺序解释执行的脚本语言,你将Get-ErrorMessage函数的定义写在了调用语句(catch块中的$msg = Get-ErrorMessage -ex $_)的后面,首次执行脚本时,调用函数时函数还未被定义,会报错找不到命令,$msg自然为空。你之前能跑通是因为之前的测试已经将旧版本的函数加载到了当前PowerShell会话中,修改代码后新的函数没有被重新加载,所以出现了奇怪的表现。
修复后的代码
# 先定义函数,再调用 function Get-ErrorMessage() { Param( [Parameter(Mandatory = $True)] [System.Management.Automation.ErrorRecord] $Ex ) $errorMessage = $Ex.Message # 修正属性名拼写 if ($null -ne $Ex.InnerException) { $errorMessage = $Ex.InnerException.Message } return $errorMessage } try { throw [System.IO.FileNotFoundException] "file not found." } catch [System.IO.FileNotFoundException] { $msg = Get-ErrorMessage -ex $_ Write-Host "Exception message: $($msg)" }
修复后不需要保留多余的$Ex引用行即可正常返回错误消息。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

