PowerShell에서 개체를 계산하는 방법은 무엇입니까?


140

PowerShell 사용 설명서에서 읽은 것처럼 핵심 PowerShell 개념 중 하나는 명령 이 텍스트 대신 개체 를 받아들이고 반환한다는 것입니다. 예를 들어, running get-alias은 많은 System.Management.Automation.AliasInfo객체를 반환 합니다.

PS Z : \> get-alias

명령 유형 이름 정의
----------- ---- ----------
개체 별 별칭 %
별명? 어디에 객체
Alias ​​ac 추가 콘텐츠
별명 asnp 애드 -PSSnapIn
별칭 고양이 Get-Content
별칭 CD 세트 위치
별명 chdir 설정 위치
...

이제이 물체의 개수를 어떻게 알 수 있습니까?

답변:


201

이렇게하면 계산됩니다.

get-alias | measure

객체와 같이 결과를 사용할 수 있습니다.

$m = get-alias | measure
$m.Count

그리고 일부 변수에 별칭을 사용하려면 Tee-Object를 사용할 수 있습니다.

$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases

Measure-Object cmdlet에 대한 자세한 내용은 Technet에 있습니다.

시간 측정을위한 Measure-Command cmdlet과 혼동하지 마십시오. (다시 Technet에서 )


3
$Counter = $(get-alias | measure).Count당신이 말한 것처럼 한 번만 발생하는 경우 항상 값 1을 반환하기 때문에 사용 했습니다.
DarkLite1

6
다른 옵션 :get-alias | measure | % { $_.Count }
Shameer

fyi : measure짧다 Measure-Object; 같은 -과 다른 물건을 많이 반환 Average, Sum, Maximum, 등 ...
BrainSlugs83

1
왜 그냥 (gal) .count? PS v3 이상의 IIRC가 필요합니다. 편집 : 이것은 이미 답변되었습니다.
uranibaba

4
우리가에있는 동안 @Shameer, 하나는 사용할 수 Get-Alias | Measure-Object | Select-Object -ExpandProperty Count없애 %하고 {}. 읽고 쓰는 것이 더 쉬운 것은 또 다른 토론입니다.
LosManos

110

@ jumbo의 대답이 짧아지면 :-) 훨씬 더 끔찍하게 할 수 있습니다. 이것은 Count선행 하위 표현식에 의해 리턴 된 배열 의 특성을 리턴합니다 .

@(Get-Alias).Count

몇 가지 참고할 사항 :

  1. Get-Alias예를 들어, 다음과 같이 임의로 복잡한 식을 넣을 수 있습니다 .

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. 강력한 솔루션을 위해서는 초기 서명 (@)이 필요 합니다. 답이 2 이상인 경우 @를 사용하거나 사용하지 않고 동등한 대답을 얻을 수 있지만 답이 0 또는 1 이면 @ 기호가 없으면 출력이 표시되지 않습니다 ! ( Count출력을 배열로 강제 하여 속성이 존재하도록합니다.)

2012.01.30 업데이트

PowerShell V2의 경우 위와 같습니다. PowerShell V3의 새로운 기능 중 하나는 Count싱글 톤에도 속성이 있으므로이 시나리오에서는 at-sign이 중요하지 않다는 것 입니다.


3
나는 이것이 오래되었다는 것을 알고 있지만 이것을 찾고있는 다른 사람들에게는 ... v3 +는 @ for count <2 Set-StrictMode -Version Latest를 사용 하지 않으면 작동하지 않는 것 같습니다 . 방금 오늘 (5.1에서)이 문제에 부딪 쳤습니다. 어떤 기능에서는 작동하지 않는 대화식으로 작동했습니다. 함수에 Set-StrictMode가 있음을 추적했습니다. 대화식으로 엄격 모드를 설정하면 작동하지 않습니다.
vr8ce

잘 잡아라, @ vr8ce! 나도 옹호하는 사람 Set-StrictMode이므로 그 사실을 눈치 should을 것입니다.
Michael Sorens

@ vr8ce의 조언을 확장하기 위해 @ ($ myObject)를 사용하여 기존 객체를 계산할 수 없었습니다. 따라서 count 속성을 테스트하기 전에 if ($myObject.PSobject.Properties.Name -contains "count")( stackoverflow.com/questions/26997511/…에서 )를 사용합니다 . 나는 PoSH가 나를 그렇게하게 만드는 것을 싫어하지만 엄격한 모드는 그만한 가치가 있습니다.
duct_tape_coder

21

괄호와 'count'만 사용하십시오. 이것은 Powershell v3에 적용됩니다

(get-alias).count

1
이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오.
Zo 님이

@ 다미 엔 OK. 나는 편집했다. SO에서 사람들은 일반적으로 첫 번째 대답에서 마지막 답으로옵니다. 그들은 갑자기 세 번째 답변에 뛰어 들지 않고 혼란스러워하지 않습니다. 그래서 나는 처음 두 가지 대답의 연속으로 만들었습니다. 그 대답은이 편집 된 것보다 더 의미가 있습니다.
prabhakaran

1
이것은 이미이 답변 에서 다룹니다 . 귀하의 기본적으로 방금 말한지 2 년 후에 이미 언급 된 내용을 반복해서 말합니다.
Liam

1
@Liam 그 대답은 powershell v2입니다. 내 대답은 powershell v3입니다. 말했듯 이이 답변은 해당 답변의 업데이트 (2012.01.30 업데이트)에서 문자 그대로 다루어집니다. 방금 코딩 부분을 썼습니다.
prabhakaran

5

@($output).Count항상 올바른 결과를 생성하지는 않습니다. 나는 그 ($output | Measure).Count방법을 사용했다 .

VMware Get-VmQuestion cmdlet에서이를 발견했습니다.

$output = Get-VmQuestion -VM vm1
@($output).Count

그 대답은 하나이지만

$output

출력을 생성하지 못했습니다 ( Measure방법 으로 생성 된 정답은 0이었습니다 ).

이것은 0과 1의 경우에만있는 것처럼 보였습니다. 제한된 테스트에서는 1보다 큰 것이 정확했습니다.


Chris, 나는 당신이 이것을 원한다는 것을 원한다고 생각합니다 : @ (Get-VmQuestion -VM vm1) .count 일단 출력이 이미 만들어지면 강제로 출력을 배열로 만들 수 없습니다. . 당신이하고있는 일입니다.
Daniel Peel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.