Расширение переменной Powershell в одиночной кавычке - PullRequest
2 голосов
/ 20 января 2020


Мне нужно создать переменную JSON, которая содержит другое отформатированное содержимое JSON, которое должно быть отформатировано как строка. Я помещаю внутренний JSON в одинарную кавычку, чтобы он не анализировался вместе с внешним JSON. Внутренний JSON содержит переменную, которая должна быть расширена. К сожалению, одинарные кавычки препятствуют этому.
Пример:

$link = "http://www.google.de"
$event = @{
   var1 = "sys"
   var2 = "yadda"
   inner_json = '"System": {"link":"$link"}}'
}
$json = $event | ConvertTo-Json

Переменная $ inner_ json должна быть встроена в виде строки. Есть ли способ заставить расширение $ link в одинарных кавычках? Любая другая идея, как решить эту проблему? Любая помощь приветствуется.
edit: я бы ожидал inner_ json вот так:

{"var1":"sys", "var2":"yadda", "inner_json": "{\"System\": {\"link\":\"google.de\"}}"}

Ответы [ 2 ]

4 голосов
/ 20 января 2020

Если вы подготовите объект (используя HashTable или PSCustomObject), переменные (начиная с $, включая $var1, $inner_json) все равно будут автоматически расширены.
Я думаю, что вы хотите сделать это:

$link = "http://www.google.de"
$event = @{
    var1 = 'sys'
    var2 = 'yadda'
    inner_json = @{
        System = @{
            link = $link
        }
    }
}
$event | ConvertTo-Json

{
  "inner_json": {
    "System": {
      "link": "http://www.google.de"
    }
  },
  "var2": "yadda",
  "var1": "sys"
}

На основе добавленного ожидания:
* Примечание:
Двойные кавычки автоматически экранируются с помощью обратного слэса sh (\) в json.
Чтобы избежать двойных кавычек в PowerShell, используйте обратную черту: (`)

$link = "http://www.google.de"
$event = @{
    var1 = 'sys'
    var2 = 'yadda'
    inner_json = "{`"System`": {`"link`":`"$Link`"}}"
}
$event | ConvertTo-Json

{
  "inner_json": "{\"System\": {\"link\":\"http://www.google.de\"}}",
  "var2": "yadda",
  "var1": "sys"
}

Но лучше не создавать строку Json ( включая внутреннюю Json строку), а также создать внутреннюю Json из объекта и буквально внедрить эту строку во внешнюю Json:

$link = "http://www.google.de"
$event = @{
    var1 = 'sys'
    var2 = 'yadda'
    inner_json = @{System = @{link = $Link}} | ConvertTo-Json -Compress
}
$event | ConvertTo-Json

{
  "inner_json": "{\"System\":{\"link\":\"http://www.google.de\"}}",
  "var2": "yadda",
  "var1": "sys"
}
1 голос
/ 20 января 2020

Полезный ответ iRon содержит лучшее решение для вашего случая использования.


Чтобы ответить на ваш вопрос , как следует из его названия , что на самом деле другой вариант использования:

Вы можете использовать $ExecutionContext.InvokeCommand.ExpandString() для интерпретации дословных строк как расширяемых по требованию :

# A variable to reference in the template string below.
$link = 'http://example.org'

# A verbatim string that is to be interpreted as an expandable one later, on demand:
$template = '"System": {"link":"$link"}}'

# Expand the template, using the current values of the variables referenced:
$ExecutionContext.InvokeCommand.ExpandString($template)

Выше приведена строка со следующим дословно содержание; обратите внимание, как было расширено значение $link:

"System": {"link":"http://example.org"}}
...