私は、指定されたサーバー内の一部のデータベースを照会し、別のサーバーの特定のデータベースにメタデータを挿入する関数を呼び出すラッパースクリプトを使用しています。 $ 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を設定します。質問。
何をしているのかを判断するのに十分なコードがありません。 [mcve]を入力してください。あなたが知っておくべき1つのことは、 '$ error.Count'は変数ではありません。 '$ error'は(特別な)変数であり、すべてのエラーを含む配列なので、' $ error.Count'は配列のサイズを示しています。 '$ error'は最後ではなく始めに追加されるので、' $ error [0] 'は常に最新のエラーです。なぜカウントが増加しているのか知りたいのであれば、実際のエラーは何が起こっているかの手がかりを与えるので、 '$ error [0]'を見てください。 – briantist
私は何が起こっているのか知っています。その許可の問題。私の問題は、その特定の問題を無視したいということです。エラーカウントが表示されているのがわかるように、エラーカウントはキャプチャされ、エラーが発生した関数内のエラーカウントには含まれませんが、関数の外にはラッパースクリプトに含まれています。なぜそれが正しいのかを知りたいので、正しく無視する方法を見つけ出すことができます。あるいは、エラー処理のためのより良い「変数」が使用できるなら、それが何であるかを知りたいと思います。 – Kemilio