当我在使用Measure-Command
进行测试的脚本块中出现错误时,错误显示在调用行,而不是错误被抛出的位置。
以下是一个例子:
function ThrowAnError
{
Write-Host "in ThrowAnError"
throw "ThrowAnError"
}
Measure-Command { ThrowAnError }
这报告在ScriptBlockErrors.ps1:6 char:16并且我希望能够知道错误发生在第4行。
有什么想法吗?
答案 0 :(得分:3)
正如Johannes指出的那样,这种情况在V2中运行良好。在V1中,您可以在直接运行sriptblock时获得准确的错误行信息,但Measure-Command正在执行导致丢失原始错误行号的操作。
您可以在V1中使用使用.NET StopWatch类的自定义度量例程来解决此问题。这个例程非常简单,并在脚本中反映了Measure-Command在二进制代码中的作用:
function ThrowAnError
{
Write-Host "in ThrowAnError"
throw "ThrowAnError"
}
function Measure-CommandEx([scriptblock]$expression)
{
trap { $sw.Stop(); $sw.Elapsed; break }
$sw = [Diagnostics.StopWatch]::StartNew()
&$expression | Out-Null
$sw.Stop()
$sw.Elapsed
}
Measure-CommandEx { ThrowAnError }
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 4
Ticks : 44832
TotalDays : 5.18888888888889E-08
TotalHours : 1.24533333333333E-06
TotalMinutes : 7.472E-05
TotalSeconds : 0.0044832
TotalMilliseconds : 4.4832
ThrowAnError
At C:\Documents and Settings\Keith\foo.ps1:4 char:7
+ throw <<<< "ThrowAnError"
请注意,对于非常精细的测量,它看起来不像内置的Measure-Command那么精确,因为在解释和执行Start()和Stop()调用时会有一些时间丢失。然而,对于接受100毫秒(粗略猜测)或更多的操作,这应该足够准确。
答案 1 :(得分:0)
它在PowerShell v2中运行良好:
PS Home:\> .\x.ps1
in ThrowAnError
ThrowAnError
At C:\...\x.ps1:4 char:10
+ throw <<<< "ThrowAnError"
+ CategoryInfo : OperationStopped: (ThrowAnError:String) [], RuntimeException
+ FullyQualifiedErrorId : ThrowAnError
但对于PowerShell v1,我担心你运气不好。