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

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

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

我如何按以下方式处理/逃避Jim和Carter之间的空间?
   Name in ADUC: cn="Jim Carter"
   In powershell: "cn=\`"Jim Carter\`""

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

最佳答案

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

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

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

解决方法:

作为Active Directory中专有名称的一部分,组件值(例如字段Jim Beamcn)通常不需要双引号,即使它们包含空格。因此,也许以下方法会起作用(取决于您要调用的可执行文件的行为)。

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\`"""cn=\"Jim Carter\""的形式传递-即以必要的双引号作为整体-因此不会发生意料之外的参数拆分问题,并且您的目标程序在执行它后将看到cn="Jim Beam"自己的参数解析。

如果您需要目标程序查看cn=\"Jim Beam\",则必须使用"cn=\\\`"Jim Beam\\\`""-或使用单引号'cn=\\\"Jim Beam\\\"'
顺便说一句:需要\-转义"字符。传递给外部程序(除了PowerShell自身的转义功能之外)本身应该被视为错误,但这是一个长期存在的错误,可能不会得到修复以保持向后兼容性:请参阅this GitHub issue

关于powershell - 在Power-Shell中转义双引号字符时如何处理空格键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55453194/

10-15 22:47