PowerShell 实现删除指定路径X天前文件功能并添加定时JOB实例
公司的POA服务器的E盘隔三差五就爆满,原因是数据库备份文件越来越大,现在已经大到需要高频清理的地步了
十一前出现的这个问题,当时为了不专门在假期里某天特地去清理磁盘,想着一定要搞个定时JOB实现自动清理
最后选用了PowerShell脚本实现
新建一个txt文件,打开编辑内容如下:
# 设置要搜索的目录路径 $searchPath = "E:\OracleFRA\RMAN\Backup\" # 获取日期(作为DateTime对象) $beforeday = (Get-Date).AddDays(-10) # 遍历指定路径下的所有文件 Get-ChildItem -Path $searchPath -File | Where-Object { $_.LastWriteTime -lt $beforeday } | ForEach-Object { # 输出将要删除的文件路径(可选) Write-Host "Deleting: $($_.FullName)" # 删除文件 Remove-Item -Path $_.FullName -Force } # 输出完成消息(可选) Write-Host "Done."
修改文件名及后缀为deletefiles.ps1
放到指定位置既可,参考位置D:\TOOL\IMT\deletefiles.ps1
然后打开Task Scheduler(任务计划程序)添加定时JOB既可
这里添加定时JOB的基础操作不提供了,只补充一个Action设置例图:
下面那两个框的内容分别是
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
-NoProfile -ExecutionPolicy Bypass -File "D:\TOOL\IMT\deletefiles.ps1"
补充一些后面想把这个JOB复制到其他服务器遇到的问题
遇到的第一个问题是PowerShell 脚本执行策略阻止运行 deletefiles.ps1
脚本
具体错误信息:File D:\Tool\IMT\deletefiles.ps1 cannot be loaded because the execution of disabled on this system
解决方法是以管理员身份运行 PowerShell,输入命令,更改执行策略,注意PowerShell 会进行命令确认, 输入 Y
并按回车键既可
更改执行策略的命令:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
遇到的第二个问题是服务器上PowerShell 版本太低不支持 -File
参数
具体错误信息:Get-ChildItem:A parameter cannot be found that matches parameter name 'File'
解决方法是使用 -Filter
参数配合文件通配符(如 *.*
)来模拟 -File
参数的行为 或 通过将 Get-ChildItem
的输出传递给 Where-Object
来过滤实现相同功能
使用 -Filter 参数的PowerShell脚本:
# 设置要搜索的目录路径 $searchPath = "E:\OracleFRA\RMAN\Backup\" # 获取要删除的日期(作为DateTime对象) $beforeday = (Get-Date).AddDays(-10) # 遍历指定路径下的所有文件(使用 -Filter 参数) Get-ChildItem -Path $searchPath -Filter *.* | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $beforeday } | ForEach-Object { # 输出将要删除的文件路径(可选) Write-Host "Deleting: $($_.FullName)" # 删除文件 Remove-Item -Path $_.FullName -Force } # 输出完成消息(可选) Write-Host "Done."
使用 Where-Object 过滤的PowerShell脚本:
# 设置要搜索的目录路径 $searchPath = "E:\OracleFRA\RMAN\Backup\" # 获取要删除的日期(作为DateTime对象) $beforeday = (Get-Date).AddDays(-10) # 遍历指定路径下的所有项,然后过滤出文件 Get-ChildItem -Path $searchPath | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $beforeday } | ForEach-Object { # 输出将要删除的文件路径(可选) Write-Host "Deleting: $($_.FullName)" # 删除文件 Remove-Item -Path $_.FullName -Force } # 输出完成消息(可选) Write-Host "Done."