2016-07-03 10 views
-2

これはJSONです。バッチファイルの「安定」オブジェクトから変数(引用符なし)までのバージョンである「1.1.3」のみを設定したいと思います。 将来の作曲家が "バージョン": "1.1.3.6"または "バージョン": "1.1.3-beta2"に変更した場合、私はそれを動的にしたいと思っています。バッチファイルParse JSON

ありがとうございます。

myFile.json

{ 
    "stable": [{"path": "/download/1.1.3/composer.phar", "version": "1.1.3", "min-php": 50300}], 
    "preview": [{"path": "/download/1.1.3/composer.phar", "version": "1.1.3", "min-php": 50300}], 
    "snapshot": [{"path": "/composer.phar", "version": "334d0cce6b056e7555daf4c68c48cbe40ee4d51a", "min-php": 50300}] 
} 
+0

フィールドの位置が決して変わらないと仮定すると、これはかなり簡単な 'for/f'ループです。これまでに何を試しましたか? – SomethingDark

+0

ええ、しかし、私は "http://getcomposer.org/versions"から取得する私は彼らが位置を変更するかどうか、cmdのパーサーがあるかどうかはわかりませんが、残念ながら、http: //stedolan.github.io/jq – Amigo

答えて

1

! JSONパーサーを使用します。データは既に階層化されています。それを客観化して階層を掘り下げることは、それをトークン化して行数を数えるよりも、より優雅です。あなたはとにかくPowerShellのスニペットを呼び出している場合

@echo off & setlocal 

set "jsonfile=test.json" 

set "psCmd="add-type -As System.Web.Extensions;^ 
$JSON = new-object Web.Script.Serialization.JavaScriptSerializer;^ 
$JSON.DeserializeObject($input).stable.version"" 

for /f %%I in ('^<"%jsonfile%" powershell -noprofile %psCmd%') do set "version=%%I" 

echo Version: %version% 

追加ボーナスとして、あなたはまた、ウェブからJSONを取得するためにInvoke-WebRequestを使用することができます。

@echo off & setlocal 

set "jsonURL=https://getcomposer.org/versions" 

set "psCmd="add-type -As System.Web.Extensions;^ 
$JSON = new-object Web.Script.Serialization.JavaScriptSerializer;^ 
$JSON.DeserializeObject((Invoke-WebRequest %jsonURL%).content).stable.version"" 

for /f %%I in ('powershell -noprofile %psCmd%') do set "version=%%I" 

echo Version: %version% 

あなたはXP/Vistaとの互換性を必要とするか、またはあなただけのPowerShellのヘルパーよりも高速に実行するスクリプトをしたい場合、あなたは同じ効果を達成するためのJScriptを使用することができます。

@if (@CodeSection == @Batch) @then 
@echo off & setlocal 

set "URL=https://getcomposer.org/versions" 

for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%URL%"') do set "ver=%%I" 

echo Version: %ver% 

goto :EOF 
@end // end Batch/begin JScript hybrid code 

var htmlfile = WSH.CreateObject('htmlfile'), 
    x = WSH.CreateObject("Microsoft.XMLHTTP"); 

x.open("GET",WSH.Arguments(0),true); 
x.setRequestHeader('User-Agent','XMLHTTP/1.0'); 
x.send(''); 
while (x.readyState != 4) WSH.Sleep(50); 

htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />'); 
var obj = htmlfile.parentWindow.JSON.parse(x.responseText); 
htmlfile.close(); 

WSH.Echo(obj.stable[0].version); 
+0

ありがとう[rojo](http://stackoverflow.com/users/1683264/rojo)あなたは素晴らしい、素晴らしい答えです! – Amigo

+0

ところで、ピートは誰ですか? – Amigo

+0

PeteとRepeteはフェンスに座っていました。ピートが落ちた。誰が残ったのですか? – rojo

0

我々は位置がコードを変更することはありませんと仮定した場合である:ピートの愛のために

@echo off 
setlocal enableDelayedExpansion 
FOR /f "skip=1 tokens=5 delims=:," %%I IN (vers.json) DO IF NOT DEFINED ver SET "ver=%%I" 
set ver=%ver:"=% 
set ver=%ver: =% 
echo !ver!