Json 在PowerShell中调用ExpandString时如何转义字符串变量
我有一个PowerShell脚本,可以将JSON文件作为参数并将其转换为对象。在JSON字符串(作为模板)中,可能有一些变量,这些变量应该在运行时替换为实际值。例如,此JSON字符串中的Json 在PowerShell中调用ExpandString时如何转义字符串变量,json,string,powershell,escaping,Json,String,Powershell,Escaping,我有一个PowerShell脚本,可以将JSON文件作为参数并将其转换为对象。在JSON字符串(作为模板)中,可能有一些变量,这些变量应该在运行时替换为实际值。例如,此JSON字符串中的$var_1、$var_x和$var_y: { "key1": "My name is ${var_1}", "key2": { "key3": "Another variable ${var_x}", "key4": "${var_y}" } }
$var_1
、$var_x
和$var_y
:
{
"key1": "My name is ${var_1}",
"key2":
{
"key3": "Another variable ${var_x}",
"key4": "${var_y}"
}
}
脚本不知道这些变量的名称。我使用ExpandString来完成这项工作:
[string]$jsonText = Get-Content $inputFile;
if ([string]::IsNullOrWhiteSpace($jsonText)) {
throw "No content in $inputFile"
}
$temp = $ExecutionContext.InvokeCommand.ExpandString($jsonText);
$jsonObj = ConvertFrom-Json $temp;
问题是,当变量包含双引号时,调用convertfromjson
将失败,因为引号没有转义。例如,“我的名字是${var_1}”
可能会变成“我的名字是一个”新的“名字”
调用ExpandString时有没有办法转义这些字符串变量?您可以使用以下技术,利用能够通过
$(…)
子表达式操作符将整个语句嵌入模板中的优势;因此,还应注意的是,鉴于可以执行任意命令,您通常应仅对信任的模板字符串使用此技术
$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}
- 所有变量引用的形式均为
,其中${varName}
假定仅由字母、数字和下划线组成(匹配一个或多个varName
实例)\w
覆盖所有边缘情况的更健壮的解决方案可能需要使用,但这需要付出更多的努力。这种格式允许吗?如果变量以“
”
引用,则它是一个字符串,不会将标记添加到.json
。e、 g:
$var_1 = "Json Sample"
$json_piece = @"
{
"key1": "My name is $var_1",
"key2":
{
"key3": "Another variable $var_2",
"key4": "$var_3"
}
}
"@
It输出($var_2和$var_3未定义):
如果将“
添加到json文件,如下所示:
{
"key1": "My name is "Json Sample"",
"key2":
{
"key3": "Another variable ",
"key4": ""
}
}
您将出现一个错误:逗号除外。这意味着如果变量包含“
,则必须首先对其进行转义,否则,.json
文件是意外的
p.S.验证 我在上验证了它。
这是我的密码:
{
"Key": "value is "value"",
"key2": "other value"
}
我有两个错误:
- 根据RFC 4627(JSON规范),JSON输入无效。位置20处出现意外标记v
- JSON输入在JavaScript中无效,在属性列表后缺少}(在第2行),(在第24位)
关键是,这里类似于
$var_1='“JsonSample”
,因此一旦发生替换,生成的JSON确实会变得无效。他们不知道变量在运行时实际包含的值。如果在.JSON
文件中使用“
,就会出现错误<代码>“必须在传递到.json
文件之前转义。我刚刚试过。我在答案中添加了验证。也许我有误解,但你似乎在重复问题中提出的问题。嗯,我发现,这个问题的重点是如何从变量中摆脱双引号@mklement0回答得很好。
{
"key1": "My name is "Json Sample"",
"key2":
{
"key3": "Another variable ",
"key4": ""
}
}
{
"Key": "value is "value"",
"key2": "other value"
}