Faca não analisando a variável JSON no PowerShell

2

Estou tentando criar uma instância amazon EC2 usando "knife ec2 server create" e passando em JSON para substituir as configurações padrão usando a opção -j em que $ json é formado corretamente no texto JSON e recebo o mesmo erro se citar a variável ou não:

PS C:\Users\chef> knife ec2 server create --region ... -j $json

Ele falha com este erro:

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>'

Se eu tentar colocar o JSON na linha de comando, recebo um erro diferente:

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'

Não consegui encontrar nenhum problema conhecido com o knife e o PowerShell e, embora funcione com o JSON mínimo de "{}", ele não parece funcionar com mais nada.

Alguém tem esse trabalho para si?

    
por Neil Simon 13.01.2016 / 20:14

2 respostas

1

O shell pode estar comendo suas citações, já que ambas as mensagens de erro mostram que elas estão ausentes.

{fusion_**** : *** } não é válido JSON, definitivamente precisa ser {"fusion_****" : "***"} com chave e valor cotados (supondo que o valor seja uma string; os literais true , false e null .. e valores numéricos não são citados, é claro).

Eu acho que é necessário definir algo assim ...

$json = '{"fusion_****" : "***"}'

... onde as aspas simples fazem com que as aspas duplas sejam interpretadas como literais. Ou isso:

Qual é o caractere de escape literal em Powershell?

... no entanto, eu literalmente não sei nada sobre powershell, apenas shells em geral. Talvez postar o código onde você está atribuindo a variável ajudaria, se isso não resolver isso para você.

    
por 14.01.2016 / 04:32
0

O que eu descobri foi que você precisa escapar das aspas em JSON com uma barra invertida para Ruby.

Como usei substituição em minha sequência do PowerShell, também escapei das aspas na sequência com acento grave para o PowerShell.

Por exemplo, para obter isso em JSON:

    { "fusion": "****" }

você pode codificar o PowerShell assim, com aspas simples (sem substituição):

    $json = '{ \"fusion_****\" : \"***\" }'

ou assim, com aspas duplas (substituição ativada, mas não usada neste exemplo):

    $json = "{ \'"fusion_****\'" : \'"***\'" }"
    
por 31.08.2017 / 00:43