2

尝试使用 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"}]"

任何帮助将不胜感激!

4

2 回答 2

7

JSON用作\转义字符例如,\t是 TAB 字符(Unicode 代码点0x9)的转义序列。

因此,为了使用文字 \- 例如在 Windows 路径中 - 您必须将其转义为\\.

可以手动转义所有用于沿$caseIterationPath -replace '\\', '\\'(sic)行合成 JSON 字符串的变量值。

但是,首先构造常规 PowerShell 数据结构,然后在转换时进行所需的转义可能会容易。ConvertTo-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"
    }
]
于 2017-02-08T02:25:15.373 回答
0

我认为您可能需要在 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"
}
于 2017-02-08T01:59:20.310 回答