我需要按照从最早的创建日期到最新的
的顺序处理文件这是正确的还是有更好的方法呢?
由于
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
}
答案 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{
$_
}