Цель является двукратной:
Такое поведение наблюдается, потому что блоки try / catch работают только при устранении ошибок ( Тип ошибки MSDN Powershell Ссылка )
Вы можете управлять тем, как работает Powershell, изменив переменную $ ErrorActionPreference .
Если вы настроите свой скрипт так, чтобы $ ErrorActionPreference = "Stop"
вверху, то все ошибки будут считаться прерывающими ошибками, и блок try / catch будет работать.
Если вы просто хотите изменить действие при ошибке для одной команды, вы можете использовать параметр -ErrorAction
, чтобы изменить его для этой команды.
Если вы хотите «поймать» ошибку, Я покажу вам свой пример, и, возможно, вы сможете использовать его.
function LoggedOnUser($MachineNameOrIP){
$LoggedOnUser = "CouldNotGetUser"
trap [Exception]{ # this installs an error handler for the function
Write-Host "Error Accessing WMI - $MachineNameOrIP"
Log("Error Accessing WMI - $MachineNameOrIP")
continue;
}
$LoggedOnUser = Get-WMIObject Win32_Process -filter 'name="explorer.exe"' -computername $MachineNameOrIP |
ForEach-Object { $owner = $_.GetOwner(); '{0}\{1}' -f $owner.Domain, $owner.User } |
Sort-Object | Get-Unique
return $LoggedOnUser
}
Как вы, наверное, догадались, это функция для поиска вошедшего в систему пользователя машины. В середине есть часть для улавливания любых исключений. Возможно, вам удастся обойтись без
trap [ManagementObjectNotFoundException] {....}
, поскольку powershell тесно связывает .net.