2012-12-18 91 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