invoke-команда powershell не обрабатывает блок try-cache - PullRequest
2 голосов
/ 19 марта 2019

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

$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

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

некоторую ошибку

в блоке кэша?

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Добавьте -ErrorAction Stop к Get-Vm, чтобы завершить его.

Подробнее о прекращении использования неразрывного командлета в PowerShell можно прочитать здесь:

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

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

1 голос
/ 19 марта 2019

Для запуска блока 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
        }
    }
}
...