Обновление JSON-файла с помощью PowerShell

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

Я провел довольно много исследований и не смог понять, как именно это можно сделать. Я нашел этот вопрос и ответ здесь на переполнении стека"Как обновить файл JSON с помощью PowerShell " но выполнение сценария, предоставленного в ответе, существенно изменяет структуру файла JSON и добавляет довольно много того, что выглядит как метаданные PowerShell.

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

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

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

$pathToJson = "D:PathToJSONfile.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

полное содержимое файла.json следующие

{
"log": {
    "level": 0,
    "file": "c:tempsimport.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": [ "login4areas", "login4regions", "login4sessions", "login4teams" ],
        "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": {
    }
}
}

2 ответов


код в формате 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'

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