Вы можете использовать следующую технику, используя возможность встраивания полных операторов в ваш шаблон через $(...)
оператор подвыражения;поэтому следует также отметить, что обычно следует использовать этот метод только с теми шаблонными строками, которым вы доверяете , учитывая, что могут выполняться произвольные команды.
$var_1 = '"new" name'
$template = @'
{ "key1": "My name is $((Get-Variable var_1).Value -replace '"', '\"')" }
'@
$ExecutionContext.InvokeCommand.ExpandString($template)
Выше приведено:
{ "key1": "My name is \"new\" name" }
, что является действительным JSON.
Обратите внимание на использование Get-Variable
для доступа к значению переменной ${var_1}
косвенно , поэтомучто его встроенные "
символов.может быть безопасно экранирован как \"
, как того требует JSON.
Поскольку вышеприведенное является немного громоздким для нескольких ссылок, вы можете определить вспомогательную функцию :
$var_1 = '"new" name'
# Aux. function that takes a variable name and returns its value with
# " chars. \-escaped.
function esc ($varName) { (Get-Variable $varName).Value -replace '"', '\"' }
# Now you can reference the variables using $(esc <var-name):
$template = @'
{ "key1": "My name is $(esc var_1)" }
'@
$ExecutionContext.InvokeCommand.ExpandString($template)
Если вы не управляете строкой шаблона , потребуется дополнительная работа:
$var_1 = '"new" name'
# Aux. function that takes a variable name and returns its value with
# " chars. \-escaped.
function esc ($varName) { (Get-Variable $varName).Value -replace '"', '\"' }
# The original template with ${var}-style references.
$template = @'
{
"key1": "My name is ${var_1}",
}
'@
# Modify the template to replace ${var} references with $(esc var).
$modifiedTemplate = $template -replace '\$\{(\w+)\}', '$$(esc $1)'
# Now expand the modified template.
$ExecutionContext.InvokeCommand.ExpandString($modifiedTemplate)
Обратите внимание, что преобразование шаблона предполагает: Советшляпу briantist для его ввода.
, что нет экранированных ссылок на переменные, которые будут рассматриваться как литералы вшаблон ввода (например, `${var}
).
, что все ссылки на переменные имеют форму ${varName}
, где предполагается, что varName
состоит только из букв, цифр и подчеркиваний (соответствует одному или нескольким \w
экземплярам).
Более надежное решение, охватывающее все крайние случаи, может потребовать использования API синтаксического анализа PowerShell , что, однако, требует значительно больших усилий.