2017-06-08 5 views
1

私は、指定されたサーバー内の一部のデータベースを照会し、別のサーバーの特定のデータベースにメタデータを挿入する関数を呼び出すラッパースクリプトを使用しています。 $ error.count変数を使用して、スクリプトが成功したかどうかを判断します。いくつかの許可/抽出エラーが発生することが予想され、これらを捕まえて無視する($ error.count変数を増やさずに、ジョブログに警告を書き込む)。私は1つの許可エラーが起こっていることを確認でき、正しく捕らえられています。 $ error.count変数は増加しませんが、アクセスできないデータベースを示すcatchから警告が出力されます。PowerShellのカスケードエラーをキャッチ

抽出/挿入機能の実行が終了すると、問題が発生します。この関数がラッパースクリプトに戻った直後に、私は$ error.count変数を再度出力します。今回は、エラーが以前にカスケードをラッパースクリプトに取り込んだかのように1を返します。私が以前に言及したように、私はこれがエラーカウントに含まれないようにします。私はどのように、なぜ$ error.countがこの関数から増やされたのかよく分かりません。

スクリプトが「失敗した」かどうかを判断するために別の変数を使用する必要がありますか? $ error.countが、エラーが捕捉された後に増加しないうちに、エラーのある関数の外側で増加する理由がいくつかありますか?この問題に関するガイダンスは高く評価されます。参考のため

コード: ラッパー関数:

$errorCount = $error.count 
    Write-Warning ("$errorCount Before function") 
    Extraction/Insertion_Function -serverList $serverList -insertionDB $insertionDB -ErrorAction SilentlyContinue 
    $errorCount = $error.count 
    Write-Warning ("$errorCount After function") 
    } catch { 
    Write-Error "Error caught by wrapper: $_" 
    } 

抽出/ Insertion_Function:

ForEach ($db in $dbList) { 
Write-Warning "$errorCount database 
. 
. 
. 
    try { 
      $totalProperties = Get-ServerDBMetadata -DBConnectionString ($connStr) -DatabaseName $dbName -EA SilentlyContinue 
      } catch { 
       Write-Warning "Unable to extract metadata from $dbname in $server" 
       } 
} 

Iは、エラー・カウントが抽出ループ内でプリントアウト持っ/各データベースからメタデータを挿入データベースを含む各サーバーのループ内だけでなく、挿入データベースにも送信されます。

WARNING: 0 Before function 
WARNING: 0 database 
. 
. 
. 
WARNING: 0 database 
WARNING: Unable to extract metadata from *database* in *server* 
WARNING: 0 database 
. 
. 
. 
WARNING: 0 database 
**WARNING: 1 After function** 

エラー(権限の問題)が関数内でキャッチされますが、ラッパースクリプトにカスケードされます。この特定のエラーを無視し、他の重大なエラー(サーバーに接続できず、メタデータを挿入しているなど)を無視して、ラッパースクリプト内のドライバ機能に-EA Ignoreを設定します。質問。

+0

何をしているのかを判断するのに十分なコードがありません。 [mcve]を入力してください。あなたが知っておくべき1つのことは、 '$ error.Count'は変数ではありません。 '$ error'は(特別な)変数であり、すべてのエラーを含む配列なので、' $ error.Count'は配列のサイズを示しています。 '$ error'は最後ではなく始めに追加されるので、' $ error [0] 'は常に最新のエラーです。なぜカウントが増加しているのか知りたいのであれば、実際のエラーは何が起こっているかの手がかりを与えるので、 '$ error [0]'を見てください。 – briantist

+0

私は何が起こっているのか知っています。その許可の問題。私の問題は、その特定の問題を無視したいということです。エラーカウントが表示されているのがわかるように、エラーカウントはキャプチャされ、エラーが発生した関数内のエラーカウントには含まれませんが、関数の外にはラッパースクリプトに含まれています。なぜそれが正しいのかを知りたいので、正しく無視する方法を見つけ出すことができます。あるいは、エラー処理のためのより良い「変数」が使用できるなら、それが何であるかを知りたいと思います。 – Kemilio

答えて

2

try-catchが(すべてのコードを提供していなくても)エラーをキャッチしない主な問題は、コマンドレットが明示的に-ErrorAction SilentlyContinueを呼び出すことです。 Try/Catchブロック終了エラーの使用をREQUIREするので、関数/コマンドレットの場合は、try/catchがその関数/コマンドレットのエラーを適切に処理するためには-ErrorAction Stopに変更する必要があります。

これは、表示されないコード内の他の関数/コマンドレットに対しても更新する必要があります。以下のコメントで説明

編集:最後のログので、残りのエラーを記録

$n = New-Object PSObject -property @{ 
    'Test1' = '' 
    'Test2' = '' 
    'Test3' = '' 
} 

try { 
    get-process someprocess -ErrorAction Stop 
    $n.Test1 = $true 
} catch { 
    $n.Test1 = $false 
} 

try { 
    Get-WmiObject win32_computersystem -ErrorAction Stop 
    $n.Test2 = $true 
} catch { 
    $n.Test2 = $false 
} 

try { 
    Get-Content somefile.ext -ErrorAction Stop 
    $n.Test3 = $true 
} catch { 
    $n.Test3 = $false 
} 


if ($n.Test1 -and $n.Test2 -and $n.Test3) { 
    ## All procedures completed successfully -- do something magical 
} else { 
    ## At least one test procedure failed. 
} 
+0

関数の終了後も、関数内で捕捉されたエラーはエラーとして返されますか?私のExtraction/Insertion_Functionの内部のエラーが捕捉されているようですが、その関数が終了してラッパーが実行を続けると、エラー終了時にスタックが非終了エラーとしてスタックアップします。 – Kemilio

+0

コードのさまざまな部分の成功または失敗を判断するために、自分自身でkludgyエラー処理メカニズムを作成しようとしているようです。私が他のプロセスが成功していることに依存しているプロセスがある場合は、上記の編集で示された方法で処理します。特定のセグメントを試してみましょう。$ error変数を数える代わりに、明示的にテストしてください(上記参照)。 – thepip3r

1

While ($Global:ErrorCount -lt $Error.Count) { 
    $Err = $Error[$Error.Count - ++$Global:ErrorCount] 
    $ErrLine = "Error at $($Err.InvocationInfo.ScriptLineNumber),$($Err.InvocationInfo.OffsetInLine): $Err" 
    Write-Host $ErrLine -ForegroundColor Red  # Log this 
} 
2

IgnoreSilentlyContinueを交換して、エラーを無視して、それが数を増やしていないように。

Extraction/Insertion_Function -serverList $serverList -insertionDB $insertionDB -ErrorAction Ignore 

エラーを終了するのtry/catch文としてthepip3rの答えのように唯一の難点を-ErrorAction Stopを使用し、関数内でそれをキャッチします。

+0

ラッパースクリプトのドライバ関数を無視しても、エラーカウントは引き続き関数外で増加します。また、私は、無視したくない潜在的な問題があるため、ドライバの機能全体を-EA Ignoreにすることは望ましくありません。 – Kemilio

関連する問題