powershell pwsh -命令正在删除引号

oaxa6hgo  于 2022-12-23  发布在  Shell
关注(0)|答案(3)|浏览(156)

在pwsh中调用以下内容:

Write-Host '{"drop_attr": "name"}'

结果合格:

{"drop_attr": "name"}

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

pwsh -Command Write-Host '{"drop_attr": "name"}'

结果是否缺少引号和方括号?

drop_attr: name
fzwojiic

fzwojiic1#

    • 更新**:
      • PowerShell 7.3.0 * 大部分 * 修复了该问题,* Windows*上 * 有选择性例外 *,似乎在7.3.1及更高版本中**修复需要 * 选择加入-有关详细信息,请参阅this answer
  • 对于跨版本、跨版本的代码,底部讨论的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\"}'' '

注意,我假设您的目的是传递JSON字符串,因此使用了内部'' ... ''引号(转义单引号),这确保pwsh最终看到的是单引号字符串('...')。PowerShell * 隐式 * 打印命令和表达式输出)。
在Windows上演示这一点的另一种方法是使用标准的choice.exe实用程序,该实用程序只是打印其/m(消息)参数(后面跟一个完整的[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

请注意,如果您使用 * script block { ... }调用pwshfrom * inside * PowerShell,则可以避免使用\-转义,但仅在调用PowerShell本身时有效, 不适用于其他外部程序*:

# NOTE: Works from PowerShell only.
pwsh -Command { '{"drop_attr": "name"}' }
    • 有关PowerShell在外部程序调用中对带有嵌入式"的参数的错误处理的背景信息**(自PowerShell 7.2.1起):
  • This GitHub docs issue包含背景信息。
  • GitHub issue #1995讨论了这个问题,并且在这个评论中总结了中断行为的细节以及手动解决方法;从PowerShell [Core] 7**起,**讨论的状态似乎是:
      • 一个修复被认为是experimental feature,它 * 可能 * 最早在v7.3中**成为官方功能。它是否会成为常规功能-即 * 默认 * 行为是否会被修复,修复是否需要选择加入,甚至该功能是否会成为官方功能-仍有待观察。
  • 修复默认行为将严重破坏向后兼容性;在写这篇文章时,这是不允许的,但是关于是否允许在将来进行突破性的更改以及如何管理它们的讨论已经开始了:参见GitHub issue #13129
  • 请参见GitHub PR #14692 for the relevant experimental feature,但是在撰写本文时,它缺少Windows上批处理文件和msiexec样式的可执行文件的重要适应性-请参见GitHub issue #15143
  • 同时,您可以使用**Native module中的PSv3 + ie helper函数**(在PSv5+中,使用PowerShell Gallery中的Install-Module Native安装),该函数可以在内部补偿所有损坏的行为,并允许按预期传递参数;例如,

ie pwsh -Command ' ''{"drop_attr": "name"}'' '将正常工作。

vtwuwzda

vtwuwzda2#

换个方式。你用的是Windows还是Unix?

pwsh -c "[pscustomobject]@{drop_attr='name'} | convertto-json -compress"

{"drop_attr":"name"}
plicqrtu

plicqrtu3#

另一种方法是使用“编码命令”。

> $cmd1 = "Write-Host '{ ""description"": ""Test program"" }'"
> pwsh -encoded ([Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($cmd1)))
{ "description": "Test program" }

相关问题