求助:PowerShell脚本无法同时筛选.bak和.dat两种SQL备份文件
解决PowerShell脚本无法同时筛选两种扩展名文件的问题
你的脚本问题出在Get-ChildItem的-Filter参数用法上——-Filter不支持同时指定多个扩展名的写法,你写的'*.bak''*.dat'会被PowerShell解析成单个字符串*.bak*.dat,根本匹配不到目标文件。
方案1:使用-Include参数(推荐,效率更高)
-Include参数支持指定多个通配符,结合-Recurse和-File可以直接在文件系统层面过滤目标文件,效率比后续再用Where-Object过滤更高。
核心代码修改如下:
# 提前计算24小时前的时间戳,避免重复调用Get-Date $cutoffDate = (Get-Date).AddDays(-1) # 使用-Include指定两种扩展名 $files = Get-ChildItem -Path E:\DB -Include '*.bak', '*.dat' -File -Recurse | Where-Object { $_.CreationTime -gt $cutoffDate } | Select-Object -ExpandProperty FullName
方案2:使用Where-Object过滤扩展名(更灵活)
如果需要更复杂的过滤逻辑(比如忽略扩展名大小写),可以在获取所有文件后,用Where-Object直接判断扩展名:
$cutoffDate = (Get-Date).AddDays(-1) $files = Get-ChildItem -Path E:\DB -File -Recurse | Where-Object { $_.CreationTime -gt $cutoffDate -and $_.Extension.ToLower() -in '.bak', '.dat' # 忽略大小写匹配 } | Select-Object -ExpandProperty FullName
完整修正后的脚本
以下是整合方案1的完整脚本,同时修正了注释错误,并优化了变量逻辑:
# 获取过去24小时内创建的.bak和.dat格式文件的完整路径数组 $cutoffDate = (Get-Date).AddDays(-1) $files = Get-ChildItem -Path E:\DB -Include '*.bak', '*.dat' -File -Recurse | Where-Object { $_.CreationTime -gt $cutoffDate } | Select-Object -ExpandProperty FullName if ($files) { $message = "这些文件在过去24小时内被创建:{0}{1}" -f [Environment]::NewLine, ($files -join [Environment]::NewLine) $emailTo = 'xxx@xx.xx.xx' } else { $message = "过去24小时内没有创建符合条件的文件" $emailTo = 'xxx@xx.xx.xx' } # 屏幕输出结果 Write-Host $message # 构建邮件参数哈希表 $mailParams = @{ From = 'xxx@xx.xx.xx' To = $emailTo Subject = '每日SQL备份报告' Body = $message SmtpServer = 'x.x.x.x' # 可添加其他需要的参数,如-Port 587 -UseSsl等 } # 发送邮件 Send-MailMessage @mailParams
额外提示
- 原脚本注释写的是"last updates",但代码用的是
CreationTime(文件创建时间),如果需要统计修改时间,请替换为LastWriteTime。 - 如果你的环境中存在大写扩展名(比如
.BAK),方案2中的ToLower()可以确保匹配到所有大小写形式的扩展名。
内容的提问来源于stack exchange,提问作者The IT Dept
相关产品推荐
相关产品推荐

