我的powershell脚本中有以下json代码.我将$变量设置为1111111111
$jsonfile = '{"Version": "2012-10-17","Statement": {"Effect": "Allow","Action": "sts:AssumeRole","Resource": "arn:aws:iam::$variable:role/xxxxxx"}}'
Run Code Online (Sandbox Code Playgroud)
输出给.... arn:aws:iam :: $ variable:role/xxxxxx .....而不是.... arn:aws:iam :: 1111111111:role/xxxxxx
问题是我必须使用json字符串的单引号,否则我将收到错误.如果我使用单引号,我将无法将变量放在字符串中.我该如何解决这个问题?
mkl*_*nt0 10
有多种方法可以解决您的问题,但也许最简单的方法是使用PowerShell 的字符串插值:
整体使用双引号(可扩展)字符串来启用嵌入变量引用和子表达式的插值 ( $(...))。
转义嵌入"字符。as `"(使用反引号)
通过将变量名称括在 中来消除变量引用的歧义{...}。
简化示例:
$variable='111'
# -> verbatim: {"Version": "arn:aws:iam::111:role/xxxxxx"}
"{`"Version`": `"arn:aws:iam::${variable}:role/xxxxxx`"}"
Run Code Online (Sandbox Code Playgroud)
{...}请注意,仅当以下字符时才需要将变量名称括在插值字符串中。可能会被误解为变量名称的一部分。
变量名后面的A :(如此处的情况)就是这种情况,因为 PS 变量可以在变量名之前有一个范围说明符,该范围说明符与变量名之间用 分隔:,例如在 中$env:USERNAME。
DAXaholic 的有用答案显示了基于PowerShell -f运算符的替代方案,该方法本质上与.NET 框架的String.Format方法相同;像这样:
它引入了额外的复杂性,例如需要知道它的转义规则是什么({chars. 必须转义为{{,以及如何格式化其在 RHS 上指定的参数-r({0}指第一个 RHS 参数,...)
另一方面,-f提供了许多复杂的格式选项。
另外,请考虑使用Convert*-Json他的答案演示的 cmdlet:尽管它们的性能较差,但它们最终使 JSON 的操作变得更容易、更健壮。
本机 PowerShell 代码领域的替代方案:
+:'{"Version": "arn:aws:iam::' + $variable + ':role/xxxxxx"}}'
Run Code Online (Sandbox Code Playgroud)
$ExecutionContext.InvokeCommand.ExpandString():$variable='111'
$tmpl = '{"Version": "arn:aws:iam::${variable}:role/xxxxxx"}}' # string template *literal*
$ExecutionContext.InvokeCommand.ExpandString($tmpl) # performs on-demand interpolation
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是
$jsonfile = '{{"Version": "2012-10-17","Statement": {{"Effect": "Allow","Action": "sts:AssumeRole","Resource": "arn:aws:iam::{0}:role/xxxxxx"}}}}' -f $variable
Run Code Online (Sandbox Code Playgroud)
所以你必须用另一个大括号来转义大括号,但在你的情况下,你的大括号比引号少,所以它是“更少的混淆”:)
对于您的情况,也许最简单的解决方案是将字符串连接在一起,而不是使用字符串格式化/插值。
此外,您还可以使用 JSON cmdlet:
$jsonfile |
ConvertFrom-Json |
% { $_.Statement.Resource = "arn:aws:iam::${variable}:role/xxxxxx"; $_ } |
ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4718 次 |
| 最近记录: |