Проблема Powershell попробуйте и поймать - PullRequest
2 голосов
/ 01 июля 2019

Новое в PowerShell.Я вызываю API с помощью Power shell и сохраняю ответ в файле примера.

Работает нормально.Задача - это то, что я должен делать, если API испытывает какие-то проблемы (не работает и т. Д.), Не отвечает и т. Д. В этом случае я не хочу сохранять свой файл.Теперь он сохраняет файл с ошибкой.

Пробовал много пробовать и ловить, но не смог найти коды ошибок.

try
{


    $uri = "https://my url"
    $response = Invoke-RestMethod -Uri $uri
    $response.Save("C:\Users\rtf\Desktop\Details\samplet.xml")
    Write-Host "done"

} 
catch 
{

    # Dig into the exception to get the Response details.
    # Note that value__ is not a typo.
    Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ 
    Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
}

Выше код основан на этом стеке потока ответ .

1 Ответ

0 голосов
/ 01 июля 2019

Как указано в комментарии выше, вы должны определить ErrorPreference командлета Invoke-RestMethod. Это можно сделать либо параметром -ErrorAction (и установив его значение на Stop), либо переменной $ErrorPreference global.

С devblog :

На самом деле это означает, что если произойдет ошибка и Windows PowerShell сможет восстановиться после нее, она попытается выполнить следующую команду. Но он сообщит вам об ошибке, отобразив ее на консоли.

Так что для non-terminating ошибок вы должны определить, должен ли PowerShell остановить выполнение или просто продолжить выполнение.

Ниже кода устанавливается ErrorAction на Stop, поэтому будет обнаружена не прекращающаяся ошибка. Когда PowerShell обнаружит завершающую ошибку или что такое завершающая ошибка? Например, если вам не хватает памяти или PowerShell обнаруживает синтаксическую ошибку.

Поскольку документ Invoke-RestMethod документ гласит:

Windows PowerShell форматирует ответ в соответствии с типом данных. Для канала RSS или ATOM Windows PowerShell возвращает XML-элементы Item или Entry. Для JavaScript Object Notation (JSON) или XML Windows PowerShell преобразует (или десериализует) содержимое в объекты.

$response может содержать XML или JSON (или что-то другое), которые PowerShell пытается проанализировать.

Обновление 1: на основании нижеследующего комментария с сообщением об ошибке $response содержит XML, который преобразует PowerShell. В конце $response должно иметь свойство Error status в случае ошибки. С помощью Get-Member мы можем проверить, содержит ли $response свойство error, и выполнить дополнительную обработку ошибок.

try
{
     $uri = "https://my url"
     $response = Invoke-RestMethod -Uri $uri -ErrorAction Stop
     # Was a valid response object returned? 
     if ($null -ne $response) {

        # Has the object an REST-API specific Error status property?
        if(Get-Member -inputobject $response-name "UnknownResult" -Membertype Properties){
            Write-Error "response contains error $response"
             Write-Error "$($response.UnknownResult.Error.Message)" 
        }
        else {
            # No error detected, save the response
            $response.Save("C:\Users\rtf\Desktop\Details\samplet.xml")
            Write-Host "done" -ForegroundColor Magenta
        }
     }
}
catch
{
     $_.Exception
}

Вы можете поиграть с XML-кодом по этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...