我在我的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字符串,否则我会得到一个错误。如果我使用单引号,我不能把变量的字符串。我如何解决这个问题?
3条答案
按热度按时间7d7tgy0s1#
解决问题的方法有很多种,但最简单的方法可能是使用PowerShell的字符串插值:
$(...)
)。"
字符转义为``"`(使用反引号){...}
中来消除变量引用的歧义。简化示例:
字符串
请注意,仅当以下字符可能被误解为变量名的一部分时,才需要将
{...}
中的变量名包含在内插字符串中。跟在变量名后面的
:
就是这种情况,因为PS变量可以在变量名前面有一个作用域说明符,它可以用:
与变量名分开,比如$env:USERNAME
。DAXaholic's helpful answer显示了一个基于PowerShell的
-f
运算符的替代方法,它与**.NET框架的String.Format
方法**基本相同;如下所示:{
字符必须转义为{{
,以及如何格式化它在-r
的RHS上指定的参数({0}
指的是第一个RHS参数,...)-f
提供了许多复杂的格式化选项。此外,考虑使用
Convert*-Json
JavaScript,他的答案表明:即使它们的性能较差,但它们最终使JSON的操作更容易和更健壮。原生PowerShell代码领域的替代方案:
字符串连接,使用二进制*
+
**运算符:型
$ExecutionContext.InvokeCommand.ExpandString()
的字符串模板:型
kt06eoxx2#
另一个解决办法是
字符串
所以你必须用另一个大括号来转义大括号,但是在你的例子中,大括号比引号少,所以它“不那么模糊”:)
在您的情况下,最简单的解决方案可能只是将字符串连接在一起,而不是使用字符串格式化/插值。
此外,你也可以使用JSON小工具:
型
epfja78i3#
你可以使用一个“Here-string”。它的声明方式和普通字符串一样,只是两端都有一个@。例如:
字符串
然而,在这个特定的例子中,
:role
部分有点混淆Powershell。所以你需要像$variable
:role一样转义冒号,或者像
$($variable):role或
${variable}:role`一样 Package 变量。