Я решил эту тему (ссылка на шаблон 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, скрипты генератора pwshell работают и генерируют шаблон json с "hours" : [ 15 ], но мне нужно сгенерировать точно так: «часы»: [$scheduleHours] (без двойных кавычек), я ищу замену регулярного выражения, чтобы как-то это сделать
В целом плохая практика — заглядывать в строки сериализованных объектов (например, Json и XML) с использованием строковых методов, таких как Replace. А как насчет просто: $logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = @([int]$scheduleHour)

Я пробовал:
$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 Если вы нашли решение самостоятельно, опубликуйте его в качестве ответа ниже. Если вам нужны ответы на другой вопрос, задайте новый :)
Я публикую это здесь, потому что пытаюсь использовать ваш образец для другой переменной, которая является объектом, а не строкой или числом, как это было для ScheduleHours. Но здесь я думаю, что вынужден использовать его экранированным, как: "actions": { "Call_function": { "inputs": { "subscribe": { "body": ${requestBody}, #without "" Но это все равно осталось как: "body": { "pipeline": { ... } }, и мне нужно быть как "body": ${requestBody} $requestBody — это объект, который начинается с конвейера и других блоков;
@be9inn3r используйте -replace '"$([\{\}\w]+)"','$$$1', если хотите запечатлеть { и }. Обязательно используйте ', чтобы предотвратить расширение ${requestBody}, например. $....body = '${requestBody}'
вот так ты имеешь в виду? $logicAppDefinition.actions.Call_function.inputs.subscribe.body = '${requestBody}' $logicAppText = ($logicAppDefinition |ConvertTo-Json -Depth 100) -replace '"$([\{\}\w]+ )",'$$$1' генерирует "body": "${requestBody}", а не "body": ${requestBody}, как мне нужно. или я делаю что-то плохое
@be9inn3r Извините, забыл убрать $, используйте -replace '"\$([\{\}\w]+)"','$$$1'
решено с помощью: '"(\$\{requestBody\})"', '$1'
$logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = @('$scheduleHour')генерирует"hours": [ "$scheduleHour" ], потому что вы явно указываете массив в качестве значения -@('$scheduleHour')(с одинарными кавычками) означает «создать новый объект массива и добавить к нему литеральную строку $scheduleHour», которая затем сериализуется в json как[ "$scheduleHour" ]. Если вы хотите, чтобы полученный json был"hours": 15, просто используйте$logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = $scheduleHour.