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)}
关键修改点说明
- Here-String格式修正:把
@"单独放在一行,JSON内容换行写,结尾的"@也单独放在一行,确保前后没有多余字符或缩进 - 移除
ConvertTo-Json:原脚本中$body已经是合法的JSON字符串,再用ConvertTo-Json会把它转成带转义符的字符串,导致API无法解析
这样修改后,脚本就能正确触发VSTS/TFS的构建了。
内容的提问来源于stack exchange,提问作者Luis Valencia
相关产品推荐
相关产品推荐

