2017-03-16 3 views
1

私はPowerShellを使用してGitHub APIを呼び出しています。結果はConvertFrom-Jsonコマンドレットを使用してPowerShellオブジェクトに変換するJSON配列です。これは私にオブジェクトのPowerShell配列を与えます。しかし、私はパイプに直接この-オブジェクトを選択するには、私は何を取得する場合:Powershell Github APIを呼び出す:ConvertFrom-Jsonパイプラインの謎

Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Select-Object -Property login, id 

は、しかし、私は変数にConvertFrom-JSONの結果を入れ、その後、オブジェクトを選択するための変数を渡した場合、それが動作します:

$json = Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json 
$json | Select-Object -Property login, id 

私は謎です。なぜ、1行バージョンは機能しないのですか?

+1

なぜ起こっているのかわかりませんが、invoke-restmethodを使用すると、convertfrom-jsonを使用する必要はありません。これは、オブジェクトに自動的に変換されるためです。 –

+0

私はInvoke-RestMethodについて知らなかった - ありがとう - それはいいです。私はまだ一時変数が必要です。謎は残っている。 – Edward

+0

ここの例2は、あなたのコードが動作するはずであることを示唆しています。https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/convertfrom-json –

答えて

1

1つのライナーは現在の形では動作しませんなぜ私はわからないんだけど、これはそれを修正することがあります

(Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3").content | ConvertFrom-Json | Select-Object -Property login, id 

それとも、代わりにこれを行うことができます:

(Invoke-RestMethod -Uri "https://api.github.com/organizations?per_page=3") | Select-Object -Property login, id 
+0

優秀 - 最初の例がうまくいきます(私は内容は必要ありませんが、害はありません)。 2番目の例はそのままでは機能しません。括弧を追加する必要があります。だから今私の質問は:なぜ私はそれを動作させるために一時変数またはカッコが必要ですか? – Edward

+0

これは、Invoke-WebRequestがパイプラインに物事を送る方法と関係しているかもしれませんが、括弧はコマンドがパイプラインを下る前に完全に完了することを保証します。しかしおそらく誰かがパワーシェルの内部についてもっと知識があり、答えが可能かもしれません。 –

1

これをそれがパワーシェルの仕組みだからです。

Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Get-Member 

配列を返しますので、あなたは、アレイ上select-objectをやって起動した場合、それは動作しません、配列は、それらの性質を持っていないため、あなたはforeachのために、配管によって、その回避することができます。

Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Foreach-Object { $_ | select id,login } 

編集:Invoke-RestMethodがこれを実行するより良い方法です。 edit2:コマンドの前後に括弧を付けてコマンドを実行し、コマンドの実行時に出力全体を送信するので、コマンドが完了した後にだけパイプが開始されますが、最初の結果が準備完了です。

0

Invoke-WebRequestInvoke-RestMethodの出力は、その出力が配列であっても、パイプライン上に出力されます。変数を出力に格納して配管するか、またはサブ式でWebリクエストを実行すると、配列要素の代わりに配列要素がパイプラインに配置されます。

> Invoke-RestMethod -Uri "https://api.github.com/organizations?per_page=3" | % { $_.GetType() } 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 


> (Invoke-RestMethod -Uri "https://api.github.com/organizations?per_page=3") | % { $_.GetType() } 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  False PSCustomObject       System.Object 
True  False PSCustomObject       System.Object 
True  False PSCustomObject       System.Object 
関連する問題