PowerShell 中的循环问题?
Loop Issue In PowerShell?
我正在尝试从各种 Azure API 端点提取一些数据,但没有得到我需要的确切结果,我确定是因为我尝试利用循环的方式。我正确地提取了所有项目名称,但没有正确点击“获取管道运行”以尝试提取 ID 和个人时间以及 AzDo 中每个管道的最后一次运行的 ID。 $id 和 times 都是数组,因为它捕获多次运行,因此“[0]”获取索引中的第一个。我能做些什么来清理它并使其更有效率......并且真正起作用。在此状态下,它只会成功生成项目列表。
$personalToken = "****************************"
#Write-Host "Initialize authentication context" -ForegroundColor Yellow
$token = [System.Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$header = @{authorization = "Basic $token" }
# Get projects
$projecturl = "https://dev.azure.com/*******/_apis/projects?api-version=6.0"
$projects = Invoke-RestMethod -Uri $projecturl -Method Get -ContentType "application/json" -Headers $header
# Get pipeline runs
$runurl = "https://dev.azure.com/*********/$projectname/_apis/pipelines/$id/runs?api-version=6.0-preview.1"
$runs = Invoke-RestMethod -Uri $runurl -Method Get -ContentType "application/json" -Headers $header
foreach($project in $projects.value) {
Write-Output $project.name
$projectname = $project.name
foreach($run in $runs.value.pipeline.id) {
Write-Output $runs.value.pipeline.id
$lastrundate = $runs.value.pipeline.id
$id = $runs.value.pipeline.id[0]
# Builds API call
$url = "https://dev.azure.com/********/$projectname/_apis/pipelines?api-version=6.0-preview.1"
$output = Invoke-RestMethod -Uri $url -Method Get -ContentType "application/json" -Headers $header
$output.value | Sort-Object id -Descending | ForEach-Object {
Write-Host $_.name - $_.folder - $_.id - $_._links.web
$obj = New-Object System.Object
$obj | Add-Member -type NoteProperty -name LastRunDate -Value $lastrundate
$obj | Add-Member -type NoteProperty -name ProjectName -Value $projectname
$obj | Add-Member -type NoteProperty -name PipelineName -Value $_.name
$obj | Add-Member -type NoteProperty -name PipelineFolder -Value $_.folder
$obj | Add-Member -type NoteProperty -name PipelineURL -Value $_._links.web
$obj | Add-Member -type NoteProperty -name PipelineID -Value $_.id
$obj | Select-Object LastRunDate, ProjectName, PipelineName , PipelineFolder , PipelineURL , PipelineID | Export-Csv -Append c:\Temp\****.csv
}
}
这一段很奇怪:
foreach($run in $runs.value.pipeline.id) {
Write-Output $runs.value.pipeline.id
$lastrundate = $runs.value.pipeline.id
$id = $runs.value.pipeline.id[0]
在此处检查 运行 定义:https://docs.microsoft.com/en-us/rest/api/azure/devops/pipelines/runs/list?view=azure-devops-rest-6.1#run
你可以使用类似的东西:
foreach($run in $runs.value) {
Write-Output "Run Id" $run.id "Pipeline Id" $run.pipeline.id "Finidh Date" $run.finishedDate
$lastrundate = $run.createdDate
#something here
}
$personalToken = "xx"
#Write-Host "Initialize authentication context" -ForegroundColor Yellow
$token = [System.Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$header = @{authorization = "Basic $token" }
# Get projects
$projecturl = "https://dev.azure.com/xxx/_apis/projects?api-version=6.0"
$projects = Invoke-RestMethod -Uri $projecturl -Method Get -ContentType "application/json" -Headers $header
foreach($project in $projects.value) {
#Write-Output $project.name
$projectname = $project.name
# List pipeline ID via org name and project name
$url = "https://dev.azure.com/xxx/$($projectname)/_apis/pipelines?api-version=6.0-preview.1"
$pipelines = Invoke-RestMethod -Uri $url -Method Get -ContentType "application/json" -Headers $header
foreach($pipeline in $pipelines.value){
Write-Host $pipeline.id
$pipelineId = $pipeline.id
#List run details via pipeline id and get the latest run info
$runrul = "https://dev.azure.com/xxx/$($projectname)/_apis/pipelines/$($pipelineId)/runs?api-version=6.0-preview.1"
$runResult = Invoke-RestMethod -Uri $runrul -Method Get -ContentType "application/json" -Headers $header
$output = $runResult.value[0]
$runID = $output.id
$lastrundate = $output.createdDate
$pipelineName = $output.pipeline.name
$pipelineFolder = $output.pipeline.folder
$pipelineURL = $output.pipeline.url
$pipelineId
#Write-Host $runID $lastrundate $pipelineName $pipelineFolder $pipelineURL $pipelineId
$output = New-Object -TypeName PSObject -Property @{
runID = $output.id
lastrundate = $output.createdDate
pipelineName = $output.pipeline.name
pipelineFolder = $output.pipeline.folder
pipelineURL = $output.pipeline.url
pipelineId = $pipelineId
} | Select-Object runID, lastrundate,pipelineName,pipelineFolder,pipelineURL,pipelineId
$output | Export-Csv E:\test\testx.csv -Append -Force
}
}
测试结果:
我正在尝试从各种 Azure API 端点提取一些数据,但没有得到我需要的确切结果,我确定是因为我尝试利用循环的方式。我正确地提取了所有项目名称,但没有正确点击“获取管道运行”以尝试提取 ID 和个人时间以及 AzDo 中每个管道的最后一次运行的 ID。 $id 和 times 都是数组,因为它捕获多次运行,因此“[0]”获取索引中的第一个。我能做些什么来清理它并使其更有效率......并且真正起作用。在此状态下,它只会成功生成项目列表。
$personalToken = "****************************"
#Write-Host "Initialize authentication context" -ForegroundColor Yellow
$token = [System.Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$header = @{authorization = "Basic $token" }
# Get projects
$projecturl = "https://dev.azure.com/*******/_apis/projects?api-version=6.0"
$projects = Invoke-RestMethod -Uri $projecturl -Method Get -ContentType "application/json" -Headers $header
# Get pipeline runs
$runurl = "https://dev.azure.com/*********/$projectname/_apis/pipelines/$id/runs?api-version=6.0-preview.1"
$runs = Invoke-RestMethod -Uri $runurl -Method Get -ContentType "application/json" -Headers $header
foreach($project in $projects.value) {
Write-Output $project.name
$projectname = $project.name
foreach($run in $runs.value.pipeline.id) {
Write-Output $runs.value.pipeline.id
$lastrundate = $runs.value.pipeline.id
$id = $runs.value.pipeline.id[0]
# Builds API call
$url = "https://dev.azure.com/********/$projectname/_apis/pipelines?api-version=6.0-preview.1"
$output = Invoke-RestMethod -Uri $url -Method Get -ContentType "application/json" -Headers $header
$output.value | Sort-Object id -Descending | ForEach-Object {
Write-Host $_.name - $_.folder - $_.id - $_._links.web
$obj = New-Object System.Object
$obj | Add-Member -type NoteProperty -name LastRunDate -Value $lastrundate
$obj | Add-Member -type NoteProperty -name ProjectName -Value $projectname
$obj | Add-Member -type NoteProperty -name PipelineName -Value $_.name
$obj | Add-Member -type NoteProperty -name PipelineFolder -Value $_.folder
$obj | Add-Member -type NoteProperty -name PipelineURL -Value $_._links.web
$obj | Add-Member -type NoteProperty -name PipelineID -Value $_.id
$obj | Select-Object LastRunDate, ProjectName, PipelineName , PipelineFolder , PipelineURL , PipelineID | Export-Csv -Append c:\Temp\****.csv
}
}
这一段很奇怪:
foreach($run in $runs.value.pipeline.id) {
Write-Output $runs.value.pipeline.id
$lastrundate = $runs.value.pipeline.id
$id = $runs.value.pipeline.id[0]
在此处检查 运行 定义:https://docs.microsoft.com/en-us/rest/api/azure/devops/pipelines/runs/list?view=azure-devops-rest-6.1#run
你可以使用类似的东西:
foreach($run in $runs.value) {
Write-Output "Run Id" $run.id "Pipeline Id" $run.pipeline.id "Finidh Date" $run.finishedDate
$lastrundate = $run.createdDate
#something here
}
$personalToken = "xx"
#Write-Host "Initialize authentication context" -ForegroundColor Yellow
$token = [System.Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$header = @{authorization = "Basic $token" }
# Get projects
$projecturl = "https://dev.azure.com/xxx/_apis/projects?api-version=6.0"
$projects = Invoke-RestMethod -Uri $projecturl -Method Get -ContentType "application/json" -Headers $header
foreach($project in $projects.value) {
#Write-Output $project.name
$projectname = $project.name
# List pipeline ID via org name and project name
$url = "https://dev.azure.com/xxx/$($projectname)/_apis/pipelines?api-version=6.0-preview.1"
$pipelines = Invoke-RestMethod -Uri $url -Method Get -ContentType "application/json" -Headers $header
foreach($pipeline in $pipelines.value){
Write-Host $pipeline.id
$pipelineId = $pipeline.id
#List run details via pipeline id and get the latest run info
$runrul = "https://dev.azure.com/xxx/$($projectname)/_apis/pipelines/$($pipelineId)/runs?api-version=6.0-preview.1"
$runResult = Invoke-RestMethod -Uri $runrul -Method Get -ContentType "application/json" -Headers $header
$output = $runResult.value[0]
$runID = $output.id
$lastrundate = $output.createdDate
$pipelineName = $output.pipeline.name
$pipelineFolder = $output.pipeline.folder
$pipelineURL = $output.pipeline.url
$pipelineId
#Write-Host $runID $lastrundate $pipelineName $pipelineFolder $pipelineURL $pipelineId
$output = New-Object -TypeName PSObject -Property @{
runID = $output.id
lastrundate = $output.createdDate
pipelineName = $output.pipeline.name
pipelineFolder = $output.pipeline.folder
pipelineURL = $output.pipeline.url
pipelineId = $pipelineId
} | Select-Object runID, lastrundate,pipelineName,pipelineFolder,pipelineURL,pipelineId
$output | Export-Csv E:\test\testx.csv -Append -Force
}
}
测试结果: