Sib*_*ain 2 powershell azure-devops
我正在尝试使用特定定义中的模板参数获取所有正在运行的构建(正在进行中)+。我正在 Azure DevOps 中使用 Powershell@2 任务来完成此任务,但多个条件未使用Where-Object 运行。下面是代码:
$token = "123"
$organization = "foo"
$project = "abc"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
$ThisBuildDefinitionID = "8430"
[int]$ThisBuildID = "1571327"
$GET_BUILDS_BY_DEFINITION_URL = "https://azure.com/$organization/$project/_apis/build/builds?api-version=6.0&definitions=$ThisBuildDefinitionID"
do
{
$GET_BUILDS_BY_DEFINITION_RESPONSE = ""
try
{
$GET_BUILDS_BY_DEFINITION_RESPONSE = Invoke-RestMethod -Uri $GET_BUILDS_BY_DEFINITION_URL `
-Method GET `
-ContentType "application/json" `
-Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
}
catch
{
continue
}
Write-Host $GET_BUILDS_BY_DEFINITION_RESPONSE.value
[array]$runningBuilds = $GET_BUILDS_BY_DEFINITION_RESPONSE.value | Where-Object {"status" -eq "inProgress" -and "templateParameters.param1" -eq "myparam"}
Write-Host "running builds count: " $runningBuilds.count
if ($runningBuilds.count -gt 0) {
[int]$currentRunningBuild = ($runningBuilds | Sort-Object -Property "Id")[0].Id
}
Write-Host "This Build ID: " $ThisBuildID
Write-Host "Currently Running Build ID: " $currentRunningBuild
Write-Host "Waiting..."
Write-Output ""
Start-Sleep -Seconds 5
}
while($ThisBuildID -ne $currentRunningBuild)
Write-Host "Waiting Complete."
Write-Host "Starting Build: " $ThisBuildID
Start-Sleep -Seconds 5
Run Code Online (Sandbox Code Playgroud)
Where-Object {"status" -eq "inProgress" -and "templateParameters.param1" -eq "myparam"}是我遇到问题的部分,即要满足什么条件才能使其正常运行。
当我仅使用一个条件(如 )时Where-Object "status" -eq "inProgress",它工作正常并让我进行构建,但我还想包含一个模板参数条件
有人可以帮助我做错什么吗?
PS:感谢Visualstudio 开发者社区中Devin Lambert 的脚本。
Where-Object { "status" -eq "inProgress" -and "templateParameters.param1" -eq "myparam" }
您正在相互比较(不同的)字符串文字,而您可能的意思是将属性值与字符串文字进行比较。
您需要自动$_变量来引用脚本块( { ... }) 内的管道输入对象,这允许您访问其属性:
Where-Object {
$_.status -eq "inProgress" -and $_.templateParameters.param1 -eq "myparam"
}
Run Code Online (Sandbox Code Playgroud)
请注意,Where-Object(并且ForEach-Object)也可以支持简化语法,其中您不需要脚本块并且隐含使用$_,但此语法仅限于:
单个条件
非嵌套属性访问。
因此,在您的情况下,不可以使用它。
只有第一个 -eq比较,它对直接 status属性的访问只能用简单的语法表示(如您在问题中所示):
# Equivalent of:
# Where-Object { $_.status -eq 'inProgress' }
# 'status' binds positionally to the -Property parameter.
Where-Object status -eq 'inProgress'
Run Code Online (Sandbox Code Playgroud)
相比之下,嵌套属性访问将不起作用:
# !! Does NOT work as intended.
Where-Object templateParameters.param1 -eq 'myparam'
Run Code Online (Sandbox Code Playgroud)
原因是templateParameters.param1,在位置上绑定到-Property参数的 被整体解释为单个属性的名称。
While chaining multiple simple-syntax Where-Object calls may be worth it for syntactic convenience, in your case you'd have to chain a simple-syntax with a regular-syntax call, in which case you may as well stick with your original, single regular-syntax approach.
| 归档时间: |
|
| 查看次数: |
3588 次 |
| 最近记录: |