2017-02-07 14 views
1

При попытке обновить существующий элемент VSTS работы с использованием Invoke-RestMethod, я продолжаю получатьЧто такое правильный синтаксис Invoke-RestMethod обновить VSTS WorkItem в Powershell - построение строки JSON, содержащий пути для Windows

Вы должны передать действительный файл патча в теле запроса.

Вот что я передаю

$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"}]" 

Любая помощь будет принята с благодарностью!

ответ

2

JSON использует \ как экранирующего символа; например, \t - это escape-последовательность для символа TAB (код кодировки Unicode 0x9).

Поэтому для того, чтобы использовать буквальным\ - например, в путях Windows, - вы должны бежать как \\.

Вы могли вручную избежать всех значений переменных, которые вы используете, чтобы синтезировать вашу строку JSON вдоль линий $caseIterationPath -replace '\\', '\\' (так в оригинале).

Однако, это может быть легче построить структуры данных регулярного 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" 
    } 
] 
+1

Спасибо! Это было большой помощью. –

0

Думаю, вам может понадобиться избежать ваших косых черт в значении для AreaPath. Из примера на documentation они используют двойную обратную косую черту.

{ 
    "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 <[email protected]>", 
    "System.ChangedDate": "2014-12-29T20:49:23.933Z", 
    "System.ChangedBy": "Jamal Hartnett <[email protected]>", 
    "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" 
} 
+0

Спасибо! Это было большой помощью. –