2012-03-01 13 views
7

私はPowershellをかなり使い慣れていて、非常に大きなスクリプト、つまり他の関数にネストされた関数を持つ他のスクリプトを呼び出すスクリプトを書いています。このスクリプトを起動すると、どこから来たのかわからないエラーが表示されることがあります。このスクリプトがどこで終了したかを確認する簡単な方法はありますか?私はエラーのトラブルシューティングをすることができますか?スクリプトの流れをトレースする方法

答えて

12

あなたは出力にPowerShellを取得するためにSet-PsDebugを使用することができ、ほぼすべての行は、それが実行されます。

Set-PSDebug -Trace 1; 

唯一の欠点は、あなたはおそらく通じ苦労する大量の出力になってしまいますが...

+0

これはまさに私が探していたものです。しかし、適切にデバッグする方法を考える上で大きな利点があるので、後でその点を検討します。 –

0

通常、エラーには呼び出し元のスクリプトが含まれます。

Windows PowerShell ISEのスクリプトをデバッグモードで実行できないことがあります。これにより、ブレークポイントとステップスルーコードを使用することができます。デバッグのためのISEを使用して上の

Artile:あなたのエラーのが私から来ている場所を確認するには、デバッグ用

ISE debugging

がよろしく Arcass

4

をISEとのかは、Powerguiとデバッグを示唆しています。

Start-Transcriptコマンドレットを使用してスクリプトのトランスクリプトを取得し、すべてのコンソールアクティビティをファイルに書き込むこともできます。したがって、Write-Host "Doing XYZ"などの文を置くことができ、それらは転写ログに表示されます。

あなたがトライキャッチで例外をキャッチするか、このような例外の行番号と列を書くことができますトラップを使用する場合:

$ErrorActionPreference = 'Stop' 

trap { 
    Write-Host "Error on line $($_.InvocationInfo.ScriptLineNumber)" 
    exit 1 
} 

try { 
    Get-Item DoesntExist 
} catch { 
    Write-Host ("Error occurred on line: " + $_.InvocationInfo.ScriptLineNumber) 
} 

$_.InvocationInfoはエラーがから来ていたに関するその他の詳細を持っています。

$ErrorActionPreference = "Stop"を設定すると、trap{}ブロックがトリガーされることが保証されます。この場合、スクリプトが取得した行を書き出して終了します。

+0

を追加しましたこれは、 'try {} catch {}'をあまりにも多くのステートメントの周りに置かなくても、エラーの一般的なトラブルシューティングを可能にするので、 'trap {}'の処理についてです。 –

関連する問題