2012-12-18 93 views
2

我正在尝试使用InitialSessionState.ImportPSModule来导入Powershell模块。ImportPSModule失败检测

我有兴趣了解由于任何原因导致模块导入失败(例如找不到文件等)。将这样的代码放在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; 
} 
+0

如果我运行'进口模块xyz'我得到'导入 - 模块:指定的模块'xyz'未加载,因为在任何模块目录中都找不到有效的模块文件。你能告诉我们你如何尝试导入模块? –

+0

编辑原始问题以显示我正在尝试执行的示例。 – Dev28

回答

3

由于某些原因,遗漏的模块不被视为致命错误。但是他们仍然记录错误 。为了解决这个问题:

  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的运行空间获取运行空间错误导入模块: 指定模块'TestModule1234'未加载,因为在任何模块目录中找不到有效的 模块文件。 + CategoryInfo:ResourceUnavailable:(TestModule1234:字符串)导入模块],FileNotFoundException异常 + FullyQualifiedErrorId:Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand