发布于 

免登录,用脚本提前修改微信、企业微信、QQ 的聊天路径

为什么要改聊天路径

微信、企业微信、QQ 的聊天记录默认都是放在登录用户的文档目录下面的

1
2
登录用户的文档目录路径
C:\Users\%USERNAME%\Documents

在我的日常工作中,碰到的 C 盘空间满的问题,近 90% 是因为聊天记录放在 C 盘的原因。

C盘空间满

微信默认是在线就会把加入的所有群聊的聊天记录自动同步的,而很多人工作和生活都是用的同一个微信账号,除了工作群之外,更是加了不少日常生活的群,大部分生活群的图片和视频数量泛滥成灾,这些图片和视频也会一并同步到电脑上。

即使只是微信账号上只有纯粹的工作群,在工作上需要掺杂大量图片及视频来进行沟通的聊天也不在少数,更是有臭名昭著的转发文件就复制一份文件的问题,至今电脑版仍然没有解决这个问题,微信的聊天记录体积的膨胀速度非常可观。

微信的转发重复文件

聊天记录的膨胀速度已经是一个不容忽视的问题。

目前大部分企业在考虑经济及实用性的情况下,新购置的普通文职员工的电脑多为 128GB ~ 256GB 固态硬盘 + 500GB ~ 1TB 机械硬盘 的组合。

不改聊天记录路径的情况下,使用一定时间后, 除去必要的操作系统、安装的软件,128GB ~ 256GB 固态硬盘的剩余容量很容易就被聊天记录占满。

在我的日常工作中,因为 C 盘满而去处理的电脑里面,微信的聊天记录大部分情况下是占用最大,体积范围大部分分布在 50GB ~ 150GB 左右

微信的聊天记录大部分情况下是占用最大的

我们不能指望用户自己去更改聊天路径、清理不需要的聊天记录。

我们也无法分辨哪些聊天记录是有用的。

在软件里面更改聊天记录路径也需要登录后才能更改,很不方便。

所以我更倾向于在新电脑交付使用前,就将聊天记录的路径给改到 D 盘,以避免后期的聊天记录过大的问题。

决定聊天记录路径的参数

假设想要把聊天记录的路径都成这种格式的路径下面,D盘\Chats\登录用户名

例如 D:\Chats\tjxwork

下面用这个路径来做演示

微信

1
2
3
4
5
6
7
8
9
10
11
当前用户注册表中,微信的聊天记录路径参数为

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Tencent\WeChat]
"FileSavePath"="D:\\Chats\\tjxwork"


此时微信的聊天记录实际路径为
D:\Chats\tjxwork\WeChat Files

HKEY_CURRENT_USER\Software\Tencent\WeChat

注意:

  1. 微信会在设置的路径下面自动生成一个 WeChat Files 的文件夹,聊天记录在这个文件夹下面

  2. 如果是用过微信的话,微信可能会在用户文件夹里面存一份 3ebffe94.ini 文件来保留聊天记录的位置,

    如果这份 ini 文件存在的话,就会优先读取 ini 文件里面定义的路径。

为确保注册表的参数生效,需要删除这份文件。

1
2
3
微信 放用户文件夹中的 3ebffe94.ini 的文件路径

C:\Users\%USERNAME%\AppData\Roaming\Tencent\WeChat\All Users\config\3ebffe94.ini

企业微信

1
2
3
4
5
6
7
8
9
10
11
当前用户注册表中,企业微信的聊天记录路径参数为

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Tencent\WXWork]
"DataLocationPath"="D:\\Chats\\tjxwork\\WXWork"


此时企业微信的聊天记录实际路径为
D:\Chats\tjxwork\WXWork

HKEY_CURRENT_USER\Software\Tencent\WXWork

企业微信就没有微信的优先 ini 配置文件问题,基本是纯注册表来配置的。


有一个要注意的点是,新版本企业微信新安装的话,貌似会生成一个 DataLocation 的项,以前是直接生成 DataLocationPath 指向用户文档下

DataLocation 当此项为 1 的时候,而且 DataLocationPath 不存在时,企业微信的聊天记录路径指向用户的 AppData 目录下

DataLocationPath 项存在的情况下,会无视 DataLocation 项,即使删除 DataLocation 也没影响。

一般情况,只修改企业微信的聊天记录路径不需要考虑这个问题,但如果想要读取已有的企业微信的聊天记录路径的话,就需要考虑这个问题了。

1
2
3
企业微信注册表,当 DataLocation 为 1,而且 DataLocationPath 不存在时,聊天记录路径为

C:\Users\%USERNAME%\AppData\Roaming\Tencent\WXWork\Data

当 DataLocation 为 1,而且 DataLocationPath 不存在时

QQ

QQ 可能是因为腾讯早期产品的原因,是用 ini 配置文件来决定聊天记录路径的,配置文件放在 C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini,这个是公用文件下的路径,也就是说所有用户都是使用同一个 ini 配置文件。

QQ 的聊天记录路径基本只有两种模式:

  1. 放在 C:\Users\%USERNAME%\Documents 下面
  2. 放在指定的文件路径下

这也就导致指定了 QQ 的聊天记录,没法在自定义聊天记录路径的情况下按用户名文件夹来区分,好在 QQ 聊天记录文件夹下基本都是用 QQ 号来区分开的。

如果想的话,理论上可以写一个脚本在用户登录时触发,每次登录都把 QQ 的聊天记录的路径改到以特定路径的用户名文件夹下来分类,但是同样考虑到用户可能有修改路径的需求,所以暂时不尝试此方法。

如果是企业微信的话,当所有用户企业微信的聊天记录是同一个路径时,你切换用户之后甚至能直接登录,现在不知道修复这个问题没有。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
QQ聊天记录的配置文件路径
C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini

QQ聊天记录的配置文件内容

[UserDataSet]
UserDataSavePathType=2
UserDataSavePath=D:\Chats\Tencent Files

此时QQ的聊天记录实际路径为
D:\Chats\Tencent Files

当 UserDataSavePathType 的值是 2 时,代表使用指定的聊天记录路径,此时聊天记录的路径会按 UserDataSavePath 的值生效,
如果值是 1 ,就是直接使用 "C:\Users\%USERNAME%\Documents\Tencent Files" 做为聊天记录路径


C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini

基础脚本

下面这两个脚本是在当前用户下修改聊天记录用的

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
: 修改微信、企业微信、QQ的聊天记录路径.bat

: 关闭Bat脚本的回显
@echo off
color 0a
echo.

: 定义聊天记录的存放路径
SET Chats_Path=D:\Chats

: 判断D盘是否存在
if exist D:\ (

: 新建用户名文件夹
MD %Chats_Path%\%USERNAME%

: 微信
REG ADD "HKEY_CURRENT_USER\Software\Tencent\WeChat" /v FileSavePath /t REG_SZ /d "%Chats_Path%\%USERNAME%" /f
DEL "C:\Users\%USERNAME%\AppData\Roaming\Tencent\WeChat\All Users\config\3ebffe94.ini"

: 企业微信
REG ADD "HKEY_CURRENT_USER\Software\Tencent\WXWork" /v DataLocationPath /t REG_SZ /d "%Chats_Path%\%USERNAME%\WXWork" /f

: QQ
SET %QQUserDataConfigPath%=C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini
MD "C:\Users\Public\Documents\Tencent\QQ"
echo [UserDataSet] > %QQUserDataConfigPath%
echo UserDataSavePathType=2 >> %QQUserDataConfigPath%
echo UserDataSavePath=%Chats_Path%\Tencent Files >> %QQUserDataConfigPath%

)

: 等3秒再关窗口
choice /c abc /t 3 /d a /m "/t wait" /n >nul

PowerShell

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

# 修改微信、企业微信、QQ的聊天记录路径.ps1

# 聊天记录的存放路径
$Chats_Path = "D:\Chats"

# 判断D盘是否存在
if (Test-Path D:) {


# 新建用户名文件夹
New-Item -Path $Chats_Path\$env:USERNAME -ItemType Directory


# 微信
New-Item -Path "Registry::HKEY_CURRENT_USER\Software\Tencent\WeChat" -Force
New-ItemProperty -Path "Registry::HKEY_CURRENT_USER\Software\Tencent\WeChat" -Name "FileSavePath" -Value "$Chats_Path\$env:USERNAME" -Force
Remove-Item -Path "C:\Users\$env:USERNAME\AppData\Roaming\Tencent\WeChat\All Users\config\3ebffe94.ini" -Force -ErrorAction SilentlyContinue


# 企业微信
New-Item -Path "Registry::HKEY_CURRENT_USER\Software\Tencent\WXWork" -Force
New-ItemProperty -Path "Registry::HKEY_CURRENT_USER\Software\Tencent\WXWork" -Name "DataLocationPath" -Value "$Chats_Path\$env:USERNAME\WXWork" -Force


# QQ
$QQUserDataConfigPath = "C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini"

New-Item -Path "C:\Users\Public\Documents\Tencent\QQ\" -Type Directory -Force

"[UserDataSet]" | Out-File -FilePath $QQUserDataConfigPath -Force -Encoding Oem
"UserDataSavePathType=2" | Out-File -FilePath $QQUserDataConfigPath -Force -Append -Encoding Oem
"UserDataSavePath=$Chats_Path\Tencent Files" | Out-File -FilePath $QQUserDataConfigPath -Force -Append -Encoding Oem
# 要注意的QQ这个ini配置文件会受不同语言系统下的文件编码影响(以前是,现在没再次确认)
# 繁体系统下面配置文件和简体系统下面的是不一样(Big5、GB 2312),不能直接复制ini文件过去。
# 所以这里生成的时候也用了 "Oem”" 这个选项。使用系统CMD的默认编码。

}

# 等3秒
Start-Sleep -Seconds 3

参数备注:

-ErrorAction SilentlyContinuecmdlet 如何从命令响应非终止错误

-Encoding OemPowerShell 中的字符编码

可以看出来,用 Powershell 的原生命令改简单的注册表还是有点麻烦的,特别是新建这种操作,所以我更倾向于直接用 Reg.exe,
就上面 Bat 里面的 REG ADD 命令,在 PowerShell 脚本里面也是能直接用的。

进阶用法

我常用的修改的方法有几种:

  1. 写成脚本在当前用户下运行。
  2. 直接修改默认用户注册表配置模板,新用户登录时会使用这个模板的路径,缺点是无法按用户名文件夹区分。
  3. 装好系统后(或者封装镜像时),在管理员下,把修改路径的脚本放在所有用户都能访问公用文件夹内。修改默认用户注册表配置模板,将修改脚本加入注册表启动,登录运行时就会触发脚本来修改。考虑到用户自己可能会需要自行修改聊天路径,所以在脚本的最后加一条命令,用于删除当前用户注册表中启动脚本的启动项,避免每次登录都修改一次。

我觉得第 3 种是最理想的,下面第 2 种、第 3 种的脚本示例。

以下脚本请在管理员权限下运行

修改默认用户注册表配置模板

新用户的注册表,其实是通过复制 C:\Users\Default\NTUSER.DAT 这个注册表来生成实现的,所以可以通过提前修改这个注册表的参数来实现提前设置。

但是因为没办法不通过脚本的情况下,提前预处理工号的字段路径,所以,这种改法所有用户的聊天记录都放在一起,没法按用户名文件夹来区分,多用户使用可能会造成混乱。

下面这里把聊天记录都改到了 D:\Chats

微信的聊天记录实际路径为:
D:\Chats\WeChat Files

企业微信的聊天记录实际路径为:
D:\Chats\WXWork

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
: 更改以后登录的新用户微信企业微信QQ聊天记录路径到D盘.bat

: 定义聊天记录的存放路径
SET Chats_Path=D:\Chats

: 判断D盘是否存在
if exist D:\ (

: 修改默认用户注册表
REG LOAD HKEY_USERS\User_Default C:\Users\Default\NTUSER.DAT
REG ADD "HKEY_USERS\User_Default\Software\Tencent\WeChat" /v FileSavePath /t REG_SZ /d "%Chats_Path%\" /f
REG ADD "HKEY_USERS\User_Default\Software\Tencent\WXWork" /v DataLocationPath /t REG_SZ /d "%Chats_Path%\WXWork" /f
REG UNLOAD HKEY_USERS\User_Default

: 生成QQ配置文件
SET %QQUserDataConfigPath%=C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini
MD "C:\Users\Public\Documents\Tencent\QQ"
echo [UserDataSet] > %QQUserDataConfigPath%
echo UserDataSavePathType=2 >> %QQUserDataConfigPath%
echo UserDataSavePath=%Chats_Path%\Tencent Files >> %QQUserDataConfigPath%

)

首次登录时修改聊天记录路径

运行效果:会生成一个 "C:\Users\Public\Documents\NewUserChatsPath.bat" 文件,新用户首次登录时会触发一次 NewUserChatsPath.bat

NewUserChatsPath.bat 脚本与上面的基础脚本基本效果一样 D盘\Chats\登录用户名

PowerShell

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
# 用户首次登录时修改聊天记录路径.ps1

# 聊天记录的存放路径
$Chats_Path = "D:\Chats"

# 判断D盘是否存在
if (Test-Path D:) {

# 生成修改微信与企业微信的聊天记录路径的Bat脚本
$Bat_Script = "C:\Users\Public\Documents\NewUserChatsPath.bat"

"MD D:\Chats\%USERNAME%" | Out-File -FilePath $Bat_Script -Force -Encoding Oem
"REG ADD `"HKEY_CURRENT_USER\Software\Tencent\WeChat`" /v FileSavePath /t REG_SZ /d `"D:\Chats\%USERNAME%`" /f" | Out-File -FilePath $Bat_Script -Force -Append -Encoding Oem
"REG ADD `"HKEY_CURRENT_USER\Software\Tencent\WXWork`" /v DataLocationPath /t REG_SZ /d `"D:\Chats\%USERNAME%\WXWork`" /f" | Out-File -FilePath $BatScript -Force -Append -Encoding Oem
"REG DELETE `"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run`" /v StartuRunNewUserChatsPath /f" | Out-File -FilePath $Bat_Script -Force -Append -Encoding Oem

# 修改默认用户注册表,添加修改聊天路径的Bat脚本的启动信息
REG LOAD HKEY_USERS\User_Default C:\Users\Default\NTUSER.DAT
REG ADD "HKEY_USERS\User_Default\Software\Microsoft\Windows\CurrentVersion\Run" /v StartuRunNewUserChatsPath /t REG_SZ /d "$BatScript" /f
REG UNLOAD HKEY_USERS\User_Default

# 生成QQ聊天记录路径的ini配置文件
$QQUserDataConfigPath = "C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini"
New-Item -Path "C:\Users\Public\Documents\Tencent\QQ\" -Type Directory -Force
"[UserDataSet]" | Out-File -FilePath $QQUserDataConfigPath -Force -Encoding Oem
"UserDataSavePathType=2" | Out-File -FilePath $QQUserDataConfigPath -Force -Append -Encoding Oem
"UserDataSavePath=$Chats_Path\Tencent Files" | Out-File -FilePath $QQUserDataConfigPath -Force -Append -Encoding Oem
}

Bat

这个用 Bat 来写感觉会有点别扭,连空格都要注意,所以建议还是用 PowerShell

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
: 用户首次登录时修改聊天记录路径.bat

: 聊天记录的存放路径
SET Chats_Path=D:\Chats

: 判断D盘是否存在
if exist D:\ (

: 生成修改微信与企业微信的聊天记录路径的Bat脚本
SET Bat_Script=C:\Users\Public\Documents\NewUserChatsPath.bat

echo SET Chats_Path=%Chats_Path% > %Bat_Script%
echo MD %%Chats_Path%%\%%USERNAME%% >> %Bat_Script%
echo REG ADD "HKEY_CURRENT_USER\Software\Tencent\WeChat" /v FileSavePath /t REG_SZ /d "%%Chats_Path%%\%%USERNAME%%" /f >> %Bat_Script%
echo REG ADD "HKEY_CURRENT_USER\Software\Tencent\WXWork" /v DataLocationPath /t REG_SZ /d "%%Chats_Path%%\%%USERNAME%%\WXWork" /f >> %Bat_Script%
echo REG DELETE "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v StartuRunNewUserChatsPath /f >> %Bat_Script%


: 修改默认用户注册表,添加修改聊天路径的Bat脚本的启动信息
REG LOAD HKEY_USERS\User_Default C:\Users\Default\NTUSER.DAT
REG ADD "HKEY_USERS\User_Default\Software\Microsoft\Windows\CurrentVersion\Run" /v StartuRunNewUserChatsPath /t REG_SZ /d "%Bat_Script%" /f
REG UNLOAD HKEY_USERS\User_Default


: 生成QQ聊天记录路径的ini配置文件
SET %QQUserDataConfigPath%=C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini

MD "C:\Users\Public\Documents\Tencent\QQ"
echo [UserDataSet] > %QQUserDataConfigPath%
echo UserDataSavePathType=2 >> %QQUserDataConfigPath%
echo UserDataSavePath=%Chats_Path%\Tencent Files >> %QQUserDataConfigPath%

)

在管理员用户下修改未登录的已存在用户的聊天路径

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
: 在管理员用户下修改未登录的已存在用户的聊天路径.bat

@echo off
color 0a
echo.

: 提示输入你要改的用户和路径
SET /p UserFolder=User Folder Name (tjxwork):
SET /p WeChat_Path=WeChat Path (D:\Chats\tjxwork):
SET /p WXWork_Path=WXWork Path (D:\Chats\tjxwork\WXWork):

: 挂载指定用户的注册表进行修改
REG LOAD HKEY_USERS\User_Temp C:\Users\%UserFolder%\NTUSER.DAT
REG ADD "HKEY_USERS\User_Temp\SOFTWARE\Tencent\WeChat" /v FileSavePath /t REG_SZ /d "%WeChat_Path%" /f
REG ADD "HKEY_USERS\User_Temp\SOFTWARE\Tencent\WXWork" /v DataLocationPath /t REG_SZ /d "%WXWork_Path%" /f

: 下面这3行的作用是打开Regedit.exe让你看看有没有改成功
TASKKILL /F /IM Regedit.exe /T
REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v LastKey /t REG_SZ /d "HKEY_USERS\User_Temp\SOFTWARE\Tencent\WeChat" /f
Regedit.exe

: 按任意键完成修改,结束Regedit.exe,卸载用户注册表
Pause

TASKKILL /F /IM Regedit.exe /T
REG UNLOAD HKEY_USERS\User_Temp

: 等3秒再关窗口
choice /c abc /t 3 /d a /m "/t wait" /n >nul

补充

我实际中用的脚本和这些例子的参数命名之类都不太一样,加上时间跨度有点长,命名风格有点乱。

有些在用代码没必要也不方便直接放出,上面写的例子我都是删减并改过的,但没空做太多验证测试,如果有出错的地方劳驾指出,请见谅。


原文作者:tjxwork
原文链接:https://www.tjxblog.com/blog/2023-0001
发布时间:2023-01-10