ImportPSModule Обнаружение сбоев

Я пытаюсь использовать InitialSessionState.ImportPSModule для того, чтобы импортировать модуль Powershell.

Мне интересно знать, не удалось ли импортировать модуль по какой-либо причине (например, файл не найден и т. Д.). Помещение такого кода в блок 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;
}

1 ответ

По некоторым причинам отсутствующие модули не рассматриваются как фатальные ошибки. Но они все равно перекодируются ошибками. Для решения проблемы сделайте:

  1. Откройте пространство для выполнения Open(), Делайте это еще в блоке try, чтобы перехватить другие исключения, они возможны, у меня были такие случаи на практике.
  2. Получить стандартный список ошибок ($Error) и проанализировать его после открытия на предмет конкретных ошибок "отсутствующего модуля" или других ошибок.

Вот рабочий пример в PowerShell, использующий только методы.NET, так что он буквально переводится на C#. Этот скрипт не завершается ошибкой (исключения не генерируются), но он показывает ошибку, полученную в качестве переменной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 Ошибка получения пространства выполнения Import-Module: Указанный модуль 'TestModule1234' не был загружен, поскольку ни в одном каталоге модулей не было найдено допустимого файла модуля. + CategoryInfo: ResourceUnavailable: (TestModule1234:String) [Import-Module], FileNotFoundException + FullyQualifiedErrorId: Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

Другие вопросы по тегам