考虑一下脚本
$someComplexCondition = $false
if ($someComplexCondition)
{
Write-Error -Message "Some complex condition"
}
else
{
Write-Error -Message "Other complex condition"
}当我运行它时,上面写着
C:\Dev> .\MyScript.ps1
C:\Dev\MyScript.ps1 : Other complex condition
At line:1 char:15
+ .\MyScript.ps1 <<<<
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,MyScript.ps1我注意到,写错误总是将自己报告为,在line:1中,根据堆栈跟踪,它看起来像是#1行,因为它是从shell调用的,而更有趣的是char:15,因为
".\MyScript.ps1 ".Length -eq 15如果我们更改文件名,此char:15将相应更改。
问题是在发生错误时如何获得实际的行。
在我们的例子中,我想得到行:9
发布于 2014-12-26 11:26:57
当出现实际错误时,由Powershell生成的对象类型为ErrorRecord:
$error[0] | Get-Member
TypeName: System.Management.Automation.ErrorRecord当您使用这个与写错误相同的ErrorRecord时,您不会得到一个对象:
$myError = Write-Error -ErrorRecord $Error[0]
PS C:\> $MyError | Get-Member
gm : You must specify an object for the Get-Member cmdlet.
At line:1 char:12
+ $MyError | gm
+ ~~
+ CategoryInfo : CloseError: (:) [Get-Member], InvalidOperationException
+ FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand所以,现在,我们知道写错误不会给我们提供任何我们以后可以重用的东西。
您可以使用“抛出”语句,而不是:
$someComplexCondition = $false
if ($someComplexCondition)
{
Throw "Some complex condition"
}
else
{
Throw "Other complex condition"
}然后,在运行脚本时,错误会给出“抛出”语句开头的行号和字符号:
C:\Test-Error.ps1
Other complex condition
At C:\Test-Error.ps1:9 char:5
+ Throw "Other complex condition"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Other complex condition:String) [], RuntimeException
+ FullyQualifiedErrorId : Other complex condition这里是9号线。
https://stackoverflow.com/questions/27654028
复制相似问题