pwsh -命令正在删除引号

Chr*_* G. 4 powershell

在 pwsh 中调用以下命令:

Write-Host '{"drop_attr": "name"}' 
Run Code Online (Sandbox Code Playgroud)

结果正常:

{"drop_attr": "name"}
Run Code Online (Sandbox Code Playgroud)

现在通过 pwsh 执行相同操作:

pwsh -Command Write-Host '{"drop_attr": "name"}'
Run Code Online (Sandbox Code Playgroud)

结果缺少引号和方括号?

drop_attr: name
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 18

更新

  • PowerShell 7.3.0基本上解决了该问题,但Windows有选择性例外- 请参阅此答案以了解详细信息。

  • 对于跨版本、跨版本的代码,Native底部讨论的模块可能仍然令人感兴趣。


不幸的是,PowerShell 处理带有嵌入"字符的参数传递。到外部程序- 包括 PowerShell 自己的 CLI ( pwsh) -从根本上被破坏(并且一直如此),至少到 PowerShell 7.2.x 为止

您需要手动\转义嵌入参数中的"实例,以便将它们正确传递到外部程序(在本例中也恰好是PowerShell):

# 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\"}'' '
Run Code Online (Sandbox Code Playgroud)

请注意,我假设您的意图是传递 JSON 字符串,因此内部'' ... ''引用(转义单引号)可确保pwsh最终看到单引号字符串 ( '...')。(不需要显式输出命令;PowerShell隐式打印命令和表达式输出)。

在 Windows 上演示这一点的另一种方法是通过标准choice.exe实用程序,重新设计为简单地打印其/m(消息)参数(后跟 verbatim [Y,N]?Y):

# 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
Run Code Online (Sandbox Code Playgroud)

请注意,在PowerShell内部\,如果使用脚本块 ( ) 进行调用,则可以避免使用 -escaping pwsh-但这{ ... }在调用PowerShell本身时有效,而在调用其他外部程序时无效

# NOTE: Works from PowerShell only.
pwsh -Command { '{"drop_attr": "name"}' }
Run Code Online (Sandbox Code Playgroud)

"自 PowerShell 7.2.1 起,有关PowerShell 对嵌入外部程序调用的参数的错误处理的背景信息:

  • 此 GitHub 文档问题包含背景信息。

  • GitHub Issue #1995讨论了该问题,此评论中总结了损坏行为的详细信息以及手动解决方法;截至 PowerShell [Core] 7 的讨论状态似乎是:

    • [查看顶部更新]修复被视为实验性功能,最早可能在 v7.3 中成为正式功能。它是否会成为常规功能——即默认行为是否会得到修复,或者修复是否需要选择加入,甚至该功能是否会成为正式功能——还有待观察。

      • 修复默认行为将严重破坏向后兼容性;截至撰写本文时,这从未被允许,但关于是否允许将来发生重大更改以及如何管理它们的讨论已经开始:请参阅GitHub 问题 #13129
    • 请参阅GitHub PR #14692 了解相关的实验性功能,但是,截至撰写本文时,该功能缺少msiexecWindows 上批处理文件和样式可执行文件的重要调节 - 请参阅GitHub 问题 #15143

  • 同时,您可以使用模块中的 PSv3+ie辅助函数(在 PSv5+ 中,从PowerShell Gallery安装),该函数在内部补偿所有损坏的行为并允许按预期传递参数;例如,然后就可以正常工作了。是一个跨版本向前兼容的解决方案(即它也适用于 PowerShell (Core) 7.3+),并且还补偿了v7.3+ 中修复的某些类型的 CLI 的行为。NativeInstall-Module Native
    ie pwsh -Command ' ''{"drop_attr": "name"}'' '
    ie