PowerShell脚本开发咨询:如何实现上次运行后监控文件夹新增文件检测及日志文件的创建与使用
用日志文件追踪上次运行以来的新增文件(附完整脚本示例)
嘿,我来帮你搞定这个日志文件的问题!你这个思路完全没问题——用日志存上次检测的时间戳,每次启动时对比找新增文件,非常靠谱。下面我给你一步步拆解,用PowerShell脚本(毕竟你说的是脚本,这个上手简单)来实现,每一步都给你写清楚代码和解释,一看就懂:
第一步:读取或初始化日志文件
首先咱们得处理日志的读取逻辑:如果是第一次运行,就创建日志文件并设一个初始时间;如果之前运行过,就读取上次保存的时间。
# 替换成你的监控文件夹路径 $watchFolder = "C:\Your\Target\Folder" # 日志文件就放在脚本同目录,方便管理 $logPath = ".\last_check_time.txt" # 检查日志文件是否存在 if (Test-Path $logPath) { # 读取日志里的时间戳,转成能对比的时间格式 $lastCheckTime = Get-Content $logPath | Get-Date } else { # 第一次运行,用当前时间的前一天(这样能抓到文件夹里已有的所有文件,你也可以改成文件夹的创建时间) $lastCheckTime = (Get-Date).AddDays(-1) # 创建日志文件并写入初始时间,精确到毫秒避免漏文件 $lastCheckTime.ToString("yyyy-MM-dd HH:mm:ss.fff") | Out-File $logPath }
第二步:找出上次运行后新增的文件
这一步就是遍历文件夹里的所有文件,把创建时间晚于lastCheckTime的挑出来,然后弹窗提示:
# 获取所有符合条件的新增文件 $newFiles = Get-ChildItem -Path $watchFolder -File | Where-Object { $_.CreationTime -gt $lastCheckTime } # 如果有新增文件,就弹出提示 if ($newFiles.Count -gt 0) { # 把文件名拼起来,弹窗显示 $message = "上次运行以来新增了这些文件:`n`n" + ($newFiles.Name -join "`n") [System.Windows.MessageBox]::Show($message, "文件新增提醒") }
第三步:更新日志为最新时间
处理完新增文件后,得把日志更新成最新的时间——最好是文件夹里最新文件的创建时间,这样下次运行时不会漏掉任何文件:
# 找文件夹里最新创建的文件 $latestFile = Get-ChildItem -Path $watchFolder -File | Sort-Object CreationTime -Descending | Select-Object -First 1 # 如果文件夹里有文件,就用最新文件的创建时间;没有就用当前时间 if ($latestFile) { $newLastCheckTime = $latestFile.CreationTime } else { $newLastCheckTime = Get-Date } # 把最新时间写入日志 $newLastCheckTime.ToString("yyyy-MM-dd HH:mm:ss.fff") | Out-File $logPath
可选:结合FileSystemWatcher实现实时监控
如果你想让脚本既启动时检测历史新增,又运行时实时监控新文件,把上面的代码和FileSystemWatcher结合起来就行:
# 初始化监控器 $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = $watchFolder $watcher.IncludeSubdirectories = $false # 要不要监控子文件夹,自己改 $watcher.EnableRaisingEvents = $true # 注册文件新增的事件处理——文件一新增就弹窗,同时更新日志 Register-ObjectEvent $watcher "Created" -Action { $newFileName = $Event.SourceEventArgs.Name [System.Windows.MessageBox]::Show("刚新增了文件:$newFileName", "实时提醒") # 实时更新日志,防止脚本意外退出后漏掉文件 $currentTime = Get-Date $currentTime.ToString("yyyy-MM-dd HH:mm:ss.fff") | Out-File ".\last_check_time.txt" } # 让脚本一直运行,按Ctrl+C就能停止 Write-Host "脚本正在监控文件夹...按Ctrl+C停止运行" while ($true) { Start-Sleep 1 }
几个小提醒
- 确保脚本对监控文件夹和日志文件所在路径有读写权限,不然会报错。
- 时间格式用了
yyyy-MM-dd HH:mm:ss.fff,精确到毫秒,能避免漏掉同一秒内创建的多个文件。 - 如果要监控子文件夹,记得把
Get-ChildItem加上-Recurse参数,同时把$watcher.IncludeSubdirectories改成$true。
内容的提问来源于stack exchange,提问作者Eschre




