Замена значений в Json с помощью powershell

#powershell

#powershell

Вопрос:

У меня есть файл json, в котором я хотел бы изменить значения и снова сохранить как Json: значения, которые необходимо обновить:

  1. домен

  2. репозиторий

     [
     {
           "name": "[concat(parameters('factoryName'), '/LS_New')]",
           "type": "Microsoft.DataFactory/factories/linkedServices",
           "apiVersion": "2018-06-01",
           "properties": {
             "description": "Connection",
             "annotations": [],
             "type": "AzureDatabricks",
             "typeProperties": {
               "domain": "https://url.net",
               "accessToken": {
                 "type": "AzureKeyVaultSecret",
                 "store": {
                   "referenceName": "LS_vault",
                   "type": "LinkedServiceReference"
                 },
                 "secretName": "TOKEN"
               },
               "newClusterNodeType": "Standard_DS4_v2",
               "newClusterNumOfWorker": "2:10",
               "newClusterSparkEnvVars": {
                 "PYSPARK_PYTHON": "/databricks/python3/bin/python3"
               },
               "newClusterVersion": "7.2.x-scala2.12"
             }
           },
           "dependsOn": [
             "[concat(variables('factoryId'), '/linkedServices/LS_evaKeyVault')]"
           ]
         },
     {
           "name": "[concat(parameters('factoryName'), '/PIP_Log')]",
           "type": "Microsoft.DataFactory/factories/pipelines",
           "apiVersion": "2018-06-01",
           "properties": {
             "description": "Unzip",
             "activities": [
               {
                 "name": "Parse",
                 "description": "This notebook",
                 "type": "DatabricksNotebook",
                 "dependsOn": [],
                 "policy": {
                   "timeout": "7.00:00:00",
                   "retry": 0,
                   "retryIntervalInSeconds": 30,
                   "secureOutput": false,
                   "secureInput": false
                 },
                 "userProperties": [],
                 "typeProperties": {
                   "notebookPath": "/dataPipelines/main_notebook.py",
                   "baseParameters": {
                     "businessgroup": {
                       "value": "@pipeline().parameters.businessgroup",
                       "type": "Expression"
                     },
                     "project": {
                       "value": "@pipeline().parameters.project",
                       "type": "Expression"
                     }
                   },
                   "libraries": [
                     {
                       "pypi": {
                         "package": "cytoolz"
                       }
                     },
                     {
                       "pypi": {
                         "package": "log",
                         "repo": "https://b73gxyht"
                       }
                     }
                   ]
                 },
                 "linkedServiceName": {
                   "referenceName": "LS_o",
                   "type": "LinkedServiceReference"
                 }
               }
             ],
             "parameters": {
               "businessgroup": {
                 "type": "string",
                 "defaultValue": "test"
               },
               "project": {
                 "type": "string",
                 "defaultValue": "log-analytics"
               }
             },
             "annotations": []
           },
           "dependsOn": [
             "[concat(variables('factoryId'), '/linkedServices/LS_o')]"
           ]
         }
     ]
      

Я пытался использовать регулярное выражение, но смог обновить только 1 значение :

 <valuesToReplace>
  <valueToReplace>
    <regExSearch>(/PIP_Log[wW]*?[pP]roperties[wW]*?[lL]ibraries[wW]*?[pP]ypi[wW]*?"repo":s)"(.*?[^\])"</regExSearch>
    <replaceWith>__PATValue__</replaceWith>
  </valueToReplace>

  <valueToReplace>
    <regExSearch>('/LS_New[wW]*?[pP]roperties[wW]*?[tT]ypeProperties[wW]*?"domain":s"(.*?[^\])")</regExSearch>
    <replaceWith>__LSDomainName__</replaceWith>
  </valueToReplace>
</valuesToReplace>
  

Вот код powershell. Цикл проходит через все значения, которые должны быть заменены.
Я пытался использовать динамическую переменную в select-string и цикле, но, похоже, это не работает

 foreach($valueToReplace in $configFile.valuesToReplace.valueToReplace)
        {
          
            $regEx = $valueToReplace.regExSearch
            $replaceValue = '"'   $valueToReplace.replaceWith   '"'
          
            $matches = [regex]::Matches($json, $regEx)
            
            $matchExactValueRegex = $matches.Value | Select-String -Pattern """repoD:s*(.*)" | % {$_.Matches.Groups[1].Value}
            $updateReplaceValue = $matches.Value | Select-String -Pattern "repoD:sD__(.*)__""" | % {$_.Matches.Groups[1].Value}
            $updateReplaceValue = """$patValue"""
    
    $json1 = [regex]::Replace($json, $matchExactValueRegex , $updateReplaceValue)
    
    $matchExactValueRegex1 = $matches.Value | Select-String -Pattern """domainD:s*(.*)" | % {$_.Matches.Groups[1].Value}
            $updateReplaceValue1 = $matches.Value | Select-String -Pattern "domainD:sD__(.*)__""" | % {$_.Matches.Groups[1].Value}
            $updateReplaceValue1 = """$domainURL"""
     
          
            $json = [regex]::Replace($json1, $matchExactValueRegex1 , $updateReplaceValue1)
          }
          else
          {
            Write-Warning "Inactive config value"
          }
        
        
        $json | Out-File $armFileWithReplacedValues
  

Чего я не понимаю??

Комментарии:

1. JSON — это структура данных. Вы не используете регулярное выражение, поскольку Convertfrom-JSON создает хороший объект PS.

Ответ №1:

Вы не должны заглядывать и тыкать в сериализованные файлы (например, файлы Json) напрямую. Вместо десериализации файла с ConvertFrom-Json помощью командлета внесите изменения в объект и снова сериализуйте его с ConvertTo-Json помощью командлета:

 $Data = ConvertFrom-Json $Json
$Data[0].properties.typeproperties.domain = '_LSDomainName__'
$Data[1].properties.activities.typeproperties.libraries[1].pypi.repo = '__PATValue__'
$Data | ConvertTo-Json -Depth 9 | Out-File $armFileWithReplacedValues