我可以在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.
答案 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。