it-swarm.com.ru

Обновите файл 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:\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": {
    }
}
}
11
pstricker

В вашем 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'
14
Martin Brandl
$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"
0
asif