#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/