0

I need some help on this:

I've got a [pscustomobject] that contains the below results, get from a xml file

Files                                           Session    
-----                                           -------    
{IMG_0518.JPG, IMG_0520.JPG, VG_Overview.mp4, } VG_Overview

I need to get the duplicated values on Files, e get it's respective session value:

My code to get the duplicated values: $trse is my [pscustomobject]

  $trse | ForEach-Object {$_.Files.Where({ $_ -ne ""})} | Group | Where-Object{$_.Count -gt 1} | Select @{Name="Files";Expression={$_.Name}},@{Name="Session";Expression={$_.Session}},@{Name="Occurrences";Expression={$_.Count}} 

and the results are this:

    Files               Session Occurrences
    -----               ------- -----------
    GC7_Gender.WAV                      2
    NG6_Gender.WAV                      2
    NG9_Gender_I.WAV                    2
    NG9_Gender_II.WAV                   2
    VG4_Gender.WAV                      2

And i need to get this:

    Files               Session Occurrences
    -----               ------- -----------
    GC7_Gender.WAV      VG_Over         2
    NG6_Gender.WAV      Gh_tre          2
    NG9_Gender_I.WAV    FG_iop          2
    NG9_Gender_II.WAV   VB_jkl          2
    VG4_Gender.WAV      ER_uilv         2

Thanks a lot for any help on this, i think the problem is when i get de duplicated files, i lost the session values.

1 Answer 1

4

This is probably easier to understand if we re-format your code slightly:

$trse | ForEach-Object { 
    $_.Files.Where( { $_ -ne "" } ) 
} | Group | Where-Object { $_.Count -gt 1 } | Select @{Name = "Files"; Expression = { $_.Name } }, @{Name = "Session"; Expression = { $_.Session } }, @{Name = "Occurrences"; Expression = { $_.Count } } 

ForEach-Object outputs only the Files values, so by the time we reach Group, any relationship between the file names and the corresponding Session value has been lost.

Move the Group | Where | Select chain inside the ForEach-Object block:

$trse | ForEach-Object {
    $Session = $_.Session
    $_.Files.Where( { $_ -ne "" } ) | Group | Where-Object { $_.Count -gt 1 } | Select @{Name = "Files"; Expression = { $_.Name } }, @{Name = "Session"; Expression = { $Session } }, @{Name = "Occurrences"; Expression = { $_.Count } } 
}

Bonus tip:

For the calculated property expressions that just rename existing properties, you can supply the input property name as the Expression value, no need to supply a scriptblock:

... |Select @{Name = "Files"; Expression = 'Name' }, @{Name = "Session"; Expression = { $Session } }, @{Name = "Occurrences"; Expression = 'Count' } 
Sign up to request clarification or add additional context in comments.

2 Comments

great bonus...didn't know that!
Nice! That´s it! Thanks once again @Mathias, for the solution and explanation. You in your best.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.