вызываемая-команда powershell не обрабатывает блок try-cache

#powershell #try-catch #invoke-command

#powershell #попробуйте-поймайте #вызов-команда

Вопрос:

У меня есть следующий код:

 $output = foreach ($comp in $maschines.name) {
    invoke-command -computer comp1 -ScriptBlock {
        try
        {
            get-vm –VMName $using:comp | Select-Object VMId | Get-VHD | Select-Object @{ label = "vm"; expression = {$using:comp} }, 
            path,
            VhdType, 
            VhdFormat, 
            @{label = "file(gb)"; expression = {($_.FileSize / 1GB) -as [int]} }, 
            @{label = "size(gb)"; expression = {($_.Size / 1GB) -as [int]} }
        }
        catch
        {
            Write-Host some error
        }
    }
}
  

и я не получаю

некоторая ошибка

но:

 > The operation failed because the file was not found.
>       CategoryInfo          : ObjectNotFound: (Microsoft.Hyper...l.VMStorageTask:VMStorageTask) [Ge     t-VHD],
> VirtualizationOperationFailedException
>       FullyQualifiedErrorId : ObjectNotFound,Microsoft.Vhd.PowerShell.GetVhdCommand
>       PSComputerName        : comp1
  

Как я могу получить

некоторая ошибка

в блоке кэша?

Ответ №1:

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

Чтобы принудительно завершить ошибку командлета, вы можете использовать -ErrorAction параметр с Stop в качестве значения:

 $output = foreach ($comp in $maschines.name) {
    invoke-command -computer comp1 -ScriptBlock {
        try
        {
            get-vm –VMName $using:comp -ErrorAction Stop | Select-Object VMId | Get-VHD | Select-Object @{ label = "vm"; expression = {$using:comp} }, 
            path,
            VhdType, 
            VhdFormat, 
            @{label = "file(gb)"; expression = {($_.FileSize / 1GB) -as [int]} }, 
            @{label = "size(gb)"; expression = {($_.Size / 1GB) -as [int]} }
        }
        catch
        {
            Write-Host some error
        }
    }
}
  

Комментарии:

1. Я изменил на ...get-vm –VMName $using:comp | Select-Object VMId | Get-VHD -ErrorAction Stop | Select-Object @{ label... , и это работает. Спасибо!

2. Ах да, не заметил, что командлет тоже использовался. Вы также могли бы рассмотреть возможность выполнения $ErrorActionPreference = 'Stop' в начале сценария принудительных ошибок завершения для всех командлетов.

3. Я изменил Write-Host $_.Exception.Message в catch, и ошибка гласит The operation failed because the file was not found. , как я могу увидеть, какой файл?

4. Попробуйте сделать просто Write-Host $_ , чтобы увидеть, содержит ли полная запись об ошибке необходимую вам информацию.

5. нет, ничего другого, кроме The operation failed because the file was not found

Ответ №2:

Добавьте -ErrorAction Stop в Get-Vm , чтобы сделать его завершающим.

Вы можете прочитать больше о завершении незавершающего командлета в powershell здесь :

https://devblogs.microsoft.com/scripting/understanding-non-terminating-errors-in-powershell/

https://devblogs.microsoft.com/powershell/erroraction-and-errorvariable/