单引号字符串中的 Powershell 变量扩展
Powershell variable expansion in single quoted string
我需要构建一个 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 吗?任何其他想法如何解决这个问题?感谢任何帮助。
编辑:我希望 inner_json 像这样:
{"var1":"sys", "var2":"yadda", "inner_json": "{\"System\": {\"link\":\"google.de\"}}"}
如果准备对象(使用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"
}
基于增加的期望:
*注:
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"
}
iRon's helpful answer 包含适合您的用例的最佳解决方案。
按照标题的建议回答您的问题,这确实是一个不同的用例:
您可以使用 $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"}}
我需要构建一个 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 吗?任何其他想法如何解决这个问题?感谢任何帮助。
编辑:我希望 inner_json 像这样:
{"var1":"sys", "var2":"yadda", "inner_json": "{\"System\": {\"link\":\"google.de\"}}"}
如果准备对象(使用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"
}
基于增加的期望:
*注:
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"
}
iRon's helpful answer 包含适合您的用例的最佳解决方案。
按照标题的建议回答您的问题,这确实是一个不同的用例:
您可以使用 $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"}}