2012-05-08 57 views
6

我目前在調用帶有Powershell的導入模塊時遇到問題,並希望得到一些建議。如何正確地忽略PowerShell中的導入模塊錯誤

據此間,同時試圖導入使用PowerShell的一個模塊接收時,以前的問題和答案,下面的錯誤,可以忽略不計:

跳過文件,因爲它已經從「Microsoft.PowerShell」存在。

問題是如果導入命令在try/catch語句內,它會被捕獲。

我讀過許多關於此的帖子(例如PowerShell on SCOM fails to import module),並且有人提到嘗試在Import-Module命令中添加「-ErrorAction SilentlyContinue」,但不幸的是,這沒有什麼區別。

下面是我目前用來測試問題的代碼,應該讓您更好地理解我正在嘗試實現的目標。

有沒有人成功地忽略了模塊導入時的這些警告,同時包裹在try/catch之前?

感謝您的時間,

安德魯

function load_module($name) 
{ 
    if (-not(Get-Module -Name $name)) 
    { 
     if (Get-Module -ListAvailable | Where-Object { $_.name -eq $name }) 
     { 
      Import-Module $name 

      return $true 
     } 
     else 
     { 
      return $false 
     } 
    } 
    else 
    { 
     return $true 
    } 
} 

$moduleName = "ActiveDirectory" 

try 
{ 
    if (load_module $moduleName) 
    { 
     Write-Host "Loaded $moduleName" 
    } 
    else 
    { 
     Write-Host "Failed to load $moduleName" 
    } 
} 
catch 
{ 
    Write-Host "Exception caught: $_" 
} 
+0

難道你當你與你的測試代碼加載AD模塊你提到的錯誤,因爲我不 –

+0

喜吉文,是的,自己運行「Import-Module ActiveDirectory」會給我這個錯誤。 – AndrewB

+0

你會「裝」嗎?導入模塊ActiveDirectory;寫主機「加載」 –

回答

5
function Load-Module 
{ 
    param (
     [parameter(Mandatory = $true)][string] $name 
    ) 

    $retVal = $true 

    if (!(Get-Module -Name $name)) 
    { 
     $retVal = Get-Module -ListAvailable | where { $_.Name -eq $name } 

     if ($retVal) 
     { 
      try 
      { 
       Import-Module $name -ErrorAction SilentlyContinue 
      } 

      catch 
      { 
       $retVal = $false 
      } 
     } 
    } 

    return $retVal 
} 
+0

除了在catch上丟失了retVal,這個距離越來越近了。在導入模塊周圍添加try/catch將會隱藏錯誤並阻止它被捕獲到主要的try/catch中。謝謝。 我們只希望它隱藏錯誤,如果它是特定的「文件被跳過,因爲它已經存在」的消息,但是這可以通過檢查異常消息來執行。 – AndrewB

+0

添加缺少的$ –