在循环之前对目录进行排序 - PowerShell

时间:2013-04-11 20:09:15

标签: windows powershell

我需要按照从最早的创建日期到最新的

的顺序处理文件

这是正确的还是有更好的方法呢?

由于

Get-ChildItem -Path C:\Users\Tom\ -Filter "*.journal" | Sort-Object -Property CreationTime

ForEach ($sourcefile In $(Get-ChildItem $source | Where-Object { $_.Name -match "Daily_Reviews\[\d{1,12}-\d{1,12}\].journal" }))
{
    #### Process files in order from oldest to newest
    $file = $source+$sourcefile
 }

3 个答案:

答案 0 :(得分:5)

简短的回答:不,但你很接近。

除非将结果存储在变量中,否则排序(和其他效果)仅在管道中存在。因此,排序的第一行不会用于下一行。但是,您可以将它们组合起来:

$source = "C:\Users\Tom\"   

Get-ChildItem -Path $source -Filter "*.journal" | 
Where-Object { $_.Name -match 'Daily_Reviews\[\d{1,12}-\d{1,12}\].journal' } | 
Sort-Object -Property CreationTime | ForEach-Object {
    #### Process files in order from oldest to newest
    $_.FullName
}

答案 1 :(得分:2)

使用sort-object似乎是正确的方法,但您的foreach未使用排序列表。我添加了另一个|来将sort-object的输出传输到foreach

get-childitem -path c:\users\tom\ -filter "*.journal" |
sort-object -property creationtime |
where-object { $_.Name -match "Daily_Reviews\[\d{1,12}-\d{1,12}\].journal" } |
foreach-object {
    # $_ is the file we're currently looking at
    write-host $_.Name
}

第一个命令是get-childitem。它以无特定顺序输出文件列表。

无序的文件列表通过管道传输到sort-object。它输出相同的文件列表,但现在按创建时间排序。

已排序的文件列表通过管道传输到where-object。它输出已过滤的文件的过滤列表。

过滤后的&已排序的文件列表通过管道传送到foreach-object,因此foreach的正文为每个文件运行一次,$_是当前正在处理的文件。在这段代码中,我已经写出了文件名,但当然你可以用你想要的文件替换它。

答案 2 :(得分:1)

这是我对此的看法。当前对象(例如$ _)在foreach scriptblock中可用:

Get-ChildItem -Path C:\Users\Tom -Filter Daily_Reviews*.journal | 
Where-Object { $_.Name -match "Daily_Reviews\[\d{1,12}-\d{1,12}\].journal" } | 
Sort-Object -Property CreationTime | Foreach-Object{
   $_
}