# Note: The embedded '' sequences are the normal and expected
# way to escape ' chars. inside a PowerShell '...' string.
# What is *unexpected* is the need to escape " as \"
# even though " can normally be used *as-is* inside a '...' string.
pwsh -Command ' ''{\"drop_attr\": \"name\"}'' '
# This *should* preserve the ", but doesn't as of v7.2
PS> choice /d Y /t 0 /m '{"drop_attr": "name"}'
{drop_attr: name} [Y,N]?Y # !! " were REMOVED
# Only the extra \-escaping preserves the "
PS> choice /d Y /t 0 /m '{\"drop_attr\": \"name\"}'
{"drop_attr": "name"} [Y,N]?Y # OK
3条答案
按热度按时间fzwojiic1#
Native
模块可能仍然有用。不幸的是,PowerShell对将带有嵌入式
"
字符的参数传递给 * 外部程序*(包括PowerShell自己的CLI(pwsh
))的处理从根本上中断了(并且一直如此),至少在PowerShell 7.2.x之前:\
-转义嵌入在参数中的"
示例**,以便将它们正确传递到外部程序(在本例中 * 恰好也是 * PowerShell):注意,我假设您的目的是传递JSON字符串,因此使用了内部
'' ... ''
引号(转义单引号),这确保pwsh
最终看到的是单引号字符串('...'
)。PowerShell * 隐式 * 打印命令和表达式输出)。在Windows上演示这一点的另一种方法是使用标准的
choice.exe
实用程序,该实用程序只是打印其/m
(消息)参数(后面跟一个完整的[Y,N]?Y
):请注意,如果您使用 * script block (
{ ... }
)调用pwsh
,from * inside * PowerShell,则可以避免使用\
-转义,但仅在调用PowerShell本身时有效, 不适用于其他外部程序*:"
的参数的错误处理的背景信息**(自PowerShell 7.2.1起):msiexec
样式的可执行文件的重要适应性-请参见GitHub issue #15143。Native
module中的PSv3 +ie
helper函数**(在PSv5+中,使用PowerShell Gallery中的Install-Module Native
安装),该函数可以在内部补偿所有损坏的行为,并允许按预期传递参数;例如,ie pwsh -Command ' ''{"drop_attr": "name"}'' '
将正常工作。vtwuwzda2#
换个方式。你用的是Windows还是Unix?
plicqrtu3#
另一种方法是使用“编码命令”。