2013-11-16 5 views
0

Я пытаюсь изменить сценарий, который я написал, чтобы быть модульным, в то время как я больше узнаю о создании инструмента. Я нахожусь в точке, где я пытаюсь заставить обработать ошибки и не знаю, как заставить функции вырваться. Вот что я получил:Обработка ошибок в функциях Powershell

[CmdletBinding()] 
param(
    [string]$DPMServerName = 'server1' 
) 

Function Get-Libraries { 
    Write-Verbose ("Getting list of libraries connected to {0}." -f $DPMServerName) 
    Try { 
     Set-Variable -Name libraries -Value (Get-DPMLibrary $DPMServerName -ErrorAction Stop | Where {$_.IsOffline -eq $False}) 
    } 
    Catch [Microsoft.Internal.EnterpriseStorage.Dls.Utils.DlsException] { 
     Write-Error ("Cannot connect to the DPM library. It appears that the servername is not valid. The specific error message is: {0}" -f $_.Exception.Message) 
     Return $_.Exception.Message 
    } 
    Catch { 
     Write-Error ("Unknown error getting library. The specific error message is: {0}" -f $_.Exception.Message) 
     Return 
    } 

    Foreach ($library in $libraries) { 
     Write-Verbose ("Starting fast inventory on {0}" -f $library) 
     Start-DPMLibraryInventory -DPMLibrary $library -FastInventory -ErrorAction SilentlyContinue 
    } 

    $libraries 
} 

Function Update-TapeStatus ($libs) { <### add parameter "$libs" to the function ###> 
    Foreach ($library in $libs) { 
     $tapes = Get-DPMTape -DPMLibrary $library | Where {$_.Location -notmatch "*slot*"} | Sort Location 
     <### output the list of tapes ###> 
     $tapes 
    } 
} 

$liblist = Get-Libraries 
If ($LASTEXITCODE) { 
    Write-Output $LASTEXITCODE 
} 
Else { 
    Update-TapeStatus $liblist 
} 

Если есть ошибка (например, получение списка библиотек), я хочу представить собственное сообщение и остановить скрипт. Я хочу сделать что-то подобное для других функций. Однако, как написано, я не получаю желаемое сообщение.

Как это сделать? Благодарю.

+1

Какое фактическое поведение вы видите? Вы видите запись об ошибках PowerShell, или вы ничего не видите? –

+0

Я получаю ошибку Powershell: не удалось найти тип [Microsoft.Internal.EnterpriseStorage.Dls.Utils.DlsException]: убедитесь, что сборка, содержащая этот тип, загружена ... – StackExchangeGuy

ответ

0

Основываясь на вашем пояснении, что происходит, когда генерируется исключение, PowerShell пытается сопоставить тип исключения с тем, что вы указали в предложении catch.

У меня нет опыта с модулем DPM/оснастки, но мне интересно, действительно ли модуль загружает сборку, содержащую тип исключения, который вы пытаетесь поймать в домене приложения. По ошибке вы получаете, она не появляется. Надеюсь, вы знаете, что такое имя сборки, которое содержит этот класс. Используйте командлет Add-Type с параметром -AssemblyName в верхней части вашего сценария для загрузки сборки, чтобы среда выполнения PowerShell знала о типе исключения, который вы ищете.

В качестве последнего примечания, вероятно, не рекомендуется использовать класс в пространстве имен Microsoft.Internal, поскольку он не предназначен для непосредственного использования в коде, а в качестве поддержки за кулисами в библиотеках .Net. Microsoft могла вытащить коврик из-под вас без предупреждения.

+0

Я знаю, почему команда не работает (требуемый модуль не установлен на этой машине). Я не знаю, как получить это сообщение об ошибке из функции и обработать ее. – StackExchangeGuy

+0

Вместо того, чтобы использовать возврат в своих блоках catch, вы можете использовать 'throw' и перехватывать исключение на уровне скрипта в инструкции try/catch. Если вы используете бросок самостоятельно или 'throw $ _', вы восстанавливаете исходную запись/исключение ошибки. Однако вы можете набросать строку, чтобы вы могли делать что-то вроде «throw». Не удается подключиться к библиотеке DPM. Похоже, что имя сервера недопустимо. Особое сообщение об ошибке: {0} "-f $ _. Exception.Message) ', а затем оберните строку' $ liblist = Get-Libraries' в заявлении try/catch –

+0

Спасибо, это очень помогло. Вот что у меня есть (удалены биты, которые не применяются к этому примеру): ' Функция Get-Libraries { Write-Verbose (« Получение списка библиотек ») Попробовать { Get-DPMLibrary $ DPMServerName -ErrorAction Stop | Где {$ _ IsOffline -eq $ False.}} Поймайте { Throw ("Не удается подключиться к библиотеке DPM Ошибка:. {0}". -f $ _ Exception.Message) } } $ библиотеки } Try { $ liblist = Get-библиотеки } Поймайте { записи ошибки $ _ Выход } ' – StackExchangeGuy

Смежные вопросы