2016-05-31 2 views
8

В настоящее время я пытаюсь настроить систему непрерывной интеграции с использованием VSTS и немного запутаться. В рамках процесса выпуска мне нужно обновить определенное значение объекта в файле JSON в зависимости от среды. Единственные инструменты, которые, как мне кажется, у меня в распоряжении, которые могут быть выполнены в среде VSTS, - это PowerShell.Обновление файла JSON с помощью PowerShell

Я провел довольно много исследований и не смог выяснить, как именно это можно сделать. Я нашел этот вопрос и отвечу здесь на Stack Overflow «how do I update json file using powershell», но выполнение сценария, представленного в ответе, существенно изменяет структуру файла JSON и добавляет довольно много того, что выглядит как метаданные PowerShell.

В идеале я хотел бы взять существующий JSON-файл, который будет развернут, и обновить значение свойства connectionString в приведенном ниже примере JSON.

{ 
    "policies": { 
     "Framework.DataContext": { 
     "connectionString": "Server=ServerName;Database=DateBaseName;Integrated Security=sspi;" 
     } 
    } 
} 

Есть ли у кого-нибудь советы о том, как это сделать? До сих пор я пытался запустить следующий скрипт, но он выбрал «Свойство connectionString» не может быть найдено на этом объекте. Убедитесь, что свойство существует и может быть установлено ». исключение. Я проверил, что обход объекта верен и свойство connectionString существует.

$pathToJson = "D:\Path\To\JSON\file.json" 
$a = Get-Content $pathToJson | ConvertFrom-Json 
$a.policies.'Framework.DataContext'.connectionString = "Server=ServerName;Database=DateBaseName;Integrated Security=sspi;" 
$a | ConvertTo-Json | set-content $pathToJson 

Полное содержание file.json являются

{ 
"log": { 
    "level": 0, 
    "file": "c:\\temp\\simport.log", 
    "formats": { 
     "error": null, 
     "start": null, 
     "requestBegin": null, 
     "requestWork": "", 
     "requestError": null, 
     "requestEnd": null, 
     "stop": null 
    }, 
    "eventLog": { 
     "name": "Application" 
    } 
}, 

"diagnostic": { 
    "stackTrace": false 
}, 

"api": { 
    "simport": true 
}, 

"roles": { 
    "0": "Anonymous", 
    "1": "Administrator", 
    "2": "Participant", 
    "3": "Facilitator" 
}, 

"pathType": { 
    "area": 1, 
    "region": 2, 
    "session": 3, 
    "team": 4 
}, 

"scenarios": { 
    "default": { 
     "default": true, 
     "initState": "Init", 
     "rounds": [ 
      { 
       "name": "round1", 
       "displayName": "R1", 
       "beginTime": 1, 
       "endTime": 3 
      }, 
      { 
       "name": "round2", 
       "displayName": "R2", 
       "beginTime": 4, 
       "endTime": 6 
      }, 
      { 
       "name": "round3", 
       "displayName": "R3", 
       "beginTime": 7, 
       "endTime": 9 
      }, 
      { 
       "name": "round4", 
       "displayName": "R4", 
       "beginTime": 10, 
       "endTime": 12 
      } 
     ] 
    } 
}, 

"simportQueries": { 
    "package": "bin/trc.simport3.zip" 
}, 

"customQueries": { 
    "package": "app/config/custom-queries.zip", 
    "parameters": { 
    } 
}, 

"audit": { 
    "Path.Create": true, 
    "Path.Delete": true, 
    "Team.Create": true, 
    "Team.Update": true, 
    "Team.Delete": true, 
    "SimportData.SaveValues": true 
}, 

"tasks": { 
    "task1": { 
     "state": "", 
     "required": "", 
     "completed": "C:Task1Status:+0" 
    } 
}, 

"feedback": { 
    "welcome": { 
     "text": { 
      "": "en-us", 
      "en-us": "Welcome" 
     } 
    } 
}, 

"contentCategories": { 
    "demo1": { 
     "round": 1 
    } 
}, 

"policies": { 
    "Simport.Web.Module": { 
     "fileMask": ".aspx,.asmx", 
     "deny": { 
      "statusCode": 404, 
      "statusDescription": "Not found", 
      "location": [ 
       "/{0,1}app/config/(.*\\.json)$", 
       "/{0,1}app/config/(.*\\.xml)$", 
       "/{0,1}app/config/(.*\\.zip)$", 
       "/{0,1}app/config/(.*\\.xlsx)$" 
      ] 
     }, 
     "formDataContentType": [ "application/x-www-form-urlencoded" ] 
    }, 

    "Framework.DataContext": { 
     "connectionString": "Server=(local);Database=Simport3;Integrated Security=sspi;", 
     "commandTimeout": 30 
    }, 

    "Simport.Security": { 
     "passwordEncryption": "", 
     "passwordSalt": "", 
     "passwordPolicy": { 
      "disabled": true, 
      "min": 8, 
      "max": 100, 
      "rules": [ 
       { "id": "digit", "pattern": "\\d+", "flags": "i" }, 
       { "id": "letter", "pattern": "\\w+", "flags": "i" }, 
       { "id": "upper", "pattern": "[A-Z]+" }, 
       { "id": "lower", "pattern": "[a-z]+" }, 
       { "id": "special", "pattern": "[\\!#@\\$_~]+", "flags": "i" }, 
       { "id": "prohibited", "pattern": "[\\\\/'\"\\?\\^&\\+\\-\\*\\%\\:;,\\.]+", "flags": "gi", "match": false } 
      ] 
     } 
    }, 

    "Simport.PackageDefinition": { 
     "path": "~/app/config/manifest.xml" 
    }, 

    "Security.SignIn": { 
     "result": { 
      "default": "u,p,p.props,t" 
     }, 
     "claims": [ 
      [ "userId", "firstName", "lastName" ] 
     ] 
    }, 

    "Security.GetContext": { 
     "result": { 
      "default": "u,p,p.props,pr,t" 
     } 
    }, 

    "Security.ChangePassword": { 
     "allowedRoles": [ 1, 2, 3 ] 
    }, 

    "Security.ResetPassword": { 
     "allowedRoles": [ 1, 2 ] 
    }, 

    "Security.Register": { 
     "allowedRoles": [ 0 ], 
     "!pathType-0": 4, 
     "!roleId-0": 2 
    }, 

    "Path.Create": { 
     "allowedRoles": [ 1, 2, 3 ] 
    }, 

    "Path.Select": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "result-1": { 
     } 
    }, 

    "Path.Delete": { 
     "allowedRoles": [ 1, 2 ] 
    }, 

    "User.Select": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "result": { 
      "select": [ "id", "pathid", "roleid", "name", "email", "login", "props" ], 
      "restrict": [ "password" ] 
     }, 
     "result-1": { 
      "select": "*", 
      "group": true 
     } 
    }, 

    "User.Create": { 
     "allowedRoles": [ 1, 2 ], 
     "result": { 
      "select": [ "id", "pathid", "roleid", "name", "email", "login", "props" ], 
      "restrict": [ "password" ] 
     }, 
     "result-1": { 
      "select": "*", 
      "group": true 
     } 
    }, 

    "User.Update": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "result": { 
      "select": [ "id", "pathid", "roleid", "name", "email", "login", "props" ], 
      "restrict": [ "password" ] 
     } 
    }, 

    "User.Delete": { 
     "allowedRoles": [ 1, 2 ], 
     "result": { 
      "restrict": [ "password" ] 
     } 
    }, 

    "Session.Select": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "enforcePathLevel": true, 
     "result": { 
      "default": [ "name", "beginDate", "endDate" ], 
      "restrict": [ "password" ] 
     }, 
     "result-1": { 
      "default": [ "name", "beginDate", "endDate" ], 
      "treeAllowed": true, 
      "treeDefault": false 
     } 
    }, 

    "Session.Create": { 
     "allowedRoles": [ 1, 2 ], 
     "enforcePathLevel": true 
    }, 

    "Session.Update": { 
     "allowedRoles": [ 1, 2 ], 
     "enforcePathLevel": true, 
     "update-restictions": [ "password" ], 
     "update-restictions-1": [ ], 
     "result": { 
      "restrict": [ "password" ] 
     } 
    }, 

    "Session.Delete": { 
     "allowedRoles": [ 1, 2 ], 
     "result": { 
      "restrict": [ "password" ] 
     } 
    }, 

    "Team.Select": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "enforcePathLevel": false, 
     "enforcePathLevel-1": true, 
     "result-1": { 
      "treeAllowed": true, 
      "treeDefault": false 
     } 
    }, 

    "Team.Create": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "enforcePathLevel": true, 
     "enforcePathLevel-1": false, 
     "allowMultiple": false, 
     "allowMultiple-1": true, 
     "result": { 
     }, 
     "overrides": { 
      "roleID": 3 
     } 
    }, 

    "Team.Reset": { 
     "allowedRoles": [ 1, 2, 3 ] 
    }, 

    "Team.Delete": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "deleteMultiple": true, 
     "result": { 
      "default": "t" 
     } 
    }, 

    "Team.TransitionTo": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "inboundRules": { 
      "Round1Init": { 
       "allowedRoles": [ ] 
      } 
     }, 
     "outboundRules": { 
      "Round1Wait": { 
       "allowedRoles": [ 1, 2, 3 ] 
      } 
     } 
    }, 

    "Team.TakeControl": { 
     "allowedRoles": [ 1, 2, 3, 4 ], 
     "select-1": { 
      "select": "*", 
      "restrict": [ "ctrl.userID", "ctrl.loginName" ] 
     } 
    }, 

    "Team.ReleaseControl": { 
     "allowedRoles": [ 1, 2, 3, 4 ], 
     "select-1": { 
      "select": "*", 
      "restrict": [ "ctrl.userID", "ctrl.loginName" ] 
     } 
    }, 

    "Team.GetStatus": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "result": { 
      "default": "p,t,pr" 
     } 
    }, 

    "Data.Select": { 
     "allowedRoles": [ 1, 2, 3 ] 
    }, 

    "Data.Update": { 
     "allowedRoles": [ 1, 2, 3 ], 
     "audit": { 
      "g": false, 
      "i": true, 
      "o": true, 
      "s": true 
     } 
    }, 

    "Data.ExecuteQuery": { 
     "allowedRoles": [ 0, 1, 2, 3 ], 
     "allowed-0": [ "login4\\areas", "login4\\regions", "login4\\sessions", "login4\\teams" ], 
     "restrict-3": [ "prohibitedQueryNameHere" ] 
    }, 

    "Document.Select": { 
     "defaultTextEncoding": "utf-16" 
    }, 

    "Document.Create": { 
     "~allowFileExt": [ ], 
     "denyFileExt": [ ".exe", ".com", ".cmd", ".bat", ".ps1" ], 
     "~allowContentType": [ ], 
     "denyContentType": [ "application/x-msdownload" ], 
     "maxContentLength": 0, 
     "defaultTextEncoding": "utf-16" 
    }, 

    "Document.Update": { 
     "allowedRoles": [ 1, 2, 3 ] 
    }, 

    "Document.Delete": { 
    }, 

    "Document.Download": { 
    } 
} 
} 

ответ

10

Ваш json отсутствует начальный и конечный фигурные скобки:

{ 
    "policies": { 
     "Framework.DataContext": { 
      "connectionString": "Server=ServerName;Database=DateBaseName;Integrated Security=sspi;" 
     } 
    } 
} 

Теперь вы можете обновить файл, как это :

$pathToJson = "F:\Path\To\JSON\file.json" 
$a = Get-Content $pathToJson | ConvertFrom-Json 
$a.policies.'Framework.DataContext'.connectionString = "Server=ServerName;Database=DateBaseName;Integrated Security=sspi2;" 
$a | ConvertTo-Json | set-content $pathToJson 

Вы также могли бы использовать некоторые Select-Object получить свойство:

$connectionString = $a | select -expand policies | select -expand Framework.DataContext 
$connectionString.connectionString = 'Test' 
+0

Спасибо за ваш ответ. Я обновился, чтобы отразить фигурные скобки и исключение, которое я получаю сейчас. – pstricker

+0

Если я храню json и изменяю путь к нему, скрипты выполняются так, как ожидалось. Какую версию PowerShell вы используете? Вы что-то изменили? –

+0

Я запускаю следующий PowerShell 5 – pstricker

0
$s = Get-Content "F:\Path\To\JSON\file.json" -Raw|ConvertFrom-Json 
$s.policies.'Framework.DataContext'.connectionString="Server=ServerName;Database=DateBaseName;Integrated Security=sspi2;" 
$s|ConvertTo-Json |Set-Content "F:\Path\To\JSON\file.json"