#powershell #try-catch
#powershell #попытка-перехват
Вопрос:
Этот код записывает ошибки в блок Catch и останавливает выполнение
$Result=""
$Results=@()
$Customers = Get-PartnerCustomer
Try{
$Customers.ForEach({
$CustId = $_.CustomerId
$CustName =$_.Name
$CustomerUser = Get-PartnerCustomerUser -CustomerId $CustId | Where-Object {
$_.DisplayName -like 'name'
} | ForEach-Object {
$_.DisplayName
#$_.UserPrincipalName
}
$Result=@{'Customer Name'=$CustName;'User Name'=$CustomerUser}
$Results = New-Object PSObject -Property $Result
})
}
Catch{
Write-Warning "Caught an exception:"
Write-Warning "Exception Type: $($_.Exception.GetType().FullName)"
Write-Warning "Exception Message: $($_.Exception.Message) - Tenant:$CustName"
}
При добавлении $ErrorActionPreference="Continue"
вверху скрипт продолжается после ошибки, но записывает общее сообщение об ошибке
Get-PartnerCustomerUser : Access denied.
At line:8 char:33
... $CustomerUser = Get-PartnerCustomerUser -CustomerId $CustId | Where ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : CloseError: (:) [Get-PartnerCustomerUser], PartnerException
FullyQualifiedErrorId : Microsoft.Store.PartnerCenter.PowerShell.Commands.GetPartnerCustomerUser
С $ErrorActionPreference="SilentlyContinue"
ним не выводится никаких ошибок.
Возможно ли показать мое пользовательское сообщение об ошибке и не выходить из цикла при первой ошибке?
Ответ №1:
Решаемая, пришлось добавить Try/Catch
внутри ForEach
$ErrorActionPreference="Stop"
$Customers = Get-PartnerCustomer
$Customers.ForEach({
Try{
$CustId = $_.CustomerId
$CustName =$_.Name
$CustomerUser = Get-PartnerCustomerUser -CustomerId $CustId | Where-Object {
$_.DisplayName -like 'Name'
} | ForEach-Object {
$_.DisplayName
#$_.UserPrincipalName
}
$Result=@{'Customer Name'=$CustName;'User Name'=$CustomerUser}
$Results = New-Object PSObject -Property $Result
}
Catch{
Write-Warning "Caught an exception:"
Write-Warning "Exception Type: $($_.Exception.GetType().FullName)"
Write-Warning "Exception Message: $($_.Exception.Message) - Tenant:$CustName"
}
}
)
Комментарии:
1. Вы также можете сослаться
$Error
на то, что содержит все ошибки. Что-то вроде$Error | Select Exception
должно возвращать фактический тип ошибки. Основываясь на вашем первом вопросе2. Спасибо, код, который я опубликовал, дает мне прекрасный вывод ошибок