2017-05-02 7 views
1

JQでWindowsバッチファイルを使用し、選択フィルタをパイプ処理しようとしています。JQ with Windows Batch - 選択に失敗する

{ 
    "name": "test-mmc-deploy", 
    "id": "local$3d2075c5-73c0-47aa-8df5-cee3a70f68c4", 
    "lastModified": "Mon, 1 May 2017 13:56:15.980 AEST", 
    "servers": [ 
    "local$520ee705-bdbb-4132-94cf-63bb213d2b46" 
    ], 
    "status": "DEPLOYED", 
    "applications": [ 
    "local$f3d791bd-14d9-4491-9541-5fa04d8c3164" 
    ], 
    "href": "http://localhost:9090/mmc-console-3.8.2/api/deployments/local$3d2075c5-73c0-47aa-8df5-cee3a70f68c4", 
    "clusterNames": [], 
    "reconciled": false, 
    "clusterIds": [] 
} 

通常のコマンドラインJQは、カールと連携し、次のように出力を提供します:JQで解析されている

例JSON

カール--basic -u管理者:管理者http://localhost:9090/mmc-console-3.8.2/api/deployments |しようとしている "ID

|「(テスト-MMC-デプロイ\ローカル$ 3d2075c5-73c0-47aa-8df5-cee3a70f68c4 "を

.nameの== \)" を選択し、[] .dataの" JQ Windowsのバッチファイルで作業以下のコマンドは、エスケープ文字の悪夢を作成してもらう。いくつかの助けをしてください必要があります。%% app_deploy_list %%は、上記の宣言JSONを保持している

for /f "tokens=*" %%a in ('echo %%app_deploy_list%% ^| jq "".data[] ^| select(.name==\"test-mmc-deploy\"^).id""') do (set app_id=%%a) 
echo Application found: %app_id% 

を。

私は取得していますエラーを次のとおりです: 'select'は認識されません

+0

なぜ、%app_deploy_list%ではなく、%% app_deploy_list %%を使用していますか? – SomethingDark

+0

こんにちはSomethingDark、それは間違いですが、私はそれを削除しますが、バッチコンパイラには選択エラーのための違いはありません。 – Sam

答えて

1

不必要に物事をエスケープしているので、コマンドインタープリタが文字通り挿入している可能性があります。それとあなたの二重引用符の使用は矛盾しています。あなたはおそらく素早くストリングをカットし、フィルターは実際には追加のパイプコマンドとして実行されています。直接コマンドプロンプトでこれを実行する

私の作品:

for /f "tokens=*" %a in ('jq ".data[] | select(.name==\"test-mmc-deploy\").id" input.json') do (echo "Application found: %a") 

を次にバッチファイルで、あなたはだけあなたのループ変数のため%を倍増する必要があります。

for /f "tokens=*" %%a in ('jq ".data[] | select(.name==\"test-mmc-deploy\").id" input.json') do (
    set app_id=%%a 
) 
echo Application found: %app_id% 

カールレスポンスをjqに直接パイプするには、パイプをエスケープするだけです(他の方法はありません)。

for /f "tokens=*" %%a in ('curl --basic -u admin:admin http://localhost:9090/mmc-console-3.8.2/api/deployments ^| jq ".data[] | select(.name==\"test-mmc-deploy\").id"') do (
    set app_id=%%a 
) 
echo Application found: %app_id% 
+0

私は仕事に驚いています。一般に '' ''の内部の '|'と ')'はエスケープする必要があります。 – SomethingDark

+0

こんにちはMercado、私はファイルを保存するが、バッチの一部として作成されている変数を使用したくない – Sam

+0

これを使用しようとしている/ f "tokens = *" %% a in( 'echo%app_deploy_list は、次のものを生成します:jq:error:%^ | jq ".data []^| select ^(name == \" test-mmc-deploy \ "^)。構文エラー、予期しないINVALID_CHARACTER、$ end(Windowsのcmdシェルで問題を引用していますか?):、行1: 。データ[]^| ^(.name == "test-mmc-deploy" ^)を選択します。id – Sam

0

Windowsはjqの出力をselectにパイプしようとしていますが、実行可能ファイルselectが見つかりません。

私はcurljqに慣れていませんが、リテラル|が必要と思われます。あなたが使用している引用コマンド形式では、を使ってリテラルを作成することができます。^^^|

関連する問題