web-dev-qa-db-ja.com

PowerShellでJSON変数を解析しないナイフ

「knifeec2servercreate」を使用してAmazonEC2インスタンスを作成しようとしていますが、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で機能しますが、他のものでは機能しないようです。

誰かがこれを自分で働いていますか?

2
Neil Simon

両方のエラーメッセージが引用符がないことを示しているため、シェルが引用符を食べている可能性があります。

{fusion_**** : *** }は有効なJSONではないため、キーと値の両方を引用符で囲んだ{"fusion_****" : "***"}である必要があります(値が文字列であると仮定します。リテラルはtruefalse 、およびnull...および数値はもちろん引用符で囲まれていません)。

このように設定する必要があると思います...

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

...一重引用符により二重引用符がリテラルとして解釈される場合。またはこれ:

Powershellのリテラルエスケープ文字は何ですか?

...しかし、私は文字通りPowerShellについて何も知りません。一般的には、シェルだけです。変数を割り当てている場所にコードを投稿しても解決しない場合は、おそらく役立つでしょう。

1

私が見つけたのは、Rubyのバックスラッシュを使用してJSONの引用符をエスケープする必要があるということでした。

PowerShell文字列で置換を使用したため、PowerShellの場合は文字列内の引用符もaccent Graveでエスケープしました。

たとえば、これをJSONで取得するには:

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

powerShellは、一重引用符(置換なし)を使用して、次のようにコーディングできます。

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

または、このように、二重引用符を使用します(置換は有効ですが、この例では使用されていません)。

    $json = "{ \`"fusion_****\`" : \`"***\`" }"
0
Dan Konigsbach