File PowerShell逐个查找文件

File PowerShell逐个查找文件,file,powershell,time,File,Powershell,Time,我有一个脚本,它检查文件夹并找到最旧的文件(按LastWriteTime),并将找到的文件的LastWriteTime写入日志文件 如果我再次运行此脚本,我希望它能找到下一个最旧的文件,它的LastWriteTime大于以前写入日志文件的文件 但有一个问题。我的scipt每次只能在文件夹中找到最旧的文件,而忽略日志文件中的文件 我的剧本: $programdir = "C:\Data\PowerShell\Learning" $folder = "C:\Data\PowerShell\Learn

我有一个脚本,它检查文件夹并找到最旧的文件(按LastWriteTime),并将找到的文件的LastWriteTime写入日志文件

如果我再次运行此脚本,我希望它能找到下一个最旧的文件,它的LastWriteTime大于以前写入日志文件的文件

但有一个问题。我的scipt每次只能在文件夹中找到最旧的文件,而忽略日志文件中的文件

我的剧本:

$programdir = "C:\Data\PowerShell\Learning"
$folder = "C:\Data\PowerShell\Learning\folder" #there is the files
$TimeLog = "$programdir\LastFileDate.log" #this file contains the last found file's LastWriteTime attribute
$LastWriteTime = Get-Content $TimeLog
$File = Get-ChildItem -Path $folder | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | Where-Object {$_.LastWriteTime -gt $LastWriteTime}
Clear-Content $TimeLog
$File.LastWriteTime | Set-Content $TimeLog

用这一行立即削弱选择集。特别是在您有
选择对象-Last 1
的位置:

在最后一条管道语句中,将选择集限制为1个文件。然后你应用你的约会逻辑。你需要先过滤你的日期,然后抓取合适的条目

Get-ChildItem -Path $folder -File | 
    Sort-Object LastWriteTime -Descending | 
    Where-Object {$_.LastWriteTime -lt $LastWriteTime} | 
    Select-Object -First 1
还有其他类似的方法也能奏效


还有

这是多余的,因为默认情况下,
设置内容
将覆盖。您可以删除
清除内容

虽然这不是代码中的问题,但请注意,
Get Content
返回的
$LastWriteTime
是一个字符串,而不是
datetime
对象。因为它位于where子句中语句的右侧,所以为了评估该子句,将其转换为
[datetime]


另外,如果
$timelog

中有多行代码,请注意代码的行为可能会有所不同。获取所有文件时间并进行比较您自己必须从最早的开始!因此Where对象{$\ LastWriteTime-lt$LastWriteTime}对它来说是不正确的。必须使用-gt$LastWriteTime。最后,它将成为Do-While循环的一部分!你还有别的想法吗?@NorbertKiss你真的是先尝试的吗?实际上,这很有效。我们需要在那个日期之前先抓住所有的第一个,然后抓住最新的一个。
Get-ChildItem -Path $folder -File | 
    Sort-Object LastWriteTime -Descending | 
    Where-Object {$_.LastWriteTime -lt $LastWriteTime} | 
    Select-Object -First 1
Clear-Content $TimeLog
$File.LastWriteTime | Set-Content $TimeLog