最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python輕松構建一個Windows11系統智能垃圾清理系統

 更新時間:2026年01月03日 09:46:36   作者:貓頭虎  
Windows 11雖然引入了存儲感知,但在面對深層開發(fā)緩存、老舊更新殘留及特定應用日志時往往力不從心,本文將詳解如何使用Python編寫一套安全、智能、可配置的自動化清理腳本,有需要的小伙伴可以了解下

摘要:Windows 11雖然引入了存儲感知,但在面對深層開發(fā)緩存、老舊更新殘留及特定應用日志時往往力不從心。本文將詳解如何使用Python編寫一套安全、智能、可配置的自動化清理腳本,并結合Windows任務計劃程序實現真正的“無人值守”維護

一、 問題背景與需求分析

1.1 為什么系統自帶工具不夠用

很多開發(fā)者或運維人員習慣使用 CleanMgr (磁盤清理) 或第三方清理軟件(如CCleaner)。但在企業(yè)環(huán)境或開發(fā)環(huán)境下,它們存在以下缺陷:

  • 粒度太粗:無法精確到“刪除超過7天的特定后綴日志”。
  • 風險不可控:第三方軟件常有誤刪系統文件導致藍屏的歷史記錄。
  • 缺乏集成:無法與現有的業(yè)務邏輯(如:清理前先備份數據庫)結合。

1.2 我們的清理目標(Target Directories)

我們需要針對Windows 11系統特性,精準打擊以下目錄:

  • 用戶臨時目錄 (%TEMP%):存放大量應用安裝解壓包、緩存。
  • 系統臨時目錄 (%WINDIR%\Temp):系統級臨時文件。
  • 預讀取數據 (Prefetch):雖然會自動生成,但長期不關機的用戶積累較多。
  • 瀏覽器緩存 (Chrome/Edge):需要針對性清理,因為體積巨大。
  • Windows 更新日志 (%WINDIR%\Logs\CBS):系統更新后的殘留。
  • 回收站:徹底刪除不再需要的文件。

二、 技術方案設計

2.1 核心架構

為了確保安全,我們不使用簡單的 rm -rf,而是采用 “掃描-過濾-校驗-執(zhí)行-日志” 的流水線架構。

  • 語言選擇:Python 3.x(跨平臺庫豐富,文本處理強大)。
  • 安全機制
    • 白名單機制:即使文件在垃圾目錄,如果文件名在白名單中(如正在鎖定的文件),則跳過。
    • 時間策略:僅刪除“超過N天未訪問”的文件,防止誤刪剛生成的臨時文件。
    • 模擬運行:增加 --dry-run 參數,只顯示將要刪除什么,不真刪。

2.2 關鍵邏輯流程圖

三、 代碼實現

我們將項目分為兩個文件:config.json(配置)和 smart_cleaner.py(核心邏輯)。

3.1 配置文件

這讓非技術人員也能調整清理策略,而不需要改代碼。

{
  "settings": {
    "dry_run": false,
    "days_old": 7,
    "file_extensions": [".tmp", ".log", ".cache", ".old", ".etl"],
    "max_file_size_mb": 500
  },
  "targets": [
    {
      "name": "User Temp",
      "path": "%TEMP%",
      "recursive": true
    },
    {
      "name": "System Temp",
      "path": "C:\\Windows\\Temp",
      "recursive": true
    },
    {
      "name": "Prefetch",
      "path": "C:\\Windows\\Prefetch",
      "recursive": false
    }
  ],
  "exclusions": [
    "desktop.ini",
    "thumbs.db"
  ]
}

3.2 核心腳本

import os
import sys
import json
import time
import logging
import shutil
import argparse
from datetime import datetime, timedelta
from pathlib import Path

# 初始化日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('cleaner.log'),
        logging.StreamHandler(sys.stdout)
    ]
)

class SmartCleaner:
    def __init__(self, config_path):
        self.config = self.load_config(config_path)
        self.stats = {'deleted_files': 0, 'freed_space': 0}
        self.now = time.time()
        
        # 計算時間閾值 (秒)
        self.days_threshold = self.config['settings'].get('days_old', 7)
        self.time_threshold = self.now - (self.days_threshold * 86400)

    def load_config(self, path):
        try:
            with open(path, 'r', encoding='utf-8') as f:
                return json.load(f)
        except FileNotFoundError:
            logging.error(f"配置文件 {path} 未找到")
            sys.exit(1)

    def get_file_size(self, filepath):
        return os.path.getsize(filepath)

    def is_excluded(self, filename):
        """檢查文件是否在排除列表中"""
        exclusions = self.config.get('exclusions', [])
        return filename.lower() in [e.lower() for e in exclusions]

    def should_delete(self, filepath):
        """核心判斷邏輯:是否滿足刪除條件"""
        try:
            # 1. 檢查文件名白名單
            if self.is_excluded(os.path.basename(filepath)):
                return False
            
            # 2. 檢查后綴 (如果配置了特定后綴)
            exts = self.config['settings'].get('file_extensions', [])
            if exts:
                if os.path.splitext(filepath)[1].lower() not in exts:
                    return False

            # 3. 檢查訪問時間 (是否為舊文件)
            # stat.st_atime 是訪問時間,st_mtime 是修改時間。這里用 mtime 更穩(wěn)妥。
            file_mtime = os.path.getmtime(filepath)
            if file_mtime > self.time_threshold:
                return False
            
            # 4. 檢查文件大小 (防止誤刪正在寫入的大文件)
            max_size = self.config['settings'].get('max_file_size_mb', 500) * 1024 * 1024
            if os.path.getsize(filepath) > max_size:
                logging.warning(f"文件過大跳過: {filepath}")
                return False

            return True
        except Exception as e:
            logging.warning(f"檢查文件 {filepath} 時出錯: {e}")
            return False

    def clean_path(self, target_info):
        """清理指定目錄"""
        raw_path = target_info['path']
        # Windows環(huán)境變量展開
        path = os.path.expandvars(raw_path)
        recursive = target_info.get('recursive', True)

        if not os.path.exists(path):
            logging.warning(f"目錄不存在,跳過: {path}")
            return

        logging.info(f"正在掃描: {path} (遞歸: {recursive})")
        
        if recursive:
            walker = os.walk(path, topdown=False)
        else:
            # 非遞歸模式下,只處理當前目錄文件
            walker = [(path, [], os.listdir(path))]

        for root, dirs, files in walker:
            for file in files:
                file_path = os.path.join(root, file)
                
                if self.should_delete(file_path):
                    self.perform_delete(file_path)

    def perform_delete(self, filepath):
        """執(zhí)行刪除動作"""
        try:
            size = self.get_file_size(filepath)
            
            if self.config['settings']['dry_run']:
                logging.info(f"[模擬] 將刪除: {filepath} ({size/1024/1024:.2f} MB)")
            else:
                # 先嘗試刪除文件,如果文件被占用會拋出異常
                os.remove(filepath)
                logging.info(f"[已刪除] {filepath}")
                
            self.stats['deleted_files'] += 1
            self.stats['freed_space'] += size
            
        except PermissionError:
            logging.debug(f"權限不足/文件被占用,跳過: {filepath}")
        except Exception as e:
            logging.error(f"刪除 {filepath} 失敗: {e}")

    def clean_empty_dirs(self, target_info):
        """可選:清理空文件夾"""
        path = os.path.expandvars(target_info['path'])
        if not target_info.get('recursive', True): return
        
        logging.info(f"正在清理空文件夾: {path}")
        for root, dirs, files in os.walk(path, topdown=False):
            for dir_name in dirs:
                dir_path = os.path.join(root, dir_name)
                try:
                    if not os.listdir(dir_path): # 目錄為空
                        if not self.config['settings']['dry_run']:
                            os.rmdir(dir_path)
                            logging.info(f"[已刪除空目錄] {dir_path}")
                        else:
                            logging.info(f"[模擬] 將刪除空目錄: {dir_path}")
                except OSError:
                    pass

    def run(self):
        start_time = datetime.now()
        logging.info(f"===== 任務開始 (模擬模式: {self.config['settings']['dry_run']}) =====")

        for target in self.config['targets']:
            self.clean_path(target)
            # self.clean_empty_dirs(target) # 如需刪除空文件夾可取消注釋

        end_time = datetime.now()
        duration = (end_time - start_time).total_seconds()
        
        logging.info("===== 任務完成 =====")
        logging.info(f"掃描文件數: {self.stats['deleted_files']}")
        logging.info(f"釋放空間: {self.stats['freed_space'] / 1024 / 1024:.2f} MB")
        logging.info(f"耗時: {duration:.2f} 秒")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Windows 智能清理腳本")
    parser.add_argument('--dry-run', action='store_true', help='模擬運行,不實際刪除文件')
    args = parser.parse_args()

    # 如果命令行傳參,覆蓋配置文件
    config_file = 'config.json'
    cleaner = SmartCleaner(config_file)
    
    if args.dry_run:
        cleaner.config['settings']['dry_run'] = True
        
    cleaner.run()

四、 深度解析關鍵技術點

4.1 處理文件被占用的問題

在Windows中,直接刪除 TEMP 目錄下的文件經常會遇到 PermissionError。腳本中使用了 try...except PermissionError 捕獲塊。

  • 原理:如果文件正在被某個進程使用(如 .log 文件正在寫入),系統內核會鎖定句柄。
  • 策略:捕獲到異常后僅僅記錄 Debug 級別日志,不中斷程序。這保證了腳本不會因為幾個刪不掉的文件而崩掉。

4.2 環(huán)境變量與路徑處理

Windows路徑可能包含空格或特殊字符。代碼中使用 os.path.expandvars 自動將 %TEMP% 轉換為 C:\Users\Username\AppData\Local\Temp,極大地增強了配置的通用性。你可以直接在 config.json 中寫入標準的Windows環(huán)境變量。

4.3 安全時間閾值

這是腳本“智能”的核心。我們不刪除所有 .tmp 文件,而是檢查 os.path.getmtime。

  • 例如設置 days_old: 7。
  • 場景:你剛剛下載了一個安裝包,它解壓在 Temp 目錄,你正在安裝。腳本運行時,發(fā)現這個文件是“5分鐘前”創(chuàng)建的,小于7天,于是保留它。這保證了程序運行期間的穩(wěn)定性。

五、 自動化部署

有了腳本,我們需要讓它定期運行。Windows 11 的“任務計劃程序”是最佳選擇。

5.1 創(chuàng)建計劃任務步驟

1、打開任務計劃程序:按 Win + S,搜索 Task Scheduler。

2、創(chuàng)建基本任務:右側點擊 “Create Basic Task”。

  • Name: Weekly System Cleaner。
  • Trigger: Weekly (建議選每周,或每月),選擇具體時間(如周五晚上 22:00)。

3、設置動作

  • 選擇 Start a program。
  • Program/script: python.exe 的完整路徑(例如 C:\Python39\python.exe)。
  • Add arguments: 腳本的完整路徑(例如 D:\Scripts\smart_cleaner.py)。
  • Start in (可選): 腳本所在的目錄(D:\Scripts),這有助于Python正確找到 config.json。

4、高級設置

  • 勾選 Run with highest privileges(以最高權限運行),否則清理 C:\Windows\Temp 可能會報權限錯誤。
  • 在“Conditions”標簽頁,勾選 Start the task only if the computer is idle for...(僅在電腦空閑時運行),防止在你工作時突然卡頓。

5.2 效果監(jiān)控

每次腳本運行后,會在同目錄下生成 cleaner.log。你可以定期查看日志,確認:

  • 是否有頻繁出現的 PermissionError(可能有頑固軟件一直在鎖定文件)。
  • 每次釋放了多少空間,驗證清理效果。

六、 總結與進階

這套方案相比傳統的批處理腳本(.bat)具有極高的可維護性。

后續(xù)進階方向:

  • 郵件通知:使用 Python 的 smtplib 庫,在任務跑完后,自動發(fā)送一封包含“釋放空間數量”的郵件到管理員郵箱。
  • 瀏覽器緩存:Chrome 和 Edge 的 SQLite 數據庫文件在打開時是鎖定的。可以通過調用瀏覽器命令行參數 --disk-cache-dir 來指定緩存位置,或者在清理腳本中增加關閉瀏覽器進程的邏輯。
  • 圖形化界面:使用 PySimpleGUI 為這個腳本套一層殼,做成一個綠色小工具,方便公司非技術人員使用。

通過這篇文章,你已經擁有了一個工業(yè)級的、安全的Windows 11自動化清理解決方案。立即部署,讓C盤重回“滿血”狀態(tài)吧!

以上就是使用Python輕松構建一個Windows11系統智能垃圾清理系統的詳細內容,更多關于Python Windows垃圾清理的資料請關注腳本之家其它相關文章!

相關文章

  • PyTorch實現MNIST數據集手寫數字識別詳情

    PyTorch實現MNIST數據集手寫數字識別詳情

    這篇文章主要介紹了PyTorch實現MNIST數據集手寫數字識別詳情,文章圍繞主題展開詳細的內容戒殺,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • python 生成器協程運算實例

    python 生成器協程運算實例

    下面小編就為大家?guī)硪黄猵ython 生成器協程運算實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • python中的hashlib模塊使用實例

    python中的hashlib模塊使用實例

    這篇文章主要介紹了python中的hashlib模塊使用實例,hashlib是一個提供字符串加密功能的模塊,包含MD5和SHA的算法,MD5和SHA是摘要算法,文中以實例代碼講解hashlib模塊的基本用法,需要的朋友可以參考下
    2023-08-08
  • 使用python生成楊輝三角形的示例代碼

    使用python生成楊輝三角形的示例代碼

    這篇文章主要介紹了使用python生成楊輝三角形的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Python灰度變換中伽馬變換分析實現

    Python灰度變換中伽馬變換分析實現

    灰度變換是指根據某種目標條件按一定變換關系逐點改變源圖像中每個像素灰度值的方法。目的是改善畫質,使圖像顯示效果更加清晰。圖像的灰度變換處理是圖像增強處理技術中的一種非?;A、直接的空間域圖像處理方法,也是圖像數字化軟件和圖像顯示軟件的一個重要組成部分
    2022-10-10
  • Python可視化學習之seaborn繪制矩陣圖詳解

    Python可視化學習之seaborn繪制矩陣圖詳解

    矩陣圖即用一張圖繪制多個變量之間的關系,數據挖掘中常用于初期數據探索。本文介紹python中seaborn.pairplot和seaborn.PairGrid繪制矩陣圖,需要的可以參考一下
    2022-02-02
  • python線程池的四種好處總結

    python線程池的四種好處總結

    在本篇文章里小編給大家整理的是一篇關于python線程池的四種好處歸納內容,有興趣的朋友們可以學習下。
    2021-04-04
  • 使用Python 統計文件夾內所有pdf頁數的小工具

    使用Python 統計文件夾內所有pdf頁數的小工具

    這篇文章主要介紹了Python 統計文件夾內所有pdf頁數的小工具,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 在Python中COM口的調用方法

    在Python中COM口的調用方法

    今天小編就為大家分享一篇在Python中COM口的調用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Tensorflow簡單驗證碼識別應用

    Tensorflow簡單驗證碼識別應用

    這篇文章主要為大家詳細介紹了Tensorflow簡單驗證碼識別應用的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論

黑龙江省| 英吉沙县| 乌审旗| 资源县| 柏乡县| 孝昌县| 兴宁市| 萨嘎县| 吐鲁番市| 尼木县| 普兰店市| 上高县| 赣州市| 建平县| 邯郸县| 积石山| 长治市| 化隆| 平塘县| 汨罗市| 东兰县| 赣榆县| 乌苏市| 潮安县| 黄梅县| 土默特左旗| 甘南县| 临西县| 罗源县| 都江堰市| 华蓥市| 师宗县| 化德县| 东光县| 莱芜市| 洛隆县| 沿河| 枞阳县| 武胜县| 邯郸市| 黄山市|