我正在尝试使用以下方法更新变量组
PUT https://dev.azure.com/{organization}/_apis/distributedtask/variablegroups/{groupId}?api-version=7.2-preview.2
但是它在 powershell 中对我不起作用,有人可以帮我解决这个问题吗
脚本
# Parameters
$organization = "nprod"
$project = "APM"
$pat = "shgksdghiddsfgdertwetrweghdhfgkhsd" # Your PAT token
$variableGroupName = "Test-Variable-group"
$outputValue = "DaaS"
# Headers for API requests
$headers = @{
"Content-Type" = "application/json"
"Authorization" = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)"))
}
# Get the list of variable groups to find the ID
$uri = "https://dev.azure.com/$organization/$project/_apis/distributedtask/variablegroups?api-version=6.0-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers
$variableGroup = $response.value | Where-Object { $_.name -eq $variableGroupName }
if ($null -eq $variableGroup) {
Write-Error "Variable group '$variableGroupName' not found."
exit 1
}
$variableGroupId = $variableGroup.id
# Construct the body for the update
# First, get the existing variables to avoid overwriting the
$existingVariables = @{}
$variableGroup.variables | ForEach-Object {
if ($_.Key -ne $null -and $_.Value -ne $null) {
$existingVariables[$_.Key] = $_.Value
} else {
Write-Warning "Skipping variable with null key or value."
}
}
# Add or update the specific variable
$existingVariables["stoppedCjobs"] = @{
value = $outputValue
}
$body = @{
id = $variableGroupId
name = $variableGroupName
type = "Vsts"
variables = $existingVariables
} | ConvertTo-Json -Depth 10
# Update the variable group
#PUT https://dev.azure.com/{organization}/_apis/distributedtask/variablegroups/{groupId}?api-version=7.2-preview.2
$uri = "https://dev.azure.com/$organization/$project/_apis/distributedtask/variablegroups/$variableGroupId"+"?api-version=7.2-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Put -Headers $headers -Body $body
if ($response -ne $null) {
Write-Output "Variable group updated successfully."
} else {
Write-Error "Failed to update the variable group."
}
并出现类似错误
WARNING: Skipping variable with null key or value.
Invoke-RestMethod : {"$id":"1","innerException":null,"message":"Project information name is not valid for variable group.","typeName":"System.ArgumentException,
mscorlib","typeKey":"ArgumentException","errorCode":0,"eventId":0}
At line:44 char:13
+ $response = Invoke-RestMethod -Uri $uri -Method Put -Headers $headers ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
想解决这个问题
要正确迭代变量,您需要使用
PSObject.Properties
。
此外,要更新变量,您必须在 PUT 调用的主体中包含
variableGroupProjectReferences
属性。
参考这个:
# Parameters
$organization = "nprod"
$project = "APM"
$pat = "shgksdghiddsfgdertwetrweghdhfgkhsd" # Your PAT token
$variableGroupName = "Test-Variable-group"
$outputValue = "DaaS"
# Headers for API requests
$headers = @{
"Content-Type" = "application/json"
"Authorization" = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)"))
}
# Get the list of variable groups to find the ID
$uri = "https://dev.azure.com/$organization/$project/_apis/distributedtask/variablegroups?api-version=6.0-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers
$variableGroup = $response.value | Where-Object { $_.name -eq $variableGroupName }
if ($null -eq $variableGroup) {
Write-Error "Variable group '$variableGroupName' not found."
exit 1
}
$variableGroupId = $variableGroup.id
# Construct the body for the update
# First, get the existing variables to avoid overwriting the
$existingVariables = @{}
$variableGroup.variables.PSObject.Properties | ForEach-Object {
if ($_.Name -ne $null -and $_.Value -ne $null) {
$existingVariables[$_.Name] = $_.Value
} else {
Write-Warning "Skipping variable with null key or value."
}
}
# Add or update the specific variable
$existingVariables["stoppedCjobs"] = @{
value = $outputValue
}
$body = @{
id = $variableGroupId
name = $variableGroupName
variables = $existingVariables
variableGroupProjectReferences = @(
@{
projectReference = @{
name = $project
}
name = $variableGroup.name
}
)
} | ConvertTo-Json -Depth 10
# Update the variable group
#PUT https://dev.azure.com/{organization}/_apis/distributedtask/variablegroups/{groupId}?api-version=7.2-preview.2
$uri = "https://dev.azure.com/$organization/_apis/distributedtask/variablegroups/$variableGroupId"+"?api-version=7.2-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Put -Headers $headers -Body $body
if ($response -ne $null) {
Write-Output "Variable group updated successfully."
} else {
Write-Error "Failed to update the variable group."
}