在Power-Shell中转义双引号字符时如何处理空格键

时间:2019-04-01 10:40:59

标签: powershell

我可以在PowerShell中转义双引号字符,但是当其中包含带有空格转义的字符串时,它不能正常工作。

例如: 我可以将以下ADUC转换为powershell

   Name in ADUC: cn="Jim" 
   In powershell: "cn=\`"Jim\`"" 

我如何如下处理/逃避吉姆和卡特之间的空间?

   Name in ADUC: cn="Jim Carter"
   In powershell: "cn=\`"Jim Carter\`""

   The output I get is Jim, the space and string Carter are lost. 

1 个答案:

答案 0 :(得分:2)

当参数传递给外部实用程序时,PowerShell具有隐藏的重新报价逻辑

您看到的是 Windows PowerShell 中的错误(此问题已在PowerShell Core 中修复):

简而言之,"cn=\`"Jim Carter\`""cn=\"Jim Beam\"的形式传递给外部可执行文件,这意外地变成了两个参数-请注意该参数是不是 not 将双引号(作为一个整体),即使需要使用双引号。

解决方法:

作为Active Directory中可分辨名称的一部分,组件值(例如字段Jim Beam的{​​{1}})通常不需要双引号,即使它们包含空格。因此,也许以下操作将起作用(取决于您所调用的可执行文件的行为)。

cn

如果确实需要可执行文件才能最终看到字符串文字someExternalTool.exe "cn=Jim Beam" ,则必须使用cn="Jim Beam"stop-parsing symbol

--%

如果您希望可执行文件看到someExternalTool.exe --% "cn=\"Jim Beam\"" ,即带有cn=\"Jim Beam\"字符。 "-转义,使用\

请注意,使用someExternalTool.exe --% "cn=\\\"Jim Beam\\\""会排除将PowerShell变量用作同一命令的一部分。


PowerShell Core 中,您的原始参数--%作为
"cn=\`"Jim Carter\`""传递-即 with 必需用双引号作为整体 -这样就不会出现意料之外的参数拆分问题,并且目标程序在执行自己的参数解析后会看到"cn=\"Jim Carter\""。 / p>

如果您需要目标程序来查看cn="Jim Beam",则必须使用
cn=\"Jim Beam\"-或使用单引号,
"cn=\\\`"Jim Beam\\\`"" < / p>


顺便说一句:需要'cn=\\\"Jim Beam\\\"'-转义\个字符。传递给外部程序-除了PowerShell的 own 转义之外-本身应该被视为错误,但这是一个长期存在的问题,为了维护向后兼容性,可能无法修复:参见this GitHub issue