4

InitialSessionState.ImportPSModulePowershell モジュールをインポートするために使用しようとしています。

モジュールのインポートが何らかの理由 (ファイルが見つからないなど) で失敗したかどうか知りたいです。そのようなコードを try ブロックに入れると、失敗した場合に例外が発生せず、モジュールをインポートできない場合、関数は黙って失敗し、続行するように見えます。

インポートが失敗した場合にコードで警告を受ける方法はありますか?

私は次のようなことをしようとしています。以下のコードでは、モジュール「TestModule1234」は存在しません。catch ブロックは例外をキャッチしません。

注: これは単なるプロトタイプ テスト コードであるため、製品コードに関連する不規則性は無視してください。

try
{
    //Initializing the PowerShell runspace
    InitialSessionState psSessionInitialState = InitialSessionState.CreateDefault();


    LogFile.Log("Importing Module TestModule1234");
    psSessionInitialState.ImportPSModule(new[] { "TestModule1234" });

    LogFile.Log("Creating Powershell Runspace");
    m_PoshRunspace = RunspaceFactory.CreateRunspace(psSessionInitialState);
}
catch (System.Exception ex)
{
    LogFile.Log("Failed to create a Powershell Runspace");
    LogFile.Log(ex.ToString());
    throw;
}
4

1 に答える 1

7

何らかの理由で、欠落しているモジュールは致命的なエラーとして扱われません。しかし、それらはまだ記録されたエラーです。問題を解決するには、次のようにします。

  1. で実行空間を開きますOpen()。他の例外をキャッチするために、まだ try ブロックでこれを行ってください。それらは可能です。実際にそのようなケースがありました。
  2. 標準エラー リスト ( $Error) を取得し、特定の「モジュールが見つからない」エラーまたはその他のエラーについて開いた後に分析します。

これは、文字通り C# に変換されるように、.NET メソッドのみを使用した PowerShell での実際の例です。このスクリプトは失敗しません (例外はスローされません) が、変数として取得されたエラーが表示されます Error

$psSessionInitialState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault();

"Importing Module TestModule1234"
$psSessionInitialState.ImportPSModule(@("TestModule1234"))

"Creating PowerShell Runspace"
$PoshRunspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($psSessionInitialState)

"Opening PowerShell Runspace"
$PoshRunspace.Open()

"Getting Runspace Error"
$PoshRunspace.SessionStateProxy.PSVariable.GetValue('Error')

出力

モジュールのインポート TestModule1234 Powershell 実行空間の作成 Powershell 実行空間を開く 実行空間の取得エラー + CategoryInfo : ResourceUnavailable: (TestModule1234:String) [Import-Module], FileNotFoundException + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

于 2012-12-18T15:01:19.837 に答える