2017-12-01 2 views
0

저는 Powershell을 처음 접했고 문제가 있습니다. Compare-Object 또는 Sort-Object 기능을 사용할 수없는 것 같습니다. 두 개의 Arraylists가 있는데 "Table"유형의 오브젝트 10 개를 채 웁니다. 이 작동하지 않는 것Arraylists 정렬 및 비교

Compare-Object $list1 $list2 | ForEach-Object {$_.InputObject}

나는 정말 비교 아무것도 안하고 있기 때문에 생각 :

#Create Arraylists 
$list1 = new-object System.Collections.ArrayList 
$list2 = new-object System.Collections.ArrayList 


#Declare Table-Class 
class Table { 
    [String] $name 
    [Int] $number 
} 


#Fill list1 
[Int] $i = 0 
while ($i -lt 10) { 
    $entry = new-Object Table 
    $entry.name = "Name"; 
    $entry.number = $i; 
    $list1.Add($entry) 
    $i++ 
} 

#Fill list2 
[Int] $j = 10 
while ($j -gt 0) { 
    $entry = new-Object Table 
    $entry.name = "name"; 
    $entry.number = $j; 
    $list2.Add($entry) 
    $j-- 
} 

지금 나는이 같은 두 ArrayLists을 비교합니다. 누군가가 올바른 구문으로 나를 도울 수 있다면 정말 행복 할거야. 어쨌든이 비교는 어떻게 든 $false 부울을 반환한다고 생각합니다. 사실이라면 $list2$entry.number으로 정렬하고 싶습니다.

$list2 = $list2 | Sort-Object -Property { $_[1] } 

을하지만 내 목록은 전혀 변경되지 않습니다

나는 그런이를 시도하고있다. 이미 여러 가지 "솔루션"을 시도했지만 실제 솔루션 인 것은 아닙니다.

누군가가 나를 도울 수 있거나 적어도 올바른 방향으로 나를 가리킬 수 있다면 정말 기뻐할 것입니다.


편집 : 미래의 독자들을 위해, 여기에 작업 구문입니다

#sort list by the property number 
$list2 = $list2 | sort-object -Property number 

#count differences and if differences greater than 0, do stuff 
[Int] $diff 
$properties = $list1 | Get-Member -MemberType Property | Select-Object -ExpandProperty Name 

foreach ($property in $properties) { 
    $diff = 0 
    $diff = (Compare-Object $list1 $list2 -Property "$property").count 
    if ($diff -ne 0) { 
     #do stuff 
    } 
    else { 
     #do something else 
    } 
} 
+0

*** Get-Help Compare-Object *** 및 *** Get-Help Sort-Object ***로 시작하십시오. 나는 그들이 당신이 생각하는 것과 정확하게 일치하는지 확신하지 못합니다. – EBGreen

+0

아래 답변 중 하나가 문제를 해결하면 받아 들여야합니다 (해당 답변 옆의 체크 표시를 클릭하십시오). 그것은 두 가지 일을합니다. 모든 사람들이 귀하의 문제가 만족스럽게 해결되었다는 사실을 모든 사람에게 알리고, 도움을 요청한 사람에게 도움을줍니다. [전체 설명은] (http://meta.stackexchange.com/a/5235)을 참조하십시오. – Clijsters

답변

0

-Property 당신이 실제 속성의 이름을 통과 할 것으로 예상하기 때문에 귀하의 정렬이 작동하지 않습니다. 귀하의 경우 클래스 2 속성 : $name$number. $list2 | Get-Member을 사용하여 개체의 속성을 확인할 수도 있습니다. 그래서 정렬하려면, 당신은 사용할 수 있습니다 : 하나가 기대하는 것을 다르게 구현 있기 때문에

$list2 = $list2 | Sort-Object -Property number 

지금 Compare-Object가 작동하지 않는 이유입니다. 작동 방식을 설명하는 this answer을 참조하십시오.

염두에 두어야 할 또 다른 사항 : $list2.Add($entry)을 호출하면 실제로 정수 (삽입 된 요소의 인덱스)가 반환됩니다. PowerShell은 캡처되지 않은 모든 출력을 반환합니다. 주의하지 않으면 예상치 못한 결과가 발생할 수 있습니다. 따라서 실제로 인덱스를 반환하지 않으려면 [void] $list2.Add($entry)을 작성하는 습관을 갖춰야합니다.

+0

고맙습니다. 어떻게 대답을 좋아할 수 있습니까? – Obongo

+0

또 다른 질문은, 비교에서 부울을 얻을 수 있습니까? 그래서 변수에 저장 한 다음 동일하거나 다른 코드에 따라 코드를 실행할 수 있습니다. 정말 고마워요. – Obongo

+0

@Obongo 'Compare-Object'가 같으면 아무 것도 반환하지 않는다고 생각합니다. 따라서 간단한 '$ isEqual = (Compare-Object ..) -eq $ null'이 트릭을 수행해야합니다. – Raziel