在 Powershell 中更新 VSTS WorkItem 的正确 Invoke-RestMethod 语法是什么 - 构造包含 Windows 路径的 JSON 字符串

Dav*_*ams 2 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": "/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
Run Code Online (Sandbox Code Playgroud)

身体扩展到

"[{ "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"}]"
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

mkl*_*nt0 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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,$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"
    }
]
Run Code Online (Sandbox Code Playgroud)