Powershell pwsh-命令正在删除引号

Powershell pwsh-命令正在删除引号,powershell,Powershell,在pwsh中调用以下命令: Write-Host '{"drop_attr": "name"}' pwsh -Command Write-Host '{"drop_attr": "name"}' 结果正常: {"drop_attr": "name"} 现在通过pwsh执行相同操作: Write-Host '{"drop_attr": "name"}' pwsh -Command Write-Host '{"drop_attr": "name"}' 结果是缺少引号和方括号 drop_

在pwsh中调用以下命令:

Write-Host '{"drop_attr": "name"}' 
pwsh -Command Write-Host '{"drop_attr": "name"}'
结果正常:

{"drop_attr": "name"}
现在通过pwsh执行相同操作:

Write-Host '{"drop_attr": "name"}' 
pwsh -Command Write-Host '{"drop_attr": "name"}'
结果是缺少引号和方括号

drop_attr: name

不幸的是,从PowerShell 7.1开始,PowerShell使用嵌入的
字符向外部程序传递参数的处理(包括PowerShell自己的CLI(
pwsh
),从根本上被打破了

您需要手动
\
-转义
嵌入参数中的实例
,以便将它们正确传递给外部程序:

pwsh -Command ' ''{\"drop_attr\": \"name\"}'' '
注意,我假设您的目的是传递一个JSON字符串,因此内部的
“”…“”
quoting(转义单引号),它确保
pwsh
最终看到一个带引号的字符串(
“…”
)。(无需显式输出命令;PowerShell隐式打印命令和表达式输出)


请注意,如果使用脚本块(
{…}
)调用
pwsh
,则可以从PowerShell内部避免
\
-转义的需要,但是仅在调用PowerShell本身时有效,而不是在调用其他外部程序时有效:

# NOTE: Works from PowerShell only.
pwsh -Command { '{"drop_attr": "name"}' }

关于PowerShell在外部程序调用中嵌入
的参数处理失败的背景信息
,自PowerShell 7.1起:

  • 包含背景信息

  • 讨论问题,已中断行为的详细信息以及手动解决方法总结在中;截至PowerShell[Core]7的讨论状态似乎是:

    • 对于v7.2,修复最早被视为一种功能。它是否会成为一种常规功能,即默认行为是否会被修复,修复是否需要选择加入,或者即使该功能将成为正式功能,仍有待观察

      • 修复默认行为将严重破坏向后兼容性;在撰写本文时,这是不允许的,但关于将来是否允许以及如何管理的讨论已经开始:请参阅
    • 请参阅,但在撰写本文时,它缺少批处理文件和Windows上的
      msiexec
      -样式可执行文件的重要功能-请参阅

  • 同时,您可以使用中的PSv3+
    ie
    帮助函数(在PSv5+中,使用的
    安装模块本机
    进行安装),该函数在内部补偿所有中断的行为,并允许按预期传递参数;例如,
    ie pwsh-Command''{“drop_attr”:“name”}'
    将正常工作


另一种方式。您使用的是Windows还是Unix

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

{"drop_attr":"name"}
另一种方法是使用“编码命令”


可能是问题!谢谢我在MacOS上,我让它在一行中工作如果您从PowerShell调用,
pwsh-Command{Write Host'{“description”:“Test program”}
免费为您提供此功能(在后台使用
-encodedcomma
)。