You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell调用VSTS REST API时here-string语法错误求助

我一眼就看出问题出在PowerShell Here-String的语法上——这是个很容易踩的坑!

问题根源

PowerShell对Here-String的格式有严格要求:

  • 开头的@"必须是该行的最后一个元素,后面不能跟任何字符(包括空格、JSON内容)
  • 结尾的"@必须是该行的第一个元素,前面不能有任何缩进或空格

你的脚本里,把JSON内容直接跟在@"后面,而且结尾的}"@前面有缩进,这就触发了语法错误。另外还有个小问题:你已经用Here-String定义了JSON格式的$body,后面又用ConvertTo-Json处理它,这会把JSON字符串再转成一次JSON,导致格式混乱。

修正后的脚本

Param( 
    [string]$vstsAccount = "abc", 
    [string]$projectName = "abc", 
    [string]$user = "", 
    [string]$token = "xyz" 
)

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

$verb = "POST"
# 修正Here-String格式:@"单独占一行,结尾"@也单独占一行且无缩进
$body = @"
{
    "definition": {
        "id": 20
    }
}
"@

$uri = "https://$($vstsAccount).visualstudio.com/DefaultCollection/$($projectName)/_apis/build/builds?api-version=4.1"
# 移除多余的ConvertTo-Json,因为$body已经是正确的JSON字符串
$result = Invoke-RestMethod -Uri $uri -Method $verb -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

关键修改点说明

  1. Here-String格式修正:把@"单独放在一行,JSON内容换行写,结尾的"@也单独放在一行,确保前后没有多余字符或缩进
  2. 移除ConvertTo-Json:原脚本中$body已经是合法的JSON字符串,再用ConvertTo-Json会把它转成带转义符的字符串,导致API无法解析

这样修改后,脚本就能正确触发VSTS/TFS的构建了。

内容的提问来源于stack exchange,提问作者Luis Valencia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:41:51