2014-12-26 54 views
0

認爲劇本獲取其中寫入錯誤發生

$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 

行號而且我注意到,寫入錯誤始終報告本身作爲在行:1 根據堆棧跟蹤,它看起來像它的行#1,因爲它從shell中調用,更有趣char:15 be導致

".\MyScript.ps1 ".Length -eq 15 

如果改變文件名,這焦炭:15也將相應變化。

問題是如何得到錯誤發生時的實際行。

在我們的情況下,我想獲得行:9

回答

1

當有實際的錯誤,通過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

+0

我使用** **扔在我自己的腳本。我的問題的原因是當您使用某些使用**寫入錯誤**的第三方。當它失敗時,最好能夠快速識別確切的位置 – mnaoumov

+0

有幾種方法可以通過修改MyScript.ps1來糾正錯誤。問題來自這個腳本正在使用寫入錯誤的事實。如果您無法修改MyScript.ps1,則無法有效解決此問題。 –

+0

太糟糕了......這是我的樣板腳本標題缺少的唯一東西,用於改善腳本體驗 – mnaoumov

相關問題