Я пытаюсь экспортировать конвейер сборки из Azure DevOps, используя предоставленный ими REST API. Я могу загрузить файл json, используя приведенный ниже пример URL-адреса, который содержит определение сборки в формате json.
https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.0-preview.7
Но когда я пытаюсь загрузить с помощью powershell, я получаю файл HTML с тегами html. Но мне нужен только файл Json, который будет фактическим файлом определения сборки для загрузки. Ниже приведен мой код powershell. Я также пытался использовать -ContentType "application/json", но это не помогло.
$strURL = "https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.0-preview.7"
$filePath = "C:\Pipeline_export"
$fileName=$filePath+"\build.json"
Invoke-RestMethod -Method Get -Uri $strURL -OutFile $fileName
Что возвращает Invoke-RestMethod -Method Get -Uri $strURL?





html, вероятно, является страницей с ошибкой, говорящей о том, что вы не авторизовались правильно.
Я использую следующий код для запросов rest-api:
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "",$connectionToken)))
$result = Invoke-RestMethod -Uri $finalUrl -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$finalUrl — адрес ресурса, $connectionToken — мой PersonalAccessToken
Следует добавить, как сгенерировать токен. Лично я могу использовать credential с $cred = Get-Credential, затем экспортировать его с export-clixml и импортировать с import-clixml, когда мне это нужно, но есть много способов генерировать токены/учетные данные для API.
Согласно вашему коду, вы можете потерять авторизованный токен в своем коде. Чтобы не работало использование -ContentType "application/json".
С другой стороны, мы также можем использовать другой способ авторизации кода: просто включите Разрешить скриптам доступ к токену OAuth, и скрипт сможет получить доступ к токену OAuth через переменную System.AccessToken.
Вот полный код, который может правильно получить файл Json, который был изменен на основе вашего кода (с System.AccessToken, а не PAT):
$strURL = "https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionid}?api-version=5.0-preview.7"
$filePath = "D:\"
$fileName=$filePath+"\build.json"
$pipeline =Invoke-RestMethod -Uri $strURL -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Method GET -OutFile $fileName
Перед загрузкой файла Json локально вы можете использовать
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
чтобы проверить, соответствует ли вывод в журналах сценариев PowerShell тому, что вам нужно.
Что содержит HTML? как вы разрешаете против ADO?