Powershell — попытка / перехват в foreach

#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. Спасибо, код, который я опубликовал, дает мне прекрасный вывод ошибок