2016-05-31 6 views
8

Ich versuche derzeit, ein kontinuierliches Integrationssystem mit VSTS einzurichten, und habe ein kleines Problem gehabt. Als Teil des Release-Prozesses muss ich abhängig von der Umgebung einen bestimmten Objektwert in einer JSON-Datei aktualisieren. Die einzigen Tools, die mir zur Verfügung stehen, die dies in der VSTS-Umgebung erledigen können, sind PowerShell.Aktualisieren der JSON-Datei mit PowerShell

Ich habe ziemlich viel Forschung gemacht und bin nicht in der Lage, herauszufinden, wie genau das gemacht werden kann. Ich habe diese Frage und Antwort hier auf Stack Overflow "how do I update json file using powershell" gefunden, aber das Ausführen des Skripts in der Antwort ändert die Struktur der JSON-Datei wesentlich und fügt einiges hinzu, was wie PowerShell-Metadaten aussieht.

Idealerweise möchte ich eine vorhandene JSON-Datei verwenden, die im folgenden JSON-Beispiel implementiert und den Wert der Eigenschaft connectionString aktualisiert.

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

Hat jemand einen Rat, wie dies zu erreichen ist? Bis jetzt habe ich versucht, das folgende Skript auszuführen, aber es wirft ein "Die Eigenschaft 'connectionString' kann nicht für dieses Objekt gefunden werden. Stellen Sie sicher, dass die Eigenschaft existiert und festgelegt werden kann." Ausnahme. Ich habe überprüft, dass das Objekt traversal korrekt ist und die Eigenschaft connectionString vorhanden ist.

$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 

der komplette Inhalt des file.json sind als

{ 
"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": { 
    } 
} 
} 

Antwort

10

Ihr json folgt, wird die Start- und End geschweiften Klammern fehlt:

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

Jetzt können Sie die Datei wie folgt aktualisieren :

$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 

Sie könnten auch einige Select-Object erhalten die Eigenschaft:

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

Vielen Dank für Ihre Antwort. Ich habe aktualisiert, um die geschweiften Klammern und die Ausnahme wiederzugeben, die ich jetzt erhalte. – pstricker

+0

Wenn ich den JSON speichern und den Pfad zu ihm ändern, werden die Skripts wie erwartet ausgeführt. Welche PowerShell-Version verwenden Sie? Hast du noch etwas verändert? –

+0

Ich verwende die folgende 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"