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

Windows 在循环之前对目录进行排序-PowerShell,windows,powershell,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}\

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

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

谢谢

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
 }

使用
sort object
似乎是正确的方法,但是您的
foreach
没有使用排序列表。我将添加另一个
|
,以将
排序对象的输出输送到
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
}
第一个命令是
getchilditem
。它不按特定顺序输出文件列表

无序文件列表通过管道传输到排序对象
。它输出相同的文件列表,但现在按creationtime排序

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


文件的筛选和排序列表通过管道传输到
foreach对象
,因此
foreach
的主体将针对每个文件运行一次,其中
$\uu
是当前正在处理的文件。在这段代码中,我已经写出了文件名,但您当然会将其替换为您想对文件执行的任何操作。

简短回答:不,但您很接近

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

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

这是我的看法。当前对象(例如$\在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{
   $_
}

谢谢,但是我对如何访问循环中的当前项有点困惑。循环中的当前项存储在哪里?在我的示例中,它保存在$sourcefile管道中的当前项是
$\u
,在
where object
部分中,
$\u
get childitem
中的当前对象,而在foreach循环中,
$\u
是一个与您的正则表达式匹配并已排序的文件。谢谢。很高兴知道这一点,此实现可以工作,但它会抛出一条警告:“C:\Users\Tom\”不会被识别为cmdlet、函数、可操作程序或脚本文件。你知道那里发生了什么吗?我知道了。这个$source=C:\Users\Tom\需要被引用,所以:$source='C:\Users\Tom`是的,忘了这个。没有注意到这一点,因为我在这里是在SO而不是在PS ISE中发表评论;-)内特,那是什么样子?例如,管道命令的执行顺序是什么?你能给我举个例子吗?不确定在何处插入排序对象…谢谢您的解释。Powershell正在提示输入第四个管道参数的值…不确定那里发生了什么?因为他在另一行上启动foreach循环的花括号。您需要在命令所在的行上启动scriptblock。Atm,它运行:当找不到scriptblock时,它可以运行到每个对象的
foreach
。然后作为一个单独的命令,它定义了一个scriptblock。