我正在尝试使用“knife ec2 server create”创建一个 amazon EC2 实例,并传入 JSON 来使用 -j 选项覆盖默认设置,其中 $json 是正确格式的 JSON 文本,无论我是否引用变量,我都会收到相同的错误:
PS C:\Users\chef> knife ec2 server create --region ... -j $json
失败并出现以下错误:
C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `initialize': A JSON text must
at least contain two octets! (JSON::ParserError)
from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `new'
from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse'
from C:/Users/chef/AppData/Local/chefdk/gem/ruby/2.1.0/gems/knife-ec2-0.12.0/lib/chef/knife/ec2_server_create.rb
:218:in `block in <class:Ec2ServerCreate>'
如果我尝试将 JSON 放在命令行上,我会收到不同的错误:
C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse': 757: unexpected token
at '{fusion_**** : *** }' (JSON::ParserError)
from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse'
from C:/Users/chef/AppData/Local/chefdk/gem/ruby/2.1.0/gems/knife-ec2-0.12.0/lib/chef/knife/ec2_server_create.rb
:218:in `block in <class:Ec2ServerCreate>'
from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/mixlib-cli-1.5.0/lib/mixlib/cli.rb:235:in `call'
我无法找到有关 knife 和 PowerShell 的任何已知问题,尽管它可以与“{}”的最小 JSON 一起使用,但它似乎无法与其他任何东西一起使用。
有人自己做过这个工作吗?
答案1
shell 可能吃了你的引号,因为两个错误消息都显示它们不存在。
{fusion_**** : *** }
不是有效的 JSON,它肯定需要用{"fusion_****" : "***"}
引号括起来的键和值(假设值是一个字符串;当然,文字true
、false
、 和null
... 和数字值没有用引号括起来)。
我猜想需要进行如下设置......
$json = '{"fusion_****" : "***"}'
...其中单引号导致双引号被解释为文字。或者这样:
...但是,我对 powershell 一无所知,只是对 shell 有所了解。如果这不能帮你解决问题,也许发布你分配变量的代码会有所帮助。
答案2
我发现对于 Ruby,您需要使用反斜杠来转义 JSON 中的引号。
由于我在 PowerShell 字符串中使用了替换,因此我还使用以下代码转义了字符串中的引号:重音符号对于 PowerShell。
例如,以 JSON 格式获取此内容:
{ "fusion": "****" }
您可以像这样对 PowerShell 进行编码,使用单引号(无替换):
$json = '{ \"fusion_****\" : \"***\" }'
或者像这样,使用双引号(启用替换,但在此示例中未使用):
$json = "{ \`"fusion_****\`" : \`"***\`" }"