Я пытаюсь создать экземпляр amazon EC2, используя «Knife ec2 server create» и передавая 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'
Мне не удалось найти какие-либо известные проблемы с ножом и PowerShell, и хотя он работает с минимальным JSON "{}", похоже, он не работает ни с чем другим.
У кого-нибудь это работает на себя?
Оболочка может съедать ваши цитаты, поскольку оба сообщения об ошибках показывают, что они отсутствуют.
{fusion_**** : *** }
недействителен JSON, он обязательно должен быть {"fusion_****" : "***"}
с указанием ключа и значения (при условии, что значение является строкой; литералы true
, false
, и null
... и числовые значения, конечно, не цитируются).
Я бы предположил, что его нужно установить примерно так ...
$json = '{"fusion_****" : "***"}'
... где одинарные кавычки заставляют двойные кавычки интерпретироваться как литералы. Или это:
Что такое буквальный escape-символ в Powershell?
... однако я буквально ничего не знаю о PowerShell, только о оболочках в целом. Возможно, размещение кода, в котором вы назначаете переменную, поможет, если это не решит проблему за вас.
Я обнаружил, что вам нужно избегать кавычек в JSON с помощью обратной косой черты для Ruby.
Поскольку я использовал подстановку в своей строке PowerShell, я также избежал кавычек в строке с помощью акцент могила для PowerShell.
Например, чтобы получить это в JSON:
{ "fusion": "****" }
вы можете закодировать PowerShell так, используя одинарные кавычки (без замены):
$json = '{ \"fusion_****\" : \"***\" }'
или вот так, с двойными кавычками (подстановка включена, но не используется в этом примере):
$json = "{ \`"fusion_****\`" : \`"***\`" }"