Windows系统C盘清理

概述

随着使用时间的增长,Windows系统C盘上会产生大量的临时文件、软件缓存、日志文件等,这些文件会占用越来越多的磁盘空间,从而导致系统运行缓慢、响应迟钝等问题。如果及时清理这些无关紧要的文件,就可以为计算机腾出更多的磁盘空间,提高系统性能和响应速度。我们可以通过 SpaceSniffer 等磁盘空间分析软件可以分析出C盘中占用空间比较大的目录或文件。

通常安装的应用程序都会将运行时的数据、缓存、日志、临时文件等存到C盘的 C:\Users\%username%\AppData 目录下,所以这个目录一般会比较占用空间。Windows系统的AppData目录是用于存储应用程序数据的文件夹,它位于每个用户的个人文件夹中。通常情况下,这个文件夹是隐藏的,需要在文件夹选项中选择“显示隐藏的文件、文件夹和驱动器”才能看到。AppData目录包含三个子目录:Local、Roaming和LocalLow。其中:

  1. Local:存储应用程序无需跨多设备同步的数据,包括本地应用程序数据,包括缓存、日志、临时文件等。例如:编译器构建缓存,浏览器缓存等。
  2. Roaming:存储用户配置文件和跨多设备同步的数据。例如:vscode配置、QQ聊天记录、浏览器书签等。
  3. LocalLow:存储低权限访问数据,例如:在受保护模式下运行时浏览器的临时文件。

一般Local目录是下的文件都是可以删除的,因为这些文件通常不会影响到操作系统的正常运行。但是对于用户安装的应用程序,如果删除到这些程序的数据文件,则可能会影响应用程序的正常运行。缓存、日志、临时文件等都是可以删除的,但是由于这个目录存放了太多程序的数据,以至于很难找到它们,另外应用程序的数据文件又不知道该不该删除,所以删除这个目录里的文件就会变得很棘手。特别说明的是C:\Users\%username%\AppData\Local\Temp里的文件是可以放心删除的,不会影响到应用程序的正常运行。为了应用程序的正常运行,一般对于Roaming目录下的文件都不建议删除。

为了解决以上问题,这里给出两种处理方案:

定期清理方案

第一种就是总结C盘垃圾清理经验给出的Windows批处理脚本,只需双击执行这个脚本就能清除大部分不影响操作系统和应用程序运行的垃圾,不过这种方式只能一次性清理,需要定期执行清理脚本。脚本如下:

创建脚本文件:C盘垃圾清理.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
@echo off

::------------------------------ 自动提升运行权限 ------------------------------::
:BatchGetAdmin
>nul 2>&1 "%Windir%\System32\cacls.exe" "%Windir%\System32\config\system"

if '%ERRORLEVEL%' NEQ '0' (
echo 正在获取管理员权限...
goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%TEMP%\getAdmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%TEMP%\getAdmin.vbs"
"%TEMP%\getAdmin.vbs"
exit

:gotAdmin
if exist "%TEMP%\getadmin.vbs" ( del "%TEMP%\getadmin.vbs" )
pushd "%cd%"
cd /d "%~dp0"
::------------------------------------------------------------------------------::

echo 正在清除系统垃圾文件,请稍等......

goto han
**********这里是(liulangzhehwm)注释************************
参考:https://blog.csdn.net/xiaiming0/article/details/123843813
del DOS下的删除命令
/f 加个参数/f表示强制删除只读文件
/s 这个表示包括所有子目录中的文件
/q 这个表示不需要删除确认

*.tmp 所有的临时文件,*是通配符,tmp是临时文件的扩展名。
LOG 曰志文件
BAK 备份文件
CHK 由Windows磁盘碎片整理器或磁盘扫描保存的文件碎片

recycled 这就是回收站。
prefetch 预读取文件夹。用来存放系统已访问过的文件的预读信息,扩展名为PF。之所以自动创建Prefetch文件夹,是为了加快系统启动的进程.
temp 是临时文件夹
cookies 是IE浏览器下的文件夹,主要记录你浏览网页信息,包括:网址、缩略图、ID等。当你再次浏览这些网页时,就不再需要下载某些图片、输入ID、密码等,可以提高网页打开的速度,提高浏览速度。
local settings 文件夹是Windows操作系统中一个隐藏文件夹,我们在上网中产生的历史记录缓存都存放在local settings这个文件夹中。
Recent 是系统文件夹,里面存放着你最近使用的文档的快捷方式,以方便你再次访问。不推荐删除,因为这些文件都是快捷方式,不会占用你多少内存空间的。

%USERPROFILE% =C:\Users\用户名
%SystemRoot% =C:\WINDOWS
%SystemDrive% =C:
%APPDATA% =C:\Users\用户名\AppData\Roaming
%LOCALAPPDATA% =C:\Users\用户名\AppData\Local
%windir% =C:\WINDOWS
%Path% =C:\Windows\system32;C:\Windows;
%ProgramData% =C:\ProgramData
%ProgramFiles% =C:\Program Files
%ProgramFiles(x86)% =C:\Program Files (x86)
************************注释结束**********************
:han

del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
del /f /s /q "%userprofile%\recent\*.*"
echo 清除系统LJ完成!
echo. & pause

通过软链接迁移目录方案

1. 概述

第二种方案是针对于不能删除或者不清楚是否可以删除的情况,即通过将C盘中的目录移动到其他盘的目录,然后再在C盘原目录下建立同名的软链接指向新目录,软链接本身几乎不占用存储空间(几个字节),这种方式即能节省C盘空间又不影响操作系统和应用程序的运行。另外这种方式的优点就是比较省心,不用定期清理C盘。

2. 迁移目录并创建软链接

方式1:cmd命令迁移

管理员身份运行cmd命令执行:

1
2
3
4
5
6
7
8
9
10
#创建目录
mkdir 新目录路径

#复制原目录文件到新目录(由于Windows11上move命令无法跨盘符移动,故改用xcopy+rd实现)
xcopy /s /e /h /y 原目录路径 新目录路径
#删除原目录
rd /s /q 原目录路径

#创建软链接(原目录)
mklink /D 原目录路径 新目录路径

可以通过 SpaceSniffer 工具查找出C:/Users/%username%目录里空间占用比较大的目录,然后通过选择性的进行处理。建议原目录和新目录里的子目录保持一致,这样也更好维护一点,也能原目录和新目录的子目录相对路径一致,查找起来也比较方便。

💁‍♂ 提示:请务必确保所操作的目录没有被程序占用,一定注意要把相关目录占用的程序关掉(比如QQ、Chrome等),否则迁移失败。

📑 示例:通过软链接迁移腾讯软件(QQ、微信等)的数据和缓存目录

1
2
3
4
mkdir E:\Cache\SymlinkData\AppData\Local\Google
xcopy /s /e /h /y C:\Users\%username%\AppData\Roaming\Tencent E:\Cache\SymlinkData\AppData\Roaming\Tencent
rd /s /q C:\Users\%username%\AppData\Roaming\Tencent
mklink /D C:\Users\%username%\AppData\Roaming\Tencent E:\Cache\SymlinkData\AppData\Roaming\Tencent

🔖 常见的需要迁移的目录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
##(1)Chrome数据和缓存目录:
C:\Users\%username%\AppData\Local\Google #可迁移至:E:\Cache\SymlinkData\AppData\Local\Google

##(2)腾讯软件(QQ、微信等)的数据和缓存目录:
C:\Users\%username%\AppData\Roaming\Tencent #可迁移至:E:\Cache\SymlinkData\AppData\Roaming\Tencent

##(3)vscode
#vscode插件目录:
C:\Users\%username%\.vscode #可迁移至:E:\Cache\SymlinkData\.vscode
#vscode数据目录:
C:\Users\%username%\AppData\Roaming\Code #可迁移至:E:\Cache\SymlinkData\AppData\Roaming\Code
#vscode缓存目录(C盘没有数据的话可以不迁移):
C:\Users\%username%\AppData\Local\Programs\Microsoft VS Code #可迁移至:E:\Cache\SymlinkData\AppData\Local\Programs\Microsoft VS Code
#vscode C/C++编译缓存目录:
C:\Users\%username%\AppData\Local\Microsoft\vscode-cpptools #可迁移至:E:\Cache\SymlinkData\AppData\Local\Microsoft\vscode-cpptools

方式2:批处理脚本迁移

如果以上操作比较麻烦也可以将这些命令写成脚本执行,如下:

创建脚本文件:通过软链接迁移目录.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
@echo off
setlocal enabledelayedexpansion
::------------------------------ 自动提升运行权限 ------------------------------::
:BatchGetAdmin
>nul 2>&1 "%Windir%\System32\cacls.exe" "%Windir%\System32\config\system"

if '%ERRORLEVEL%' NEQ '0' (
echo 正在获取管理员权限...
goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%TEMP%\getAdmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%TEMP%\getAdmin.vbs"
"%TEMP%\getAdmin.vbs"
exit

:gotAdmin
if exist "%TEMP%\getadmin.vbs" ( del "%TEMP%\getadmin.vbs" )
pushd "%cd%"
cd /d "%~dp0"
::------------------------------------------------------------------------------::

:menu
cls
echo. ------------------------------------------------------------
echo. 指令菜单:
echo. 1.开始迁移目录
echo. 2.只创建软链接
echo. 3.退出
echo. ------------------------------------------------------------


set choose=""
set /p choose= 请输入指令[1/2/3]:
if /i "%choose%"=="1" (goto:start)
if /i "%choose%"=="2" (goto:tolink)
if /i "%choose%"=="3" (goto:exit) else ( goto:menu )


:start
@REM goto横行的代码中,最好重置一下变量的值,否则可能会变量污染
set old_path_dir=""
@REM 需要迁移的原目录路径
set /p old_path_dir=需要迁移的原目录路径:
for /f "delims=" %%i in ('echo %old_path_dir%') do set old_path_dir_value=%%i
if not exist "%old_path_dir_value%" (
cls & echo. && echo 原目录不存在!
pause
goto:menu
)

@REM 需要迁移的新目录路径
set new_path_dir=""
set /p new_path_dir=需要迁移的新目录路径:
for /f "delims=" %%i in ('echo %new_path_dir%') do set new_path_dir_value=%%i
if "%new_path_dir_value%"=="" (
cls & echo. && echo 输入非法,请重试!
pause
goto:menu
)
if exist "%new_path_dir_value%" (
cls & echo. && echo %new_path_dir_value% 目录已存在!
pause
goto:menu
)


:confirm
set is_confirm=""
set /p is_confirm=请务必确保所操作的目录没有被程序占用,确认输入y 否输入n:
if /i not "%is_confirm%" == "y" if /i not "%is_confirm%" == "n" (
echo 请输入 y 或 n
goto:confirm
) else if /i "%is_confirm%" == "n" (
goto:menu
)

@REM 创建新目录
mkdir "%new_path_dir_value%"
echo 创建新目录%new_path_dir_value%完成

@REM 移动原目录到新目录,由于Windows11上move命令无法跨盘符移动,故改用xcopy+del实现
xcopy /s /e /h /y "%old_path_dir_value%" "%new_path_dir_value%"
@REM echo "====%ERRORLEVEL%====="
if %ERRORLEVEL% NEQ 0 (
cls & echo. && echo 复制目录文件失败!请排查是否有程序占用%old_path_dir_value%目录的文件!
pause
goto:menu
)


@REM 删除原目录
rd /s /q "%old_path_dir_value%"

if exist "%old_path_dir_value%" (
cls & echo. && echo 删除原目录失败,请排查是否有程序占用相关目录内的文件!
set is_confirm_rd=""
set /p is_confirm_rd=是否需要删除已复制的新目录,确认输入y 否输入n:
if /i "!is_confirm_rd!" == "y" (
echo "删除中...."
rd /s /q "!new_path_dir_value!"
) else (
echo "您未删除已复制的新目录,如需重试则需要自行手动删除!"
)
pause
goto:menu
)

echo 移动原目录到新目录完成
goto:dolink

:tolink
@REM 设置软链接路径
set old_path_dir=""
set /p old_path_dir=设置软链接路径:
for /f "delims=" %%i in ('echo %old_path_dir%') do set old_path_dir_value=%%i
if "%old_path_dir_value%"=="" (
cls & echo. && echo 输入非法,请重试!
pause
goto:menu
)
@REM 设置软链接的目标目录路径
set new_path_dir=""
set /p new_path_dir=设置目标目录路径:
for /f "delims=" %%i in ('echo %new_path_dir%') do set new_path_dir_value=%%i
if "%new_path_dir_value%"=="" (
cls & echo. && echo 输入非法,请重试!
pause
goto:menu
)

:dolink
@REM 创建软链接
if exist "%old_path_dir_value%" (
cls & echo. && echo %old_path_dir_value% 目录已存在,不允许在已存在的目录创建链接!
pause
goto:menu
)
if not exist "%new_path_dir_value%" (
cls & echo. && echo 目标目录:%new_path_dir_value% 不存在!
pause
goto:menu
)

mklink /D "%old_path_dir_value%" "%new_path_dir_value%"
if %ERRORLEVEL% NEQ 0 (
cls & echo. && echo 创建软链接失败!!
pause
goto:menu
)
set "tip= 创建软链接完成:%old_path_dir_value% ==》 %new_path_dir_value%"
cls & echo. && echo %tip%
pause
goto:menu


::--------------------------------- 倒计时退出 ---------------------------------::
:exit
for /l %%t in (3,-1,0) do (
echo. & echo %%t 秒后退出...
choice.exe /t 1 /d y /n >nul
)

Exit

3. 查找创建的软链接

在后期的维护中创建的软链接越来越多,需要找出创建的软链接和其指向路径就会变得很麻烦。下面给出几种查找已创建软链接的方式。

方式1:cmd命令查找

可以通过如下cmd命令查找已创建软链接,操作如下:

1
2
3
4
#查看某目录及其子目录下的所有软软链接
dir /a:l /s
#如果打印的内容比较多还可以进一步过滤
dir /a:l /s | findstr /r "SYMLINKD"

方式2:python脚本查找

如果上面的cmd命令查找不理想,还可以通过执行python脚本来查找,操作如下:

创建脚本文件:get_symlinks.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import os
import tkinter
from tkinter import filedialog


def get_symlinks(path):
count = 0
for root, dirs, files in os.walk(path):
for name in dirs + files:
fullpath = os.path.join(root, name)
if os.path.islink(fullpath):
print(f"{fullpath} -> {os.readlink(fullpath)}")
count += 1

if count == 0:
print("该目录下没有软链接!")


if __name__ == '__main__':
tk = tkinter.Tk()
tk.withdraw()
directory = filedialog.askdirectory(
initialdir='C:\\Users\\'+os.environ.get("username"))
if len(directory) == 0:
exit(1)
get_symlinks(directory)

4. 其他说明

(1)关于快捷方式和软链接的说明

  • 快捷方式(shortcut):实际上是一个后缀.link的文件,删除快捷方式文件不影响原始文件,删除原始文件则快捷方式文件将变成无效文件。这个文件只有在windows图形界面下点击才能到达目标文件路径,在命令行下仅是一个文件,程序不会将其当作链接。

  • 软链接(symbolic link):也称符号链接,本质是一个指向文件或目录的指针文件,删除软链接文件不影响原始文件,删除原始文件则软链接文件将变成无效文件。这个文件在图形界面与快捷方式无异,但在命令行下程序会把它当做一个链接。



----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%