公司的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
並按Enter鍵既可
更改執行策略的命令:
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."