Назад | Перейти на главную страницу

Нож не анализирует переменную JSON в PowerShell

Я пытаюсь создать экземпляр 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_****\`" : \`"***\`" }"