如何以升序顺序从文件夹中获取所有文本文件?

时间:2016-02-15 09:31:00

标签: powershell powershell-v2.0 powershell-v3.0 powershell-v4.0

我正在使用此代码:

Get-ChildItem "D:\Powercel\TimeStats\TimeStats_50slots" -Filter *.txt |Foreach-Object{
    write-host $_.BaseName             
    $cnt= $_.BaseName.Length
    if($cnt -eq 23){
        $f= $_.BaseName.Substring(0,$_.BaseName.Length-1) 
    }ElseIf($cnt -eq 24){
        $f= $_.BaseName.Substring(0,$_.BaseName.Length-2)
    }ElseIf($cnt -eq 25){
        $f= $_.BaseName.Substring(0,$_.BaseName.Length-3)
    }

    if($f -match "21_01_2016_13TimeStats"){
        $data = Get-Content $_.FullName -Encoding Unicode 
        foreach ($line in $data){
            write-host $line
        }
    }
}

我可以从文件夹中获取所有文本文件,但它们的顺序不同。像这样:

1个文件,而不是10个文件,而不是11个 - > 12个> 13个,而不是2个文件,而不是3个 - > 4喜欢这个。

但是我需要按照这个1->的顺序进行。 2→ 3→4-→5 ........ 13

文件名如下:

21_01_2016_13TimeStats1.txt
21_01_2016_13TimeStats2.txt
21_01_2016_13TimeStats3.txt
21_01_2016_13TimeStats4.txt
# etc...

所以有人可以帮帮我吗???

1 个答案:

答案 0 :(得分:3)

使用Sort-Object

默认情况下,Sort-Object执行按字母顺序排序,因此您必须使用排序表达式来转换文件的最后部分'在排序过程中将基本名称转换为int。

鉴于您的文件名看起来像[date]TimeStats[number].txt,您可以执行以下操作:

('21_01_2016_13TimeStats2' -split '\D'|Select -Last 1) -as [int]

要抓住末尾的数字并转换为[int]

Get-ChildItem *.txt |Sort-Object { ($_.BaseName -split '\D'|Select -Last 1) -as [int] } |ForEach-Object { <# do your thing #> }

PowerShell 2.0没有未经检查的类型转化运算符-as,因此您必须执行以下操作:

Get-ChildItem *.txt |Sort-Object { try{[int]($_.BaseName -split '\D'|Select -Last 1)}catch{} } |ForEach-Object { <# do your thing #> }