【脚本工具】QQ个人数据管理方法与脚本

企鹅用户的数据清理痛点

电脑QQ用户有一个长期的痛点,那就是QQ经常下载没有用的广告、聊天图片、文件缓存,占据大量磁盘空间,导致C盘爆掉。

网上有五花八门的清理方法,但都很散乱。就我搜索到的清理数据途径大概有几种:

(1)删除特定群聊/私聊的聊天记录:直接在“消息管理器”中删除

(2)QQ中自带的“文件管理-个人文件夹清理”

默认放在一个叫Tencent Files\QQ号的文件夹下面,这个可以自定义。

(3)XX电脑管家等第三方的检测清理软件

没用过。我不想为了一个小需求而安装整个软件。

(4)手动找出数据储存目录进行清理

一般很难知道具体可以清理的路径是什么,而且手动清理太累了。

以上的途径都遗留不少问题。比如,感觉清理得还是不彻底、或者扫描清理过程太慢了。如果是一台陈年旧电脑,能直接搞崩溃。

造成这件事情的根本原因,就是企鹅的文件构建方式太弱智了,让某些文件夹难以被检测到(如group2文件夹),而且让逐个遍历的过程变得巨麻烦。

相关问题的讨论可以参考知乎问题: QQ文件夹下面群图片存储怎么多出了一个Group2? - 知乎

另外,我们自己也会有一些自己更个性化的需求,通用的方法没法照顾到,手工完成又太累。

所以我决定从QQ本地文件夹入手,通过精细化的目录拆解方法,用脚本删掉那些对自己来说不需要保留的文件,以一劳永逸地解决这个问题。

要提示的是,分享教程的目的,不是让copy代码就完事,而是体会构建这个脚本的核心方法。

了解QQ文件夹的结构

为了便于管理,我从磁盘划出来了一个独立的分区(也就是DEFG盘)用来储存QQ、微信的这些常清的数据,避免祸害C盘。(也因为低估了这个空间,分出来没用几天就爆掉,所以我才要写这个脚本……)

以默认目录Tencent Files为例,一般下面有QQ号组成的子目录,以及All Users子目录。

首先清理QQ号目录。这个目录代表着这个账号的数据。

关于下层的文件夹,我列了一个表格总结它们负责存放什么内容(参考网上资料和亲测),以及所采取的处理策略:

这个表格只是列举了一些,有很多没弄清楚用途的(特别是.db这种加密过的数据库)就先不处理了,日后我会慢慢把这个表格补充完整。

总的来说,处理策略大概可以分为3种:

(1)马上删掉的

比如广告、群聊图片、各种可再生的缓存,删掉不会有任何影响。

(2)定期清理的

比如n个月以前的工作文件,语音等等,这个很好理解。

(3)长期保留的

除非是换电脑之类的需要批量迁移数据的情况,随便删掉的风险较大的文件。比如msg3.0index.db、Msg3.0.db这2个大文件,收集了所有QQ聊天记录,直接删掉的风险较大,但不删的话文件大小却每天都在增长,占掉很多空间。

相关的讨论可以参考这篇win10电脑C盘内存不断减少解决方案(C盘爆满、Msg3.0index.db)_净无邪博客-CSDN博客_msg3.0index

在定义了自己要清理哪些文件以后,就可以开始写脚本了。

写简单的powershell脚本

因为我用的是windows系统,所以用powershell来写了个QQcleaner.ps1脚本。(如果是linux系统,道理应该也一样)

今天发的粗糙版本实现了:对特定的文件夹的清理,可以做到对“定期清理类”数据的自定义天数之前文件的清理,并且可以处理多个QQ账号。

要说明的是,脚本还有很多漏洞,每个人的文件夹情况也有可能不同,需要自行调整。

脚本涉及的powershell命令主要有下面几个:

#0.默省的变量声明
$myQQfiledir=<默认目录的路径> #如Tencent Files
$id=<QQ号>
$TimeOutDays=14 #假定清理半个月之前的文件

#1. 删除文件和文件夹的命令
Remove-Item <要删除的文件或路径> -Recurse 
# -Recurse参数是为了递归删除下面所有子项,除此以外还可以加-force,-confirm等。
# 这个其实还可以改成不删除Ads文件夹,只删除下面的子项。不过就算删了QQ也会自己新建回来,所以删掉也无所谓。

#2. foreach函数进行遍历
foreach(<变量> in <变量列表>)
{
    #处理的语句
}

#3. 把进程声明打印到屏幕
Write-Host <要打印的内容>  -NoNewline 
#这个可以提示目前正在清理哪个目录
#-NoNewline 用于不在新行打印后一句内容

#4. 函数的定义和调用
Function cleanlog ($arg1,$arg2) #传入两个参数
{
    #函数的内容
}
cleanlog $arg1 $arg2

#5.时间日期的提取
get-date #系统当前日期和时间
$files.lastwritetime #$files 这个文件的最后修改时间
# 当然,也可以用$files.creationtime的最后创建时间来计算
((get-date)-$files.lastwritetime).days #两个时间相减,以天数为单位表示结果

#6.检查空目录
Test-Path <路径>

完整代码:

#QQ文件清理工具
#powershell中调用的命令: QQcleaner.ps1
#若遇到禁止执行,先输入set-ExecutionPolicy RemoteSigned

#默认设置#
$myQQfiledir='C:\xxx' #腾讯QQ中设置默认文件储存目录
$QQnumbers='888888888','888888888' #我的两个QQ账号
$TimeOutDays=14 #多少天前的文件


#定义垃圾文件函数
Function cleanrubbish ($id)
{
    #可清理的垃圾文件夹名单
$myrubbishdir='Video','Audio','Ads','QZoneLover','Image\Group2\','CloudRes','SelCreateGroupHead','VasscUpdate','Image\HistroyHead','Image\MarktingMsgCachePic','Image\Thumbnails','Image\PhotoWall','MyCollection','GroupCollection','Image'
    foreach( $rubbish in $myrubbishdir)
    {
        Write-Host ('checking:'+$myQQfiledir+'\'+$id+'\'+$rubbish) -NoNewline
        if (Test-Path ($myQQfiledir+'\'+$id+'\'+$rubbish)) #目录存在时再处理
        {
            Remove-Item ($myQQfiledir+'\'+$id+'\'+$rubbish) -Recurse 
            Write-Host ('   >>> done.') 
        }
        else{Write-Host ('   >>> skipped.') } #目录不存在时跳过
    } 
    Write-Host "___________cleaning all rubbish!___________" 
}

#定义定期清理文件函数
Function cleanlog ($id,$TimeOutDays)
{   #定义待清理的log目录列表
    $mylogdir='Image\C2C','Image\Thumbnails','FileRecv'
    #$id='809600520'
    foreach($logdir in $mylogdir)
    {   
        $filePath=$myQQfiledir+'\'+$id+'\'+$logdir
        Write-Host ('checking:'+$filePath) -NoNewline
        if (Test-Path $filePath)  #检查是否空目录
        {    #获取非空目录下所有文件
            $files=get-childitem -path $filePath  
            foreach($file in $files)
            {   
                #计算距今天的时间(按最后修改日期或创建日期)
                $daypan=((get-date)-$file.lastwritetime).days  #$daypan=((get-date)-$file.creationtime).days
                #判断超过一定范围时间的文件清理掉 
                if ($daypan -gt $TimeOutDays){
                    remove-item  $file.fullname -Recurse 
                    Write-Host $file'   >>> done.'
                }        
	        }
        }
        else{Write-Host ('   >>> skipped.')}
    }
    Write-Host "___________ cleaning all log!___________" 
}
   
    
#批量执行
foreach($id in $QQnumbers)
{   
    Write-Host "——————————Start cleaning QQ account: "$id" ——————————"
    #调用方法:函数名+QQ号
    cleanrubbish $id 
    cleanlog $id $TimeOutDays
    Remove-Item $myQQfiledir\files -Recurse #删除通用的files目录
    Remove-Item $myQQfiledir\$id\Msg3.0index.db -Confirm #删除消息记录索引数据库(可再生)
}

脚本的使用

调用ps1脚本的方法:powershell界面,进入脚本所在的目录,输入 <脚本名>.ps1

第一次跑powershell脚本,会遇到windows没有脚本执行权限的问题。这是因为系统默认是Restricted 执行策略,不允许任何脚本运行。

解决办法:管理员身份运行powershell,输入set-ExecutionPolicy RemoteSigned命令,重启。然后就能直接用了。

也可以在桌面右键ps1文件,选择用powershell运行。

跑出来的效果:提示目前正在清理的QQ账号,以及具体的文件夹作了何种处理(默认跳过空目录)。

 

问题更新(2022.4.11)

今天用脚本发现突然不行了,排查问题发现两点:

①定期清理功能的bug改好了

②有一些地方\打多了,拼接后会变成\\,影响路径引用。需要改一下这部分的细节。


以上就是今天的分享。

下次会针对安卓QQ出一个清理教程。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值