2017-03-16 3 views
1

PowerShell을 사용하여 GitHub API를 호출하고 있습니다. 결과는 ConvertFrom-Json cmdlet을 사용하여 PowerShell 객체로 변환하는 JSON 배열입니다. 이것은 PowerShell 객체 배열을 제공합니다. 직접 개체를 선택하려면 그러나 때를 파이프를이 내가 아무것도 얻을 : 나는 변수에은 ConvertFrom-JSON 결과를 넣을 경우PowerShell Github API 호출 : ConvertFrom-Json 파이프 라인 미스터리

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

을 다음-개체를 선택하려면 변수를 통과, 그것은 작동 :

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

나는 신비화되었습니다. 한 행 버전이 작동하지 않는 이유는 무엇입니까? 하나의 라이너가 현재의 형태에서 작동하지 않는 이유

+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

는 잘 모르겠지만,이 문제를 해결할 수 있습니다

(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

우수 - 첫 번째 예제가 작동합니다 (나는 내용이 필요 없지만 해를 끼치 지 않습니다). 두 번째 예제는 그대로 작동하지 않으므로 괄호를 추가해야합니다. 그래서 내 질문은 지금 : 왜 임시 변수 또는 괄호가 필요합니까 작동하도록하려면? – Edward

+0

Invoke-WebRequest가 파이프 라인으로 물건을 보내기 시작하는 방법과 관련이있을 수 있습니다. 내 생각에 괄호는 명령이 파이프 라인을 통과하기 전에 명령이 완전히 완료되도록합니다. 그러나 아마 대답 할 수있는 파워 쉘 내부에 대해 더 많이 알고있는 사람이있을 것입니다. –

1

이를 이것이 파워 쉘의 작동 방식이기 때문에 발생합니다.

Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Foreach-Object { $_ | select id,login } 
: 당신이 배열에 select-object 일을 시작할 경우
Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Get-Member 

는,이 배열은 이러한 속성이 없기 때문에, 당신은 foreach 문을 배관에 의해, 그 해결할 수 있습니다 작동하지 않습니다, 배열을 돌려줍니다

편집 : Invoke-RestMethod가 더 나은 방법입니다. edit2 : 명령을 둘러싼 괄호로 명령을 실행하고 명령이 완료되면 전체 출력을 보내므로 명령이 완료된 후에 만 ​​파이프가 시작되지만 첫 번째 결과가 준비되면 끝납니다.

0

Invoke-WebRequestInvoke-RestMethod은 출력이 배열 인 경우에도 출력이 파이프 라인에 단일 항목으로 저장되는 것으로 보입니다. 변수에 출력을 저장 한 다음 서브 표현식에서 웹 요청을 실행하면 배열 요소가 배열 자체 대신 파이프 라인에 배치됩니다.

> 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