我想做的很简单.我有一个PowerShell脚本,它应该接受JSON文本作为参数.看起来一点都不简单!
我查看了这些页面,试图了解应该如何做到这一点.about_PowerShell_exe、about_Parsing和about_Quoting_Rules.我找不到明确的解释.事实上,我看到的是与这些文件相矛盾的.命令行规则与常规规则不同.
我用的是PowerShell 5.1
我使用以下脚本进行测试:
测试PS1
param($json)
Write-Host $json
我try 传递这个JSON文本.
{"name" : "value"}
我所看到的.
powershell .\测试PS1 "{"name" : "value"}"
name : value
没有牙套.完全go 掉了双引号. 让我们试着逃脱他们.
powershell .\测试PS1 "{`"name`" : `"value`"}"
Missing closing '}' in statement block or type definition.
反勾符号并不起作用.让我们试着用双引号引起来.加倍是命令行魔术中非常流行的一种技巧.
powershell .\测试PS1 "{""name"" : ""value""}"
The string is missing the terminator: ".
让我们试着三倍的分数,因为为什么不.
powershell .\测试PS1 "{"""name""" : """value"""}"
Unexpected token ':' in expression or statement.
好的,让我们来试试单引号.
powershell .\测试PS1 '{"name" : "value"}'
{name : value}
我们有大括号,但没有双引号.让我们再一次try 逃脱他们.
powershell .\测试PS1 '{`"name`" : `"value`"}'
{`name` : `value`}
在ps有机会转义它们之前,有些东西吃掉了我们的双引号.
加倍?
powershell .\测试PS1 '{""name"" : ""value""}'
{name : value}
翻三倍?
powershell .\测试PS1 '{"""name""" : """value"""}'
{"name" : "value"}
它起作用了!多难看啊!
我想知道有没有人能很好地解释发生了什么事.我非常感谢任何文档/文章上的链接,这些链接可以解释它的实际工作原理.三个引号对我来说看起来并不太糟糕,但我的JSON参数有几层嵌套,看起来我可以在元素之前使用7个引号之类的东西结束.
-PowerShel.exe中的EncodedCommand给我一种悲伤的感觉,没有简单的解决方案.
Update.正如@mklement0所指出的,首先处理该命令行的是一个CMDshell .CMD使用双引号来处理其中包含空格的参数.它会在到达Powershell.exe之前删除成对的双引号.这意味着
- CMD在任何情况下都会删除第一个和最后一个引号
- 我们可以对所有内部引号进行CMD转义
powershell .\测试PS1 "{\"name\" : \"value\"}"
Unexpected token ':' in expression or statement.
在本例中,此字符串达到了Powershell.exe {"name" : "value"}
.PowerShell已try 执行它,此代码无效.它try 执行此文本,因为默认情况下-Command是一个参数.要使其成为字符串,我们需要另一对引号,这里PowerShell的单引号非常有用.
powershell .\测试PS1 "'{\"name\" : \"value\"}'"
{"name" : "value"}
更好的解决方案是使用-File,就像@mklement0建议的那样.在这种情况下,参数不会被解释为ps代码.
powershell -File .\测试PS1 "{\"name\" : \"value\"}"