使用PowerShell的Measure-Command时,如何准确报告错误

时间:2009-10-15 19:17:12

标签: powershell error-handling

当我在使用Measure-Command进行测试的脚本块中出现错误时,错误显示在调用行,而不是错误被抛出的位置。

以下是一个例子:

function ThrowAnError
{
    Write-Host "in ThrowAnError"
    throw "ThrowAnError"
}

Measure-Command  { ThrowAnError }

这报告在ScriptBlockErrors.ps1:6 char:16并且我希望能够知道错误发生在第4行

有什么想法吗?

2 个答案:

答案 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,我担心你运气不好。