PowerShell -在JSON字符串中添加变量

1sbrub3j  于 12个月前  发布在  Shell
关注(0)|答案(3)|浏览(156)

我在我的powershell脚本中有以下json代码。

$jsonfile = '{"Version": "2012-10-17","Statement": {"Effect": "Allow","Action": "sts:AssumeRole","Resource": "arn:aws:iam::$variable:role/xxxxxx"}}'

字符串
输出给出....arn:aws:iam::$variable:role/xxxxxx.....而不是....arn:aws:iam::111111111:role/xxxxxx
问题是,我必须使用单引号的json字符串,否则我会得到一个错误。如果我使用单引号,我不能把变量的字符串。我如何解决这个问题?

7d7tgy0s

7d7tgy0s1#

解决问题的方法有很多种,但最简单的方法可能是使用PowerShell的字符串插值

  • 使用 * 双引号 *(可扩展)字符串整体启用嵌入变量引用和子表达式的插值($(...))。
  • 将嵌入的"字符转义为``"`(使用反引号)
  • 通过将变量名包含在{...}中来消除变量引用的歧义。

简化示例:

$variable='111'
# -> verbatim:  {"Version": "arn:aws:iam::111:role/xxxxxx"}
"{`"Version`": `"arn:aws:iam::${variable}:role/xxxxxx`"}"

字符串
请注意,仅当以下字符可能被误解为变量名的一部分时,才需要将{...}中的变量名包含在内插字符串中。
跟在变量名后面的:就是这种情况,因为PS变量可以在变量名前面有一个作用域说明符,它可以用:与变量名分开,比如$env:USERNAME
DAXaholic's helpful answer显示了一个基于PowerShell的-f运算符的替代方法,它与**.NET框架的String.Format方法**基本相同;如下所示:

  • 它引入了额外的复杂性,比如需要知道它的转义规则是什么({字符必须转义为{{,以及如何格式化它在-r的RHS上指定的参数({0}指的是第一个RHS参数,...)
  • 另一方面,-f提供了许多复杂的格式化选项。

此外,考虑使用Convert*-Json JavaScript,他的答案表明:即使它们的性能较差,但它们最终使JSON的操作更容易和更健壮。

原生PowerShell代码领域的替代方案
字符串连接,使用二进制*+**运算符:

'{"Version": "arn:aws:iam::' + $variable + ':role/xxxxxx"}}'

  • $ExecutionContext.InvokeCommand.ExpandString()字符串模板
$variable='111'    
$tmpl = '{"Version": "arn:aws:iam::${variable}:role/xxxxxx"}}' # string template *literal*
$ExecutionContext.InvokeCommand.ExpandString($tmpl) # performs on-demand interpolation

kt06eoxx

kt06eoxx2#

另一个解决办法是

$jsonfile = '{{"Version": "2012-10-17","Statement": {{"Effect": "Allow","Action": "sts:AssumeRole","Resource": "arn:aws:iam::{0}:role/xxxxxx"}}}}' -f $variable

字符串
所以你必须用另一个大括号来转义大括号,但是在你的例子中,大括号比引号少,所以它“不那么模糊”:)
在您的情况下,最简单的解决方案可能只是将字符串连接在一起,而不是使用字符串格式化/插值。
此外,你也可以使用JSON小工具:

$jsonfile | 
    ConvertFrom-Json | 
    % { $_.Statement.Resource = "arn:aws:iam::${variable}:role/xxxxxx"; $_ } | 
    ConvertTo-Json

epfja78i

epfja78i3#

你可以使用一个“Here-string”。它的声明方式和普通字符串一样,只是两端都有一个@。例如:

$jsonfile = @"
  {
    "Version": "2012-10-17",
    "Statement": {
      "Effect": "Allow", 
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::$variable:role/xxxxxx"}
  }
"@

字符串
然而,在这个特定的例子中,:role部分有点混淆Powershell。所以你需要像$variable:role一样转义冒号,或者像$($variable):role${variable}:role`一样 Package 变量。

相关问题