微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Powershell Foreach 循环遍历 API 输出并逐行显示变量值

如何解决Powershell Foreach 循环遍历 API 输出并逐行显示变量值

我在 Postman 中运行了一些 Azure DevOps API 查询,这些查询成功返回了预期的结果,下面分享了其中的一个片段,它仅代表了几十个类似迭代输出中的一个。出于此说明的目的,让我们假设以下 Id 值为 66 的代码段只是 100 中的一个

        "id": 66,"buildNumber": "20210401.7","status": "completed","result": "succeeded","queueTime": "2021-04-01T16:50:04.9218848Z","startTime": "2021-04-01T16:50:15.3583291Z","finishTime": "2021-04-01T16:50:53.7221605Z",

我现在希望使用 Powershell foreach 循环迭代解析 100 多条记录,将“id”、“buildNumber”、“status”和“result”值逐行输出输出文件中。

所需的输出应如下所示:

        "id": 66,"id": 65,"buildNumber": "20210331.5","result": "Failed","id": 64,"buildNumber": "20210331.4",

对于如何实现这一目标的任何建议或想法将不胜感激。

[[我当前编辑了个人变量的 POWERSHELL 脚本]]

清除主机 $connectionToken="[MY-PAT]" $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

$url = 'https://dev.azure.com/[MY-AZURE-ORG]/[MY-TEAM-PROJECT]/_apis/build/builds?api-version=6.0'

$PackageInfo = (Invoke-RestMethod -Uri $url -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})

$LatestVersion= $PackageInfo.value.buildnumber |选择对象 -first 1

$buildresult= $PackageInfo.value.result |选择对象 -first 1

foreach ($PackageInfo 中的 $item) { 写主机 " " 写主机“最新版本 = $LatestVersion”“|” “构建结果 = $buildresult” 写主机" "
}

[[从上面的脚本输出]]

enter image description here

从上图可以看出,通过检索最后的构建记录,我得到了我的 Powershell 脚本返回的上述输出,这很棒。

然而,我不仅仅追求最后的构建记录。我希望逐行列出所有构建记录。因此,理想情况下,对我现有脚本的任何改进都将是最合适的,因为在我看来它只需要稍作调整。

省略 Select-Object 会返回所有预期数据,但采用以下格式,该格式未以我偏好的各行格式显示

enter image description here

解决方法

您正在获取构建信息,因此我假设您使用的是 Azure DevOps API 下方:

https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=6.0

使用 PowerShell,首先您需要进行身份验证, 您可以使用 OAuth2 身份验证: 参考:https://docs.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops

可以使用 PAT 访问方式,但需要从 UI 手动生成令牌。

function getBearer([string]$TenantID,[string]$ClientID,[string]$ClientSecret)
{
  $TokenEndpoint = {https://login.windows.net/{0}/oauth2/token} -f $TenantID 
  $ARMResource = "https://management.core.windows.net/";

  $Body = @{
          'resource'= $ARMResource
          'client_id' = $ClientID
          'grant_type' = 'client_credentials'
          'client_secret' = $ClientSecret
  }

  $params = @{
      ContentType = 'application/x-www-form-urlencoded'
      Headers = @{'accept'='application/json'}
      Body = $Body
      Method = 'Post'
      URI = $TokenEndpoint
  }

  $token = Invoke-RestMethod @params

  Return "Bearer " + ($token.access_token).ToString()
}


    $header = @{
Authorization = getBearer $TenantId $ClientId $ClientSecret
content-type = 'application/json'
}

$ApiUri = "https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=6.0"

$data = (Invoke-RestMethod  -Uri $ApiUri -Method Get -Headers $header).value

$OutputFile = "<file-name>"

Class BuildObject {
    id [String]
    buildNumber [String]
    status [String]
    result [String]
}
$BuildObj = New-Object $BuildObject


foreach($buildItem in $data) {
    $BuildObj.id = $buildItem.id
    $BuildObj.buildNumber = $buildItem.buildNumber
    $BuildObj.status = $buildItem.status
    $BuildObj.result = $buildItem.result
    
    $BuildObj | OutFile -FilePath $OutputFile -Append
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。