Wolwgang
Wolwgang

Reputation: 111

Compare-Object different property names

Is there a way to use Compare-Object -property, for comparing 2 properties with different names? I have something like this:

    $ComparisonProperty= $ComparisonProperty | Add-Member -MemberType AliasProperty -Name Url -Value ITEM_TARGET_URI -PassThru
Compare-Object $FirstFile $SecondFile -Property Url -PassThru | Where-Object{$_.SideIndicator -eq "<="} | Out-file .\result.txt

But this gives an error:

Cannot bind argument to parameter 'InputObject' because it is null

At $ComparisonProperty

//Edit

Sample data are 2 csv files with many headers, 1 with Url header in it, another with ITEM_TARGET_URI in it. Result should be strings from file 1 that do not exist in file 2. Comparison works if i provide them with the same property names, but the whole point is to force it to compare 2 properties with different names.

Upvotes: 1

Views: 5849

Answers (1)

Matt
Matt

Reputation: 46700

To answer the actual question calculated properties or property aliases would get you what you need. You have been trying to use the latter but you need to add the property to the file object itself. Consider the two file examples

id,first_name
1,Elia
2,Nikolos
3,Bert
4,Sharleen
5,Bill

id,beginning_name
1,Elia
2,Nikolos
3,Bert
4,Mildrid
5,Bill

Notice that the headers are different. So now lets try and create the property alias. Assume that I have already imported these files as CSV's

$file2 | Add-Member -MemberType AliasProperty -Name first_name -Value beginning_name
compare-object $file1 $file2 -Property first_name

That will give you the results you were expecting. I added an alias to the second file object

You could just work with column data

Another approach to this is to drop the properties and just work with string arrays. Since I know the headers I want I can just get those columns themselves as well

$namesfromfile1 = $file1 | Select-Object -ExpandProperty first_name
$namesfromfile2 = $file2 | Select-Object -ExpandProperty beginning_name

Compare-Object $urls1 $urls2

Depending on your PS version this can also be shortened. Whether or not its simplified is up to the reader.

Compare-Object ($file1).first_name ($file2).beginning_name

Upvotes: 3

Related Questions