2009-10-15 5 views
1

Lorsque j'ai une erreur dans un bloc de script que je suis en train de tester avec Measure-Command, l'erreur est affichée sur la ligne de l'appel, et non à l'emplacement de l'erreur Est lancé.Comment signaler des erreurs lors de l'utilisation de Measure-Command de PowerShell

Voici un exemple:

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

Measure-Command { ThrowAnError } 

Ce rapports à ScriptBlockErrors.ps1: 6 car: 16 et j'aimerais être en mesure de savoir que l'erreur à ligne ne est venu 4.

Des idées?

Répondre

3

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.

0

Il fonctionne très bien dans v2 PowerShell:

PS Home:\> .\x.ps1 
in ThrowAnError 
ThrowAnError 
At C:\...\x.ps1:4 char:10 
+  throw <<<< "ThrowAnError" 
    + CategoryInfo   : OperationStopped: (ThrowAnError:String) [], RuntimeException 
    + FullyQualifiedErrorId : ThrowAnError 

Mais pour v1 PowerShell Je crains que vous êtes hors de la chance.

Questions connexes