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 ответ
По некоторым причинам отсутствующие модули не рассматриваются как фатальные ошибки. Но они все равно перекодируются ошибками. Для решения проблемы сделайте:
- Откройте пространство для выполнения
Open()
, Делайте это еще в блоке try, чтобы перехватить другие исключения, они возможны, у меня были такие случаи на практике. - Получить стандартный список ошибок (
$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