在 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 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
| 归档时间: |
|
| 查看次数: |
3501 次 |
| 最近记录: |