Сценарий powershell — заменить массив json (экранировать $var, чтобы он воспринимался как текст без двойных кавычек)

Я решил эту тему (ссылка на шаблон json на объектную переменную;), и моя проблема теперь немного связана с предыдущей темой, потому что мне нужно каким-то образом использовать тот же шаблон json, который используется в сценарии PowerShell генератора ниже:

function DownloadLogicAppJson([string] $resourceGroup, [string] $logicAppName, [string] $fileName) {

Write-Host "Downloading Logic App: $logicAppName"
Write-Host 'Resource Group:' $resourceGroup
Write-Host 'Output File: ' $fileName

$logicApp = Get-AzLogicApp -ResourceGroupName $resourceGroup -Name $logicAppName
$logicAppText = $logicApp.Definition.ToString()
$logicAppDefinition = $logicApp.Definition

$logicAppText = $logicAppText -replace '"timeZone": ".*?"', '"timeZone": "${scheduleTimezone}"'       #timezone is a String variable;
$logicAppText = $logicAppText -replace '"body": .*?,', '"body": ${requestBody},'  #requestBody is an Object variable;

#$logicAppText = $logicAppText -replace '"hours": [.*]', '"hours": [$scheduleHour]' #a string variable;
$logicAppDefinition = $logicAppText | ConvertFrom-Json

$logicAppText = $logicAppDefinition | ConvertTo-Json -Depth 100
$logicAppText | Out-File -FilePath .\$fileName  

Write-Host "Logic App definition JSON downloaded and saved to: $fileName"

}

DownloadLogicAppJson -resourceGroup $resourceGroup -logicAppName $logicAppName -fileName $outputFileName

Моя проблема заключается в этой переменной ScheduleHours и RequestBody, потому что их нельзя обрабатывать, поскольку я развернул свой первоначальный json при развертывании приложения логики: Первоначально (решение согласовано):

"повторение": { "частота": "День", «интервал»: 1, "расписание": { "часы": [ ${scheduleHour} #БЕЗ ДВОЙНЫХ КАВЫЧОК; вот число var; ], "минуты": [ ${scheduleMinute} #БЕЗ двойных кавычек; вот число var; ] }, "timeZone": "${scheduleTimezone}" #вот строка, работает; }, "type": "Повторение"

После того, как я развернул указанную выше часть кода, на портале Azure в представлении кода приложения логики у меня появилось следующее представление:

"повторение": { "частота": "День", «интервал»: 1, "расписание": { "часы": [ 15 ], "минуты": [ 0 ] }, "timeZone": "Стандартное время Западной Европы"

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

*Я знаю, что изначально развернутый JSON не является хорошим, поскольку в нем не используется "" для ScheduleHours, но он работает для развертывания и для ссылки на эти значения $scheduleHours. Как я могу сделать в PowerShell эту замену?

Я также пробовал:

$logicAppText = $logicAppText -замените '"часы": [.*?]', '"часы": [${scheduleHour}]' -> генерируется как «часы»: [15]

Мне нужно сгенерировать его как: «часы»: ${scheduleHour}

Я попробовал другой подход:

$logicAppDefinition = $logicApp.Definition $logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = @($scheduleHour) -> генерирует «часы»: [null];

Пытался выйти, например: $logicAppText = $logicAppText -replace '"hours": [.*?]', '"hours": [`${scheduleHour}]', но не работает, генерирует значение 15;

Я также не уверен, что [.*?] является правильным;

Я попробовал: $logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = @('$scheduleHour') не работает так, как ожидалось, потому что генерирует:"часы": [ "$scheduleHour" ] где мне нужно без двойных кавычек, например $scheduleHour

$logicAppDefinition.triggers.Recurrence.recurrence.schedule.‌​hours = @('$scheduleHour') генерирует "hours": [ "$scheduleHour" ], потому что вы явно указываете массив в качестве значения - @('$scheduleHour') (с одинарными кавычками) означает «создать новый объект массива и добавить к нему литеральную строку $scheduleHour», которая затем сериализуется в json как [ "$scheduleHour" ]. Если вы хотите, чтобы полученный json был "hours": 15, просто используйте $logicAppDefinition.triggers.Recurrence.recurrence.schedule.‌​hours = $scheduleHour.
mclayton 11.03.2024 14:03

Даже если я использую $logicAppDefinition.triggers.Recurrence.recurrence.schedule.‌​hours = $scheduleHour, скрипты генератора pwshell работают и генерируют шаблон json с "hours" : [ 15 ], но мне нужно сгенерировать точно так: «часы»: [$scheduleHours] (без двойных кавычек), я ищу замену регулярного выражения, чтобы как-то это сделать

be9inn3r 11.03.2024 14:12

В целом плохая практика — заглядывать в строки сериализованных объектов (например, Json и XML) с использованием строковых методов, таких как Replace. А как насчет просто: $logicAppDefinition.triggers.Recurrence.recurrence.schedule.‌​hours = @([int]$scheduleHour)

iRon 11.03.2024 19:37
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
3
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пробовал: $logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = @('$scheduleHour') не работает так, как ожидалось, потому что генерирует: "hours": [ "$scheduleHour" ] там, где мне нужно, без двойных кавычек, например $scheduleHour

Я бы использовал этот подход, а затем использовал -replace, чтобы потом удалить " вокруг выражений переменных:

$logicAppDefinition = $logicApp.Definition
$logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = @('$scheduleHour')

# use regex to replace `"$scheduleHour"` with `$scheduleHour`
$logicAppUpdatedText = ($logicAppDefinition |ConvertTo-Json -Depth 100) -replace '"$(\w+)"','$$$1'

$logicAppUpdatedText |Out-File -FilePath .\$fileName 

Я решил преобразовать переменную tostring() и после этого впустить json с помощью "${scheduleHour}". Теперь я остался только с другим параметром/переменной, которая является объектом, и пытаюсь заставить ее работать. Я обновил свой вопрос второй частью.

be9inn3r 11.03.2024 16:26

@ be9inn3r Если вы нашли решение самостоятельно, опубликуйте его в качестве ответа ниже. Если вам нужны ответы на другой вопрос, задайте новый :)

Mathias R. Jessen 11.03.2024 16:32

Я публикую это здесь, потому что пытаюсь использовать ваш образец для другой переменной, которая является объектом, а не строкой или числом, как это было для ScheduleHours. Но здесь я думаю, что вынужден использовать его экранированным, как: "actions": { "Call_function": { "inputs": { "subscribe": { "body": ${requestBody}, #without "" Но это все равно осталось как: "body": { "pipeline": { ... } }, и мне нужно быть как "body": ${requestBody} $requestBody — это объект, который начинается с конвейера и других блоков;

be9inn3r 11.03.2024 17:04

@be9inn3r используйте -replace '"$([\{\}\w]+)"','$$$1', если хотите запечатлеть { и }. Обязательно используйте ', чтобы предотвратить расширение ${requestBody}, например. $....body = '${requestBody}'

Mathias R. Jessen 11.03.2024 17:09

вот так ты имеешь в виду? $logicAppDefinition.actions.Call_function.inputs.subscribe.b‌​ody = '${requestBody}' $logicAppText = ($logicAppDefinition |ConvertTo-Json -Depth 100) -replace '"$([\{\}\w]+ )",'$$$1' генерирует "body": "${requestBody}", а не "body": ${requestBody}, как мне нужно. или я делаю что-то плохое

be9inn3r 11.03.2024 17:27

@be9inn3r Извините, забыл убрать $, используйте -replace '"\$([\{\}\w]+)"','$$$1'

Mathias R. Jessen 11.03.2024 17:28

решено с помощью: '"(\$\{requestBody\})"', '$1'

be9inn3r 11.03.2024 17:29

Другие вопросы по теме