完善PowerShell脚本:导出24小时无新备份的文件夹至CSV
我已经帮你完善了PowerShell脚本,实现了递归遍历备份文件夹、找出每个子文件夹的最新备份文件、筛选出创建时间早于24小时的文件,并将符合条件的信息导出到指定的CSV文件。下面是完整的可运行脚本和关键修改说明:
完整修改后的脚本
[Cmdletbinding()] param( [Parameter(Position=0,Mandatory=$false,ValueFromPipeline=$true)] $path = "F:\backups", [Parameter(Position=1,Mandatory=$false,ValueFromPipeline=$true)] $OutPutFilepath = "f:\backup-daily.csv" ) function Get-LastestWroteFile{ [Cmdletbinding()] param( [Parameter(Position=0,Mandatory=$true)] $Folder ) begin{ # 获取当前文件夹下的所有文件,按创建时间排序取最新的一个 $Latest = Get-ChildItem $Folder.FullName -File | Select-Object FullName, CreationTime, LastAccessTime, LastWriteTime, Attributes, @{N='SizeInMb';E= {$_.Length/1mb}}, Name | Sort-Object CreationTime | Select-Object -Last 1 } process{ } end{ if($Latest){ # 判断最新文件的创建时间是否早于24小时前 $24HoursAgo = (Get-Date).AddHours(-24) if($Latest.CreationTime -lt $24HoursAgo){ # 返回符合条件的自定义对象 return New-Object PSobject -Property @{ "FileName" = $latest.Name "FileFullPath" = $latest.FullName "CreationTime" = $latest.CreationTime "LastWriteTime" = $latest.LastWriteTime "FolderPath" = $folder.FullName "SizeInMB" = [math]::Round($Latest.SizeInMB,3) } } } } } $OutPut = @() # 递归遍历所有子文件夹 Get-ChildItem -Directory -Path $path -Recurse | ForEach-Object { $result = Get-LastestWroteFile $_ if($result){ $OutPut += $result } } # 导出到CSV,使用|作为分隔符,指定UTF8编码避免乱码 $OutPut | ConvertTo-Csv -NoTypeInformation -Delimiter '|' | Out-File -FilePath $OutPutFilepath -Encoding UTF8
关键修改点说明
- 修复语法错误:移除了原脚本末尾多余的闭合花括号
},确保脚本能正常运行 - 添加时间判断逻辑:在函数中计算24小时前的时间戳,只有当最新备份文件的创建时间早于该时间时,才会被纳入结果集
- 优化输出字段:调整字段名称(如
FileName、FileFullPath),让CSV内容的可读性更强 - 编码优化:导出CSV时指定
-Encoding UTF8,避免中文文件名或路径出现乱码问题 - 结果过滤:遍历文件夹时只保留符合条件的结果,减少无效数据的存储
内容的提问来源于stack exchange,提问作者Ghasem Shams
相关产品推荐
相关产品推荐

