2

我需要按从最早的创建日期到最新的顺序处理文件

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

谢谢

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
 }
4

3 回答 3

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
}
于 2013-04-11T20:35:02.273 回答
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运行一次,$_即当前正在处理的文件。在这段代码中,我写出了文件名,但当然你可以用你想对文件做的任何事情来替换它。

于 2013-04-11T20:33:27.683 回答
1

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

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{
   $_
}
于 2013-04-12T08:15:17.350 回答