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

使用Python輕松構(gòu)建一個Windows11系統(tǒng)智能垃圾清理系統(tǒng)

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

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

一、 問題背景與需求分析

1.1 為什么系統(tǒng)自帶工具不夠用

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

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

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

我們需要針對Windows 11系統(tǒng)特性,精準(zhǔn)打擊以下目錄:

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

二、 技術(shù)方案設(shè)計

2.1 核心架構(gòu)

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

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

2.2 關(guān)鍵邏輯流程圖

三、 代碼實現(xiàn)

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

3.1 配置文件

這讓非技術(shù)人員也能調(diào)整清理策略,而不需要改代碼。

{
  "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:
            # 非遞歸模式下,只處理當(dāng)前目錄文件
            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"權(quán)限不足/文件被占用,跳過: {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"===== 任務(wù)開始 (模擬模式: {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("===== 任務(wù)完成 =====")
        logging.info(f"掃描文件數(shù): {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='模擬運(yùn)行,不實際刪除文件')
    args = parser.parse_args()

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

四、 深度解析關(guān)鍵技術(shù)點

4.1 處理文件被占用的問題

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

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

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

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

4.3 安全時間閾值

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

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

五、 自動化部署

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

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

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

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

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

3、設(shè)置動作

  • 選擇 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、高級設(shè)置

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

5.2 效果監(jiān)控

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

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

六、 總結(jié)與進(jìn)階

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

后續(xù)進(jìn)階方向:

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

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

以上就是使用Python輕松構(gòu)建一個Windows11系統(tǒng)智能垃圾清理系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Python Windows垃圾清理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PyTorch實現(xiàn)MNIST數(shù)據(jù)集手寫數(shù)字識別詳情

    PyTorch實現(xiàn)MNIST數(shù)據(jù)集手寫數(shù)字識別詳情

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

    python 生成器協(xié)程運(yùn)算實例

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

    python中的hashlib模塊使用實例

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

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

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

    Python灰度變換中伽馬變換分析實現(xiàn)

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

    Python可視化學(xué)習(xí)之seaborn繪制矩陣圖詳解

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

    python線程池的四種好處總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python線程池的四種好處歸納內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • 使用Python 統(tǒng)計文件夾內(nèi)所有pdf頁數(shù)的小工具

    使用Python 統(tǒng)計文件夾內(nèi)所有pdf頁數(shù)的小工具

    這篇文章主要介紹了Python 統(tǒng)計文件夾內(nèi)所有pdf頁數(shù)的小工具,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 在Python中COM口的調(diào)用方法

    在Python中COM口的調(diào)用方法

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

    Tensorflow簡單驗證碼識別應(yīng)用

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

最新評論

嘉义市| 吐鲁番市| 湖南省| 新昌县| 佛坪县| 高清| 陈巴尔虎旗| 高平市| 保德县| 裕民县| 西吉县| 百色市| 丽水市| 兰溪市| 南溪县| 桐城市| 滦平县| 浠水县| 安国市| 睢宁县| 株洲县| 庆阳市| 富阳市| 麻江县| 寻甸| 朝阳县| 慈溪市| 庐江县| 开封县| 垦利县| 周宁县| 宁国市| 长岭县| 专栏| 固镇县| 信丰县| 克东县| 杨浦区| 安图县| 长乐市| 黎平县|