在Powershell中更新VSTS工作项的正确调用RestMethod语法是什么-构造包含Windows路径的JSON字符串

在Powershell中更新VSTS工作项的正确调用RestMethod语法是什么-构造包含Windows路径的JSON字符串,powershell,azure-devops-rest-api,Powershell,Azure Devops Rest Api,当尝试使用Invoke RestMethod更新现有的VSTS工作项时,我会不断得到 您必须在请求正文中传递有效的修补程序文档 这就是我要传递的 $Body = '[{ "op": "test", "path": "/rev", "value": 1},{ "op": "add", "path": "/fields/System.IterationPath", "value":"' + $caseIterationPath + '"},{ "op": "add", "path": "/field

当尝试使用Invoke RestMethod更新现有的VSTS工作项时,我会不断得到

您必须在请求正文中传递有效的修补程序文档

这就是我要传递的

$Body = '[{ "op": "test", "path": "/rev", "value": 1},{ "op": "add", "path": "/fields/System.IterationPath", "value":"' + $caseIterationPath + '"},{ "op": "add", "path": "/fields/System.AreaPath", "value":"' + $caseAreaPath + '"}]'

Invoke-RestMethod -Uri "$rootUri/_apis/wit/workitems/$($case.id)?$apiVersion" -Method PATCH -ContentType application/json-patch+json -Headers @{Authorization= $authorization} -Body $Body
身体膨胀到

"[{ "op": "test", "path": "/rev", "value": 1},{ "op": "add", "path": "/fields/System.IterationPath", "value":"Foo\Bar 2016.4\2016.4.02"},{ "op": "add", "path": "/fields/System.AreaPath", "value":"Foo\Apps\Bar Stool\Eating"}]"

任何帮助都将不胜感激

我认为您可能需要避开AreaPath值中的后斜杠。根据上的示例,它们使用了双反斜杠

    {
  "id": 299,
  "rev": 2,
  "fields": {
    "System.AreaPath": "Fabrikam-Fiber-Git\\Website",
    "System.TeamProject": "Fabrikam-Fiber-Git",
    "System.IterationPath": "Fabrikam-Fiber-Git",
    "System.WorkItemType": "Task",
    "System.State": "To Do",
    "System.Reason": "New task",
    "System.CreatedDate": "2014-12-29T20:49:21.617Z",
    "System.CreatedBy": "Jamal Hartnett <fabrikamfiber4@hotmail.com>",
    "System.ChangedDate": "2014-12-29T20:49:23.933Z",
    "System.ChangedBy": "Jamal Hartnett <fabrikamfiber4@hotmail.com>",
    "System.Title": "JavaScript implementation for Microsoft Account",
    "Microsoft.VSTS.Scheduling.RemainingWork": 4,
    "System.Description": "Follow the code samples from MSDN",
    "System.History": "Moving to the right area path"
  },
  "relations": [
    {
      "rel": "System.LinkTypes.Hierarchy-Reverse",
      "url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/297",
      "attributes": {
        "isLocked": false,
        "comment": "decomposition of work"
      }
    }
  ],
  "_links": {
    "self": {
      "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299"
    },
    "workItemUpdates": {
      "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299/updates"
    },
    "workItemRevisions": {
      "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299/revisions"
    },
    "workItemHistory": {
      "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299/history"
    },
    "html": {
      "href": "https://fabrikam-fiber-inc.visualstudio.com/web/wi.aspx?pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=299"
    },
    "workItemType": {
      "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c/_apis/wit/workItemTypes/Task"
    },
    "fields": {
      "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/fields"
    }
  },
  "url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299"
}
{
“id”:299,
“rev”:2,
“字段”:{
“System.AreaPath”:“Fabrikam光纤Git\\Website”,
“System.TeamProject”:“Fabrikam光纤Git”,
“System.IterationPath”:“Fabrikam光纤Git”,
“System.WorkItemType”:“任务”,
“系统状态”:“待办事项”,
“系统原因”:“新任务”,
“系统创建日期”:“2014-12-29T20:49:21.617Z”,
“System.CreatedBy”:“Jamal Hartnett”,
“系统变更日期”:“2014-12-29T20:49:23.933Z”,
“System.ChangedBy”:“Jamal Hartnett”,
“System.Title”:“Microsoft帐户的JavaScript实现”,
“Microsoft.VSTS.Scheduling.RemainingWork”:4,
“System.Description”:“遵循MSDN中的代码示例”,
“系统历史记录”:“移动到正确的区域路径”
},
“关系”:[
{
“rel”:“System.LinkTypes.Hierarchy Reverse”,
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/297",
“属性”:{
“isLocked”:false,
“评论”:“工作分解”
}
}
],
“_链接”:{
“自我”:{
“href”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299"
},
“工作项更新”:{
“href”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299/updates"
},
“工作项修订”:{
“href”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299/revisions"
},
“工作项目历史”:{
“href”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299/history"
},
“html”:{
“href”:”https://fabrikam-fiber-inc.visualstudio.com/web/wi.aspx?pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=299“
},
“工作项类型”:{
“href”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c/_apis/wit/workItemTypes/Task"
},
“字段”:{
“href”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/fields"
}
},
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/299"
}
使用
\
作为转义字符
;例如,
\t
是制表符的转义序列(Unicode代码点
0x9

因此,要使用文本
\
(例如在Windows路径中),必须将其转义为
\

您可以手动转义用于合成JSON字符串的所有变量值
$caseIterationPath-替换“\\\”,“\\”
(原文如此)

但是,首先构建常规PowerShell数据结构可能会更容易,然后让
转换为Json
在转换时进行必要的转义

在本案中:

# Sample values.
$caseIterationPath = 'c:\path\to\iteration'
$caseAreaPath = 'c:\path\to\area'

# Construct an array of hashtables to be converted to JSON later.
$Body = @(

  @{
      op = 'test'
      path = '/rev'
      value = 1
  }

  @{
      op = 'add'
      path = '/fields/System.IterationPath'
      value = $caseIterationPath
  }

  @{
      op = 'add'
      path = '/fields/System.AreaPath'
      value = $caseAreaPath
  }

)

# Convert the array to a string containing JSON.
# ConvertTo-Json will perform any required escaping.
$jsonBody = ConvertTo-Json $Body

# Invoke the REST method.
Invoke-RestMethod -Uri "$rootUri/_apis/wit/workitems/$($case.id)?$apiVersion" `
  -Method PATCH -ContentType application/json-patch+json `
  -Headers @{Authorization= $authorization} `
  -Body $jsonBody
在上面的代码中,
$jsonBody
最终包含以下内容-请注意
\
实例如何作为
\
正确转义:

[
    {
        "path":  "/rev",
        "op":  "test",
        "value":  1
    },
    {
        "path":  "/fields/System.IterationPath",
        "op":  "add",
        "value":  "c:\\path\\to\\iteration"
    },
    {
        "path":  "/fields/System.AreaPath",
        "op":  "add",
        "value":  "c:\\path\\to\\area"
    }
]

非常感谢。这是一个很大的帮助。