powershell - Alternative to "-Contains" that compares value instead of reference -


i have list of file objects, , want check whether given file object appears inside list. -contains operator i'm looking for, appears -contains uses strict equality test object references have identical. there less strict alternative? want $booleanvariable in code below return true second time first time.

ps c:\users\public\documents\temp> ls       directory: c:\users\public\documents\temp   mode                lastwritetime         length name ----                -------------         ------ ---- -a----       14.08.2017     18.33              5 file1.txt -a----       14.08.2017     18.33              5 file2.txt   ps c:\users\public\documents\temp> $files1 = get-childitem . ps c:\users\public\documents\temp> $files2 = get-childitem . ps c:\users\public\documents\temp> $file = $files1[1] ps c:\users\public\documents\temp> $boolean = $files1 -contains $file ps c:\users\public\documents\temp> $boolean true ps c:\users\public\documents\temp> $boolean = $files2 -contains $file ps c:\users\public\documents\temp> $boolean false ps c:\users\public\documents\temp> 

get-childitem returns objects of type [system.io.fileinfo].

get-childitem  c:\temp\test\2.txt | get-member | select-object typename -unique  typename -------- system.io.fileinfo 

as petseral mentioned in comments [system.io.fileinfo] not implement icomparable or iequatable.

[system.io.fileinfo].getinterfaces()  ispublic isserial name                                     basetype -------- -------- ----                                     -------- true     false    iserializable 

without these, noticed powershell support reference equality. lee holmes' has great blog post on this.

the solution make comparisons on sub-properties comparable. can choose specific property unique, fullname mathias r jessen mentioned. drawback if other properties different, not evaluated.

'a' | out-file .\file1.txt $files = get-childitem . 'b' | out-file .\file1.txt $file = get-childitem .\file1.txt $files.fullname -contains $file.fullname  true 

alternatively, use compare-object cmdlet compare of properties between 2 objects (or specific properties choose -property).

using -includeequal -excludedifferent flags of compare-object, can find objects matching properties. when array cast [bool], if non-empty $true , if empty $false.

'a' | out-file .\file1.txt $files = get-childitem . $file = get-childitem .\file1.txt [bool](compare-object $files $file -includeequal -excludedifferent)  true   'a' | out-file .\file1.txt $files = get-childitem . 'b' | out-file .\file1.txt $file = get-childitem .\file1.txt [bool](compare-object $files $file -includeequal -excludedifferent)  false 

compare-object can resource intensive, it's best use other forms of comparison when possible.


Comments

Popular posts from this blog

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

python Tkinter Capturing keyboard events save as one single string -

sql server - Why does Linq-to-SQL add unnecessary COUNT()? -