programing

PowerShell에서 어레이 변수 비교

skycolor 2023. 8. 15. 10:58
반응형

PowerShell에서 어레이 변수 비교

나는 두 폴더를 비교하기 위해 이 스크립트를 가지고 있습니다.

$firstfolder = Get-ChildItem C:\firstfolder
$secondfolder = Get-ChildItem C:\firstfolder

if ($firstfolder -eq $secondfolder) {
Write-Host "Folders are the same."
} else {
    Write-Host "Error: Doesn't match."
}

보시다시피, 저는 같은 폴더를 비교합니다.문제는, 절대로 어레이가 동등하다는 것을 고려하지 않는다는 것입니다. 왜 그럴까요?

PowerShell에서는 배열을 가리키는 변수가 배열 자체의 내용을 열거하여 식으로 평가됩니다.

예를 들어 이 표현식은 다음과 같습니다.

$firstFolder | Get-Member

시스템에 대한 정보를 반환합니다.IO.디렉토리정보 유형, 실제로는 다음의 첫 번째 요소 유형입니다.$firstFolder배열. 배열 개체 자체에서 작동하려면 PowerShell에 명시적으로 개체를 배열로 취급하도록 지시해야 합니다.,교환입니다.다음 식을 사용합니다.

,$firstFolder | Get-Member

에 대한 정보를 반환할 것으로 예상됩니다.System.Object[].

하지만, 그 때.-eq연산자는 두 배열 변수 사이에서 사용되며, 상황은 약간 다릅니다.실제로 PowerShell은 왼쪽의 배열만 열거하고 각 항목을 오른쪽의 배열과 전체적으로 비교합니다.결과는 일치하는 항목의 배열이거나 일치하는 항목이 없는 경우 전혀 없습니다.예:

$a = 1..5
$b = 1..5
$a -eq $b         # returns zero-length array
[bool]($a -eq $b) # returns $false
$a -eq 3          # returns 3

특정한 경우 결과는 길이가 0인 배열(또는$false부울로 캐스팅된 경우) 이후$firstFolder배열에 시스템이 포함되어 있습니다.IO.디렉토리의 배열과 완전히 일치하지 않는 개체에 정보를 제공합니다.$secondFolder변수.

두 배열의 내용을 서로 비교하는 것이 진정으로 필요합니다.Compare-Object cmdlet이 유용한 부분은 다음과 같습니다.

Compare-Object $firstFolder $secondFolder -SyncWindow 0

이렇게 하면 두 배열 간의 차이가 반환됩니다.$null배열이 동일한 경우.더 정확히 말하면, 결과 배열은 다른 배열이 아닌 한 배열에만 존재하는 각 항목에 대한 개체를 포함합니다.-SyncWindow 0인수를 사용하면 배열에 나타나는 항목의 순서가 차이로 계산됩니다.

서로 다른 항목에 대한 세부 정보를 입력하지 않고 두 어레이가 서로 다른지 확인하는 간단한 방법만 있으면 Compare-Object에서 반환되는 어레이의 길이를 확인할 수 있습니다.

$areEqual = @(Compare-Object $firstFolder $secondFolder -SyncWindow 0).Length -eq 0

Compare-Object가 반환될 수 있으므로 PowerShell에 항상 결과를 배열로 패키지화하도록 명시적으로 지시했습니다.$null배열에 차이가 없는 경우.

을 사용해야 .compare-object차이가 있는지 없는지를 평가합니다!

(기본 동기화 창에서는 순서가 중요하지 않지만 큰 목록의 경우 더 느립니다.)

function arrayequal($a, $b) {
  -not (compare $a $b)
}

arrayequal $a $b

True

일치하는 순서 이상:

function arrayequal($a, $b) {
  -not (compare $a $b -syncwindow 0)
}

arrayequal $a $b

True

언급URL : https://stackoverflow.com/questions/9598173/comparing-array-variables-in-powershell

반응형