Empty Coder
Empty Coder

Reputation: 589

Foreach loop not reading files in numeric order

I have below files which i am reading using a foreach loop.

$GetGeneratedFiles = Get-ChildItem -Path "C:\Script\LF*.csv" -recurse |  % { $_.FullName }

C:\Script\LF_Batch_1.csv
C:\Script\LF_Batch_10.csv
C:\Script\LF_Batch_11.csv
C:\Script\LF_Batch_12.csv
C:\Script\LF_Batch_13.csv
C:\Script\LF_Batch_14.csv
C:\Script\LF_Batch_15.csv
C:\Script\LF_Batch_16.csv
C:\Script\LF_Batch_17.csv
C:\Script\LF_Batch_18.csv
C:\Script\LF_Batch_19.csv
C:\Script\LF_Batch_2.csv
C:\Script\LF_Batch_20.csv
C:\Script\LF_Batch_21.csv etc...upto LF_Batch_.96.csv

Problem is it is reading the files like above not 1,2,3...and so on.

Please need idea how to read in ordered way

Upvotes: 0

Views: 68

Answers (2)

js2010
js2010

Reputation: 27546

Another way. It's funny how I just did another answer similar to this. A numeric sort on the names.

echo hi | set-content (1,2,10,20 | % tostring LF_Batch_0\.csv)
dir | sort {[void]($_ -match '\d+'); [int]$matches.0}


    Directory: C:\Users\js\foo

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           9/17/2020  9:14 AM              4 LF_Batch_1.csv
-a---           9/17/2020  9:14 AM              4 LF_Batch_2.csv
-a---           9/17/2020  9:14 AM              4 LF_Batch_10.csv
-a---           9/17/2020  9:14 AM              4 LF_Batch_20.csv

Upvotes: 0

Empty Coder
Empty Coder

Reputation: 589

Solved using below approach

        $GetGeneratedFiles = Get-ChildItem -Path "C:\Script\LF*.csv" -recurse |  % { $_.FullName }

        $ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }
        
        $GetGeneratedFiles = $GetGeneratedFiles | Sort-Object $ToNatural

Thanks @vonPryz for the reference.

Upvotes: 1

Related Questions