我有以下变量:
名称:TestVar
值:xxx
以及以下脚本:
$testVar=$env:TestVar.ToLower()
if($testVar-eq 'xxx'){
$testVar= 'updated'
Write-Host "##vso[task.setvariable variable=TestVar;]$testVar"
运行后的值仍为xxx
,而不是updated
。
答案 0 :(得分:1)
"##vso[task.setvariable variable=TestVar;]$testVar"
的语法是仅针对正在运行的构建而不是将来的构建更新变量值。
如果要更新构建变量列表,则需要使用Rest API更新构建定义。
执行此操作的PowerShell脚本示例:
$head = @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
$url="$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/definitions/$(System.DefinitionId)?api-version=5.0"
$build = Invoke-RestMethod -Uri $url -Method Get -Headers $head -ContentType application/json
$build.variables.TestVar.value = "updated"
$json = $build | ConvertTo-Json -Depth 10
Invoke-RestMethod -Uri $url -Method Put -Headers $head -Body $json -ContentType application/json
答案 1 :(得分:0)
如果您想使更改永久生效,则需要通过api进行以下操作,否则仅在运行期间进行
$projecturi = "$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"
$project = "$env:SYSTEM_TEAMPROJECT"
$accessToken = $env:SYSTEM_ACCESSTOKEN
$buildID = "$env:BUILD_BUILDID"
$headers = @{ "Authorization" = "Bearer $accessToken" }
$buildurl= $projecturi + $project + "/_apis/build/builds/" + $buildID + "?api-version=2.0"
Write-Host $buildurl
$getbuild = Invoke-RestMethod -Uri $buildurl -headers $headers -Method Get |select definition
Write-Host $getbuild
$definitionid = $getbuild.definition.id
Write-Host $definitionid
$defurl = $projecturi + $project + "/_apis/build/definitions/" + $definitionid + "?api-version=2.0"
$definition = (Invoke-WebRequest $defurl -Headers $headers -Method GET -ContentType "application/json" -UseBasicParsing).Content | ConvertFrom-Json
$definition.variables.testvar.value = "Updated"
$json = @($definition) | ConvertTo-Json -Depth 100
Try{
$result = (Invoke-WebRequest $defurl -Method "Put" -Headers $headers -ContentType "application/json" -Body $json -UseBasicParsing).Content | ConvertFrom-Json
}
Catch{
$errorMessage = $_.Exception.Message
$errorDetail = $_
$message = @"
$errorMessage
$errorDetail
"@
Write-Error $message -ErrorAction Continue
return 0
}