Comme Johannes souligne ce scénario fonctionne bien dans V2. Dans V1, vous pouvez obtenir des informations précises sur la ligne d'erreur lorsque vous exécutez directement le bloc sript mais Measure-Command fait quelque chose qui entraîne la perte du numéro de ligne de l'erreur d'origine.
Vous pouvez contourner ce problème dans V1 avec une routine de mesure personnalisée qui utilise la classe .NET StopWatch. Cette routine est assez simple et des miroirs dans le script quelle mesure-commande ne en code binaire:
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"
Notez que pour les mesures très fines, il ne semble pas tout à fait aussi précis que le haut-mesure-commande parce qu'il ya un peu de temps perdu dans l'interprétation et l'exécution des appels Start() et Stop(). Cependant, pour les opérations qui prennent 100 milliSecs (estimation grossière) ou plus, cela devrait être assez précis.