Ошибка Powershell: В строке отсутствует терминатор: «. / В строке отсутствует терминатор: «@

#powershell #api

Вопрос:

При выполнении следующего кода либо в ISE, либо в окне Powershell:

 add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

$username="username"
$password="password"
$credPair = "$($username):$($password)"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credPair))

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("content-type", "application/vnd.emc.apollo-v1 xml")
$headers.Add("Authorization", "Basic $encodedCredentials")

$body = "<runReportParameters>
`n<report>
`n<name>Report Namer</name>
`n</report>
`n<nodes>
`n<node>
`n<id>1a5e8e1a-2c47-449f-a8d4-535549fe1d69</id>
`n</node>
`n</nodes>
`n<timeConstraints type=`"window`">
`n<window>
`n<name>Last Day</name>
`n</window>
`n</timeConstraints>
`n<formatParameters>
`n<formatType>CSV</formatType>
`n</formatParameters>
`n</runReportParameters>"

[string]$response = ""
[string]$pattern = ""
[string]$url = ""

$response = Invoke-WebRequest -UseBasicParsing -Uri 'https://<hostname>:<port>/api/report' -Method 'POST' -Headers $headers -Body $body

$pattern = "<link>(.*)</link>"
$url = [regex]::match($response, $pattern).Groups[1].Value

Invoke-RestMethod "$url" -Method GET -Headers $headers
 

Это не удается со следующими ошибками:

PSMessageDetails : Исключение : System.Net.WebException: Удаленный сервер вернул ошибку: (503) Сервер недоступен. в Microsoft.PowerShell.Команды.WebRequestPSCmdlet.GetResponse(запрос веб-запроса) в Microsoft.PowerShell.Команды.WebRequestPSCmdlet.ProcessRecord() Целевой объект : System.Net.HttpWebRequest CategoryInfo
: Недействительная операция: (System.Сеть.HttpWebRequest:HttpWebRequest) [Метод вызова-восстановления], исключение WebException с полным идентификатором ошибки : исключение WebCmdletWebResponseException,Microsoft.PowerShell.Команды.Детали ошибок команды invokerestmethod : https://:/api/report/result/8179ad5b-e6f8-4964-8e4f-8233df6656a2 InvocationInfo : System.Management.Автоматизация.InvocationInfo ScriptStackTrace : в , : строка 1 Конвейерная литерацияinfo : {} Ошибки : Сообщение
: В строке отсутствует терминатор: «. Ошибка
: В строке отсутствует терминатор: «. Пустословие : Ложные данные : {} Внутреннее исключение : Место назначения : Система.Коллекции.Объектная модель.Сборник 1[System.Management.Automation.PSObject] Invoke(System.Collections.IEnumerable) StackTrace : at System.Management.Automation.Runspaces.PipelineBase.Invoke(IEnumerable input) at Microsoft.PowerShell.Executor.ExecuteCommandHelper(Pipeline tempPipeline, Exceptionamp; exceptionThrown, ExecutionOptions options) HelpLink : Source : System.Management.Automation HResult : -2146233087 Errors : Message : The string is missing the terminator: "@. ErrorRecord : The string is missing the terminator: "@. WasThrownFromThrowStatement : False Data : {} InnerException : TargetSite : System.Collections.ObjectModel.Collection 1[Система.Управление.Автоматизация.PSObject] Вызов(System.Коллекции.IEnumerable) Трассировка стека :
в системе.Руководство.Автоматизация.Пробеги.Трубопроводная база.Вызовите(ввод IEnumerable) в Microsoft.PowerShell.Исполнитель.ExecuteCommandHelper(Временная линия конвейера, Исключение и исключение, параметры выполнения) Телефон доверия : Источник : System.Management.Результат автоматизации : -2146233087 Поток ошибок записи : True PSMessageDetails : Исключение
: Система.Исключение IO.FileNotFoundException: Указанный модуль «PSReadline» не был загружен, поскольку ни в одном каталоге модуля не был найден допустимый файл модуля. targetObject : PSReadline CategoryInfo : Ресурс доступен: (PSReadline:Строка) [Импорт-Модуль], исключение FileNotFoundException Полностью квалифицированный идентификатор ошибки : Modules_ModuleNotFound,Microsoft.PowerShell.Команды.ImportModuleCommand Сообщения об ошибках : InvocationInfo : System.Management.Автоматизация.InvocationInfo ScriptStackTrace : PipelineIterationInfo : {0, 1, 0}

Но если я пару раз напечатаю URL-адрес var$, а затем вызову метод RestMethod, он будет работать нормально:

 PS C:UsersjumpMusic> $url
https://<hostname>:<port>/api/report/result/15d56f05-b317-4cb5-8c36-59dc264ebf6f

PS C:UsersjumpMusic> Invoke-RestMethod "$url" -Method GET -Headers $headers
Server,Proxy,Job Count,GB Modified Sent
server1,proxy1,6,1.057
server2,proxy4,5,0.911
...
 

Есть идеи по настройке переменных в ISE или Powershell??

Спасибо.

Ответ №1:

Наконец-то нашел проблему. Дело в том, что для создания отчета требуется некоторое время, поэтому возникает ошибка. Добавление «сна» решило проблему, как раз перед методом GET:

 Start-Sleep -s 30
Invoke-RestMethod "$url" -Method GET -Headers $headers