PowerShell: Узнать тип исключения

Запускаю скрипт с таким участком кода:

$taskName = "SetupModeTempAllow"
$task = Get-ScheduledTask -TaskName "$taskName"

Если задача с именем «SetupModeTempAllow» не существует, то в результате выполнения скрипта получаю сообщение об ошибке:

Get-ScheduledTask : No MSFT_ScheduledTask objects found with property 'TaskName' equal to 'SetupModeTempAllow'. Verify the value of the property and retry.
+ $task = Get-ScheduledTask -TaskName "$taskName"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (SetupModeTempAllow:String) [Get-ScheduledTask], CimJobException
+ FullyQualifiedErrorId : CmdletizationQuery_NotFound_TaskName,Get-ScheduledTask

В принципе на функциональности скрипта это не отражается, но большое количество красных букв напрягает :) Поэтому я решил отловить исключения:

try
{
  $task = Get-ScheduledTask -TaskName "$taskName" -ErrorAction Stop
}
catch [CimJobException]
{
  Write-Verbose "Path $($_.TargetObject) not found!"
}

Но получил другую ошибку:

Unable to find type [CimJobException].
+ catch [CimJobException]
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (CimJobException:TypeName) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound

Очевидно, что был указан неверный тип исключения (не полное название).

На сайте MS про исключения я ничего не нашёл. Пришлось найти другой способ получить детальное описание исключения.
После того, как скрипт выбросил исключение, нужно в той же консоле выполнить:

$Error[0] | Select –Property *
В переменной $Error[0] будет сохранено последнее сообщение об ошибке до тех пор, пока сессия PowerShell не будет закрыта.

 

получим:

PS C:\Windows\system32> $Error[0] | Select –Property *

writeErrorStream : True
PSMessageDetails :
OriginInfo :
Exception : Microsoft.PowerShell.Cmdletization.Cim.CimJobException: No MSFT_ScheduledTask objects found with property 'TaskName' equal to 'SetupModeTempAllow'. Verify the value of the
property and retry.
TargetObject : SetupModeTempAllow
CategoryInfo : ObjectNotFound: (SetupModeTempAllow:String) [Get-ScheduledTask], CimJobException
FullyQualifiedErrorId : CmdletizationQuery_NotFound_TaskName,Get-ScheduledTask
ErrorDetails :
InvocationInfo : System.Management.Automation.InvocationInfo
ScriptStackTrace :
PipelineIterationInfo : {0, 1}

Здесь в строчке Exception будет указано полное наименование исключения:
Microsoft.PowerShell.Cmdletization.Cim.CimJobException
Ещё одним вариантом будет такой код:

$Error[0].Exception.GetType().FullName

Таким образом код будет следующим:

try
{
  $task = Get-ScheduledTask -TaskName "$taskName" -ErrorAction Stop
} 
catch [Microsoft.PowerShell.Cmdletization.Cim.CimJobException]
{
  Write-Verbose "Path $($_.TargetObject) not found!"
}
Не забудьте добавить -ErrorAction Stop, чтобы исключение можно было отловить!


Подписаться
Уведомление о
guest
0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments