Nick Jennett
Nick Jennett

Reputation: 11

Powershell compare arrays and get unique values

I am currently trying to write a powershell script that can be run weekly on two CSV files, to check they both contain the same information. I want the script to output anything that appears in one file but not the other to a new file.

The script I have written so far compares the two but only adds <= and => to the values. It also doesn't work all the time, because I manually checked the file and found results that existed in both.

Code below:

    $NotPresents = compare-object -ReferenceObject $whatsup -DifferenceObject $vmservers -Property device 

foreach ($NotPresent in $NotPresents)
{

Write-Host $NotPresent.device 
}


$NotPresents | Out-File Filepath.txt
$NotPresents.count

Any ideas what I have done wrong?

Upvotes: 1

Views: 1269

Answers (1)

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174485

In order to avoid having to iterate over one of the arrays more than once*, you may want to throw them each into a hashtable:

$whatsupTable = @{}
foreach($entry in $whatsup){
  $whatsupTable[$entry.device] = $true
}

$vmserversTable = @{}
foreach($entry in $vmservers){
  $vmserversTable[$entry.device] = $true
}

Now you can easily find the disjunction with a single loop and a lookup against the other table:

$NotInWhatsUp   = $vmservers |Where { -not $whatsupTable[$_]   }
$NotInVMServers = $whatsup   |Where { -not $vmserversTable[$_] }

*) ok, technically we're looping through each twice, but still much better than nested looping

Upvotes: 2

Related Questions