Where-Object 多个条件不起作用

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 的脚本。

mkl*_*nt0 6

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.