Azure devops 如何在Azure构建管道中使用Powershell修改流程变量

Azure devops 如何在Azure构建管道中使用Powershell修改流程变量,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,我有一个测试步骤在我的管道中。我希望该步骤在计划运行时运行所有测试,但仅在手动或选通运行时运行受影响的测试。 为此,我将runOnlyImpactedTests值链接到一个流程变量,并尝试使用Powershell修改其值 我可以读取变量,但无法更改它。我有两个问题,但首先,这里是PS脚本 Write-Host "a ${Env:Parameters_runOnlyImpactedTests} b" Write-Host "##vso[task.setvariable variable=Param

我有一个测试步骤在我的管道中。我希望该步骤在计划运行时运行所有测试,但仅在手动或选通运行时运行受影响的测试。 为此,我将
runOnlyImpactedTests
值链接到一个流程变量,并尝试使用Powershell修改其值

我可以读取变量,但无法更改它。我有两个问题,但首先,这里是PS脚本

Write-Host "a ${Env:Parameters_runOnlyImpactedTests} b"
Write-Host "##vso[task.setvariable variable=Parameters.runOnlyImpactedTests]True"
Write-Host "c ${Env:Parameters_runOnlyImpactedTests} d"

#Build Reasons:
#https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/ff736208(v=vs.120)

if($Env:BUILD_REASON -eq "Schedule"){
    Write-Host "Is Scheduled. Should run all tests"
    Write-Host "##vso[task.setvariable variable=Parameters.runOnlyImpactedTests]False"
}

#gci env:
#gci variable:

# Use the environment variables input below to pass secret variables to this script.
及其产出

2019-11-04T18:32:37.5783531Z Génération du script.
2019-11-04T18:32:37.6377454Z a False b
2019-11-04T18:32:37.6408504Z ##[command]"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'D:\BuildsVnexAgents\Agt1-3348\_work\_temp\2fca26a4-3bb5-4d51-9d90-a29aa4c755b5.ps1'"
2019-11-04T18:32:37.9377454Z c False d
2019-11-04T18:32:37.9846229Z 
我还尝试使用
Parameters\u runOnlyImpactedTests
Env:Parameters\u runOnlyImpactedTests
设置变量,但它们都给出相同的结果

我现在有两个问题:

  • 为什么变量不取这个值
  • 如果不能这样做,有没有其他方法来实现我的目标

  • 这对你有用吗

    ${Env:Parameters_runOnlyImpactedTests} = $false
    Write-Host "a ${Env:Parameters_runOnlyImpactedTests} b"
    ${Env:Parameters_runOnlyImpactedTests} = $true
    Write-Host "c ${Env:Parameters_runOnlyImpactedTests} d"
    
    输出:

    2019-11-05T09:56:39.8505031Z a False b
    2019-11-05T09:56:39.8513437Z c True d
    

    ${Env:Parameters\u runOnlyImpactedTests}
    在其他管道任务中也应该可用。

    根据Fairoz的评论进行测试,当脚本中使用
    “##vso[task.setvariable=Parameters.runOnlyImpactedTests]true”
    时,该变量的值的输出在同一任务中不会改变。修改后的值将在后续任务中正常输出

    steps:  
        - powershell: 
            Write-Host " a $(Parameters_runOnlyImpactedTests) a "
            "##vso[task.setvariable variable=Parameters_runOnlyImpactedTests]True"
            Write-Host " b $(Parameters_runOnlyImpactedTests) b "
        - powershell: Write-Host "c $(Parameters_runOnlyImpactedTests) c "
    

    下一步您可能需要尝试第3行。根据文档,该值在任务完成后初始化。我也在为这个信息而努力。我发现它是有效的,但不是一直有效。我尝试在脚本中使用完全相同的行,顶部有注释,但失败了,然后没有注释,成功了。我必须使用几乎相同的脚本,唯一的区别是在YAML中,不工作的脚本在write host命令之前有一些空格。但至少请把它写下来作为一个答案,这样我就可以奖励你你的分数。我尝试过这个,虽然有些时候在工作中(值在下一个任务中更改),但其他时候没有。我还尝试更改ProcParam_runOnlyImpactedTests,得到了相同的结果。在所有情况下,无论显示的值是否已修改,测试任务都不会使用该值。也许我应该取消这个问题?很难给你答案。就我的经验而言,我的例子很有效。您使用的是
    Azure DevOps服务
    还是
    Azure DevOps服务器
    ?是否使用自托管代理?我想我们可以回答‘如果不能这样做,在实现我的目标时还有其他选择吗?’。