.net - Iterating through properties of a object -


i have following objects:

$restrictedprograms = @(     @{displayname = "microsoft visual studio test"};     @{guid = "102c29b2-4320-4774-8003-6912f0ac19"};     @{displayname = "microsoft office 365 proplus - en-us"};     @{guid = "b24e0c46-b627-4781-975e-620ed53cd98"};     @{displayname = "sourcetre"; guid = "b24e0c46-b627-4781-975e-620ed53cd981"} ) 

the restricted items can have 1 property(displayname or guid) or both.

$installedprograms = @(         @{displayname = "sourcetree"; guid = "b24e0c46-b627-4781-975e-620ed53cd981"};         @{displayname = "microsoft viewer 2.0"; guid = "feb375ab-6eec-3929-8faf-188ed81dd8b5"}     ) 

i want iterate through each of installedprograms , compare properties in restrictedprograms. know how hardcoding property names(displayname , guid):

foreach($installedprogram in $installedprograms)     {         foreach($restrictedprogram in $restrictedprograms)         {             if($restrictedprogram.displayname -and $restrictedprogram.guid)             {                 if(($installedprogram.displayname -eq $restrictedprogram.displayname) -and ($installedprogram.guid -eq $restrictedprogram.guid))                 {                     return $false;                 }             }             else             {                 if($restrictedprogram.displayname)                 {                     if($installedprogram.displayname -eq $restrictedprogram.displayname)                     {                         return $false;                     }                 }                  if($restrictedprogram.guid)                 {                     if($installedprogram.guid -eq $restrictedprogram.guid)                     {                         return $false;                     }                 }             }         }     } 

but how can iterating through properties of restrictedprogram item, instead of hardcoding it:

foreach($installedprogram in $installedprograms)     {         foreach($restrictedprogram in $restrictedprograms)         {             // foreach property in $restrictedprogram, compare corresponding property in $installedprogram ??         }     } 

not sure clear doing results after fact looks of looking see if properties in $installedprograms present in same property values of $restrictedprograms. made powershell object of hashtables opened many avenues. wanted able use compare-object since not sure of expected results skipped over.

$installedprograms = @(         @{displayname = "sourcetree"; guid = "b24e0c46-b627-4781-975e-620ed53cd981"};         @{displayname = "microsoft viewer 2.0"; guid = "feb375ab-6eec-3929-8faf-188ed81dd8b5"} ) | foreach-object{new-object psobject -property $_}  $restrictedprograms = @(     @{displayname = "microsoft visual studio test"};     @{guid = "102c29b2-4320-4774-8003-6912f0ac19"};     @{displayname = "microsoft office 365 proplus - en-us"};     @{guid = "b24e0c46-b627-4781-975e-620ed53cd98"};     @{displayname = "sourcetree"; guid = "b24e0c46-b627-4781-975e-620ed53cd981"} ) | foreach-object{     new-object psobject -property @{         displayname = $_.displayname         guid = $_.guid     } }   $installedprograms | where-object{$_.displayname -in $restrictedprograms.displayname -or $_.guid -in $restrictedprograms.guid} 

the last line matters. looks of have @ least powershell 3.0 should work fine you. each $installedprograms check if has matching display name or guid. if match found passed through pipe. interpreted end result here list of restricted programs installed on computer.

displayname guid                                 ----------- ----                                 sourcetree  b24e0c46-b627-4781-975e-620ed53cd981 

you had mentioned though wanted more dynamic. in mind changed logic allow dynamic properties. make comparisons without knowing properties are. sake of simplicity not going remake powershell objects in same vien not sure if interested in approach.

$matchedprograms = @() $props = ($installedprograms | select-object -first 1).psobject.properties | select-object -expandproperty name  foreach($singleprogram in $installedprograms){     foreach($singleproperty in $props){         # check see $singleproperty of $singleprogam in $restrictedprograms         if($singleprogram.$singleproperty -in $restrictedprograms.$singleproperty){$matchedprograms += $singleprogram}     } }  $matchedprograms | select-object -unique 

since looking matching individually possible there double of programs , -unique take care of that.


Comments

Popular posts from this blog

1111. appearing after print sequence - php -

java - WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/board/] in DispatcherServlet with name 'appServlet' -

Ruby on Rails, ActiveRecord, Postgres, UTF-8 and ASCII-8BIT encodings -