Powershell:内联表达式中的双引号

时间:2014-06-16 11:09:42

标签: powershell powershell-v3.0

请有人解释我为什么会发生以下情况:

"Fancy string - Hor""ray"
# outputs correctly (only one double quote): Fancy string - Hor"ray

'Hor"ray'.Replace('"', '""')
# outputs correctly (two double quotes): Hor""ray

"Fancy string - $('Hor"ray'.Replace('"', '"'+'"'))"
#outputs correctly (two double quotes): Hor""ray

"Fancy string - $('Hor"ray'.Replace('"', '""'))"
# outputs INCORRECTLY (only one double quote): Fancy string - Hor"ray

在我看来,开发人员会直观地期望在" $(内联表达式)" Powershell会将文本视为语句,并且不会干扰Replace('"', '""')将其转换为'"'的最后一个参数(除非语句解释器决定这样做)。

我在这里想念一下吗?

3 个答案:

答案 0 :(得分:1)

这似乎是PowerShell解析可扩展字符串文字的错误。

根据PowerShell 3.0 Language Specification中关于字符串文字的§2.3.5.2, expandable-string-literal 显式拒绝$(序列,以便子表达式< / em>将发生解析。

因此,期望$('""')一致地解析似乎是合理的,无论它是否恰好嵌入到字符串文字中。显然,子表达式是单独解析的,因为它们支持在可扩展字符串中自身非法的值(例如,您可以编写"$('"')""$('`""')",其中" '"' "或{{ 1}}会失败)。

但是,比较" '`""' "$('""')的{​​{3}}的AST,我们会得到两个不同的结果。两者的最终"$('""')"元素的StringConstantExpressionAstExtent,但独立子表达式的'""'Value""嵌入式子表达式为Value

答案 1 :(得分:0)

这是因为内联表达式被计算,然后它的字符串值被放在字符串中并进行评估。

#Breaking "Fancy string - $('Hor"ray'.Replace('"', '""'))" down
#This inline expression is evaluated first
$('Hor"ray'.Replace('"', '""'))
#giving
Hor""ray
#That value is then interpreted as part of the string
"Fancy string - Hor""ray"
#giving
Fancy string - Hor"ray

这正是我期望看到的。评估内联表达式,然后使用其结果值。

答案 2 :(得分:0)

这不能通过简单地使用以下内容来完成:

`'$($RemFiles[$i].FullName)`'
`"$($RemFiles[$i].FullName)`"

使用反引号以及单引号或双引号,然后阻止powershell将其用作开放注释,从而将实际符号放入......

以上输出:

'F:\portable\adobe'

or

"F:\portable\adobe"

我注意到你似乎在告诉它实际上添加两个双引号而不仅仅是使用反引号强制它。因此告诉它不要添加任何东西:S所以你可以改变这样的东西:

"Fancy string - $('Hor"ray'.Replace('"', '`"`"'))"

虽然这可能会产生3,但是你还有一个出现在Hor&#34; ray中。

刚开始测试,忙着做点什么:

PS D:\> "Fancy string - $('Hor"ray'.Replace('"', '`"`"'))"
Fancy string - Hor""ray

向下滚动下面的网站,了解反击以及可以使用的方式/位置。

  

http://www.neolisk.com/techblog/powershell-specialcharactersandtokens