簡體   English   中英

Powershell Foreach 循環遍歷 API output 並逐行顯示變量值

[英]Powershell Foreach loop to iterate through API output and display variable values line by line

I am running some Azure DevOps API queries in Postman which successfully return the expected results, a snippet of which is shared below and represents only one of dozens of similar iterative output. 出於說明的目的,讓我們假設下面的 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”值逐行輸出到 output 文件中。

所需的 output 應如下所示:

        "id": 66,
        "buildNumber": "20210401.7",
        "status": "completed",
        "result": "succeeded",

        "id": 65,
        "buildNumber": "20210331.5",
        "status": "completed",
        "result": "failed",

        "id": 64,
        "buildNumber": "20210331.4",
        "status": "completed",
        "result": "succeeded",

任何關於如何實現這一目標的建議或想法將不勝感激。

[[我當前的 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) { Write-Host " " Write-Host "最新版本 = $LatestVersion" "|" “構建結果 = $BuildResult”寫入主機“”
}

[[以上腳本的輸出]]

在此處輸入圖像描述

從上圖可以看出,通過檢索最后的構建記錄,我得到了我的 Powershell 腳本返回的上述 output,非常棒。

然而,我不僅僅追求最后的構建記錄。 我希望逐行列出所有構建記錄。 因此,理想情況下,對我現有腳本的任何改進都將是最合適的,因為在我看來,它只需要稍作調整。

省略 Select-Object 將返回所有預期數據,但采用以下格式,該格式未以我喜歡的單行格式顯示。

在此處輸入圖像描述

您正在獲取構建信息,所以我假設您使用的是 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-開發運維

可以使用 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
}
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM