PowerShell 實現刪除指定路徑X天前檔案功能並新增定時JOB例項

路小乙發表於2024-10-16

公司的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."

相關文章