[原]排错实战——VS清空最近打开的工程记录
缘起
vs
有一个功能 —— 在起始页会显示最近打开的工程列表,方便用户快速打开之前打开过的工程文件。但是打开的工程文件多了,想要找到自己需要的工程文件也不是那么容易的,要是能把之前打开的记录都清理干净该有多好啊。本文记录了我在查找vs2019
相关设置存储位置的调查过程 。对于vs2017
以前的版本,对应的设置是保存在注册表中的,从vs2017
开始,不再保存在注册表,而是存储在本地配置文件中。到底存储在哪里了呢?我们一起来看看吧!
调查
调查这种问题,当然优先考虑process monitor
了,对吧?
使用process monitor
打开
process monitor
,开始捕获事件。打开
vs2019
,直到显示出最近打开的文件列表。停止捕获。
查找
vs2019
访问过的注册表项记录,根据Result
那列是SUCCESS
进行过滤,找了一圈没发现可疑项,有几类事件非常像,但是不能进一步得到更有效的信息。上图黄色高亮部分
\REGISTERY\A\
对应的注册表项很奇怪,不能直接跳转过去(一般在Path
列中的记录都可以通过右键菜单的Jump To...
跳转过去),而且在注册表中搜索不到此键。关于\REGISTERY\A\
的相关资料,会在文末给出。虽然在注册表事件中没有找到答案,我们还可以在文件读写事件里搜索。在
Path列
按CTRL+F
,搜索关键字VsClearRecentProjects.sln
,没找到任何记录,在Detail列
同样没搜到任何记录。这是什么情况?:confounded:
看来这次不能通过process monitor
直接找到答案了(其实,process monitor
已经捕获了相关的事件,只不过我没能通过已知信息找到它)。我们还有什么办法呢?vs
应该不至于对这么简单的配置项进行加密存储,我们还可以在整个电脑中搜索与VsClearRecentProjects.sln
相关的内容。
在注册表中搜索
首先,在注册表中搜索VsClearRecentProjects.sln
,结果如下:

从搜索结果来看,没有一项是跟vs
有关的,看来从注册表中我们没能得到什么有价值的线索。
继续在磁盘文件中搜索
我们可以通过FileLocator
对磁盘文件内容进行搜索,结果如下:

Wow,搜到不少相关结果。对每一项进行检查后发现ApplicationPrivateSettings.xml
最有可能。
验证
关闭vs2019
,删除ApplicationPrivateSettings.xml
,重新启动vs2019
,不再显示最近打开的工程列表。搞定!
{% note info %}
说明:对于vs2017
及以后版本,相关配置存储在配置文件中,大家可以在自己机器上搜索该文件,删除即可。
{% endnote %}
{% note warning %}
警告:该文件中不仅仅包含最近打开的工程文件,还包含其它设置!谨慎删除(删了也没什么事)!懒人随意。
{% endnote %}
清理
知道了存储位置,清理起来就简单了。
脚本
我们可以使用以下脚本来清理,本脚本摘自网络,我做了注释及补充完善。
@echo off
:: vs2005
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\FileMRUList /va /f
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\ProjectMRUList /va /f
:: vs2008
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\FileMRUList /va /f
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList /va /f
:: vs2010
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\FileMRUList /va /f
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\ProjectMRUList /va /f
:: vs2012
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\FileMRUList /va /f
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\ProjectMRUList /va /f
:: vs2013
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\FileMRUList /va /f
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\ProjectMRUList /va /f
:: vs2015
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\FileMRUList /va /f
@REGDelete HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\ProjectMRUList /va /f
:: vs2019 (需要变成你自己电脑上的路径)
@del C:\Users\BCN\AppData\Local\Microsoft\VisualStudio\16.0_20f56984\ApplicationPrivateSettings.xml
工具
如果你不想手动查找ApplicationPrivateSettings.xml
的路径,可以使用我写的超级简单的winform
程序。github
地址 https://github.com/BianChengNan/VsClearRecentProjects ,欢迎fork
。

最后,贴出一份vs名称
与内部版本号
的对应关系,以后可能用的到。

关于\REGISTRY\A
StackExchange
上的帖子 What does the path '\REGISTRY\A\…' in Sysinternals Procmon log mean?
中的回答对此做了很有帮助的介绍,摘录如下:
It is application hive, which can be seen in volatilty by no name! pplication hives are registry hives loaded by user-mode applications to store application-specific state data. An application calls the RegLoadAppKey function to load an application hive.
more info on
http://msdn.microsoft.com/en-us/library/windows/hardware/jj673019%28v=vs.85%29.aspx
提问者最后的回答更加明确,引用了MSDN Forum
上的问答。为了方便大家,也摘录如下:
Hi,
The increase the isolation and resilience of VS 2017, it uses now a private registry hive. Internally VS uses a redirection and while for VS extensions (which are dlls) this is transparent, for external processes (that are exes), this causes them not to work.To change values in the private registry hive by hand, you can use regedit.exe to load a private hive. You need to select the HKEY_USERS node, and click the File > Load Hive… menu. You select the privateregistry.bin file, give a name to the hive (I entered “VS2017PrivateRegistry”) and now you can see the 15.0_Config key populated as usual (note: use File > Unload Hive when done):
To change values in the private registry hive programmatically you need either to build an extension for VS or if you want to use an external exe you need to use the RegLoadAppKey function or avoid using the registry directly and use the External Settings Manager. See the section “Change: Reduce registry impact” in Breaking Changes in Visual Studio 2017 extensibility.
总结
FileLocator
可以快速搜索文件内容,everything
可以根据文件名进行快速搜索。- 条条大路通罗马,有时候简单粗暴的方法反而更有效。
- 关于
\REGISTRY\A
,你学到了吗?:blush:
参考资料
[原]排错实战——VS清空最近打开的工程记录的更多相关文章
- [原]排错实战——解救加载调试符号失败的IDA
原调试IDA排错troubleshootsymbolspdbsysinternalprocess monitor 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windb ...
- [原]排错实战——通过对比分析sysinternals事件修复程序功能异常
原调试debug排错troubleshootprocess monitorsysinternals 缘起 最近,我们程序的某个功能在一台机器上不正常,但是在另外一台机器上却是正常的.代码是同一份,vs ...
- [原]排错实战——使用process explorer替换任务管理器
原Aha总结注册表process explorersysinternalsprocess monitor 前言 一般,我们会使用任务管理器查看系统中有哪些进程正在运行,强制杀掉某个进程.可是系统自带的 ...
- [原]排错实战——解决Tekla通过.tsep安装插件失败的问题
原总结调试排错troubleshootteklaprocess monitorsysinternals 缘起 最近同事使用.tsep安装Tekla插件的时候,Tekla提示该插件已经存在了,需要卸载后 ...
- Unity Project Wizard (最近打开的项目记录)
最近打开工程列表 当用Unity打开过的项目越来越多之后,在最近打开项目记录框中就会变的很长,那么如何才能删除最近打开的记录呢? Unity4.x最近打开的工程记录 Unity5.x最近打开的工程记录 ...
- [原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
原调试debugwindbghangprocess explorer 前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗? ...
- NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...
- 关于xcode不同版本打开相同工程问题
今天刚下好了xcode7正式版,于是乎用其创建一个工程.随后关闭此工程用xcode6.3打开此工程.发现报错不能运行,随后网上查资料,可惜中文版的资料几乎可以说是没有,因此写下此文,以方便其他遇到此情 ...
- 解决新版本Vivado打开老工程IP锁住的问题
解决新版本Vivado打开老工程IP锁住的问题 1.生成IP核的状态报告 Tools -> Report -> Report IP Status 2.点击Upgrade Selected ...
随机推荐
- 【机器学习实战笔记(3-2)】朴素贝叶斯法及应用的python实现
文章目录 1.朴素贝叶斯法的Python实现 1.1 准备数据:从文本中构建词向量 1.2 训练算法:从词向量计算概率 1.3 测试算法:根据现实情况修改分类器 1.4 准备数据:文档词袋模型 2.示 ...
- 留学生如何把控好Essay写作结构
留学生在国内写过作文,但是对于essay写作到底了解多少呢?大家觉得essay写作太难是语言问题,但是大家要明白,老师对于内容的考察远重于对语言的考察.同学们的essay写作如果能做到言之有理,自圆其 ...
- HTML布局梳理
布局是一个很艺术的话题,即使是相同的HTML文档结构,但加上不同的css样式就会呈现出不同的效果.接下来就来总结一下html常用的布局. 一.布局的分类: 根据页面板块分类: 页面的板块主要是根据栏目 ...
- PHP购物网站
我使用的phpsteam经常用着用着就闪退,所以做起来挺麻烦的.里面的代码有抄袭借鉴网上的代码,就是那个php做购物网站点击量最高的那个. 但是我很多代码也是自己写的不和其相同. PHP是一门选修课, ...
- 每天一点点之vue框架开发 - vue-router路由进阶(路由别名、跳转、默认路由、二级路由、路由守卫)
路由别名 在main.js中的路由中添加name来创建别名 const routes = [ {path:'/footer',name:footerLink,component:Footer} ] ...
- js库链接
1.autoHeightTextarea自适应高度的textarea是一款jquery插件,支持链式调用,支持设置最小行数.最小高度.最大行数和最大高度,在输入文字的时候实现textarea的高度自适 ...
- hibernate.hbm.xml必须必须配置主键
hibernate.hbm.xml必须必须配置主键 <id name="XXid" type="java.lang.long" column=" ...
- x++ 与 ++x的区别
相信在很多编程语言中都会遇见这个问题,这对于刚入编程的人来说可能是相当懵逼了. 老师的官方说法是:操作符在前面先进行自身运算,再进行其他运算:操作符在后面,先进行其他运算再进行自身运算. 反正我这段话 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Java Spring的特点和优点
Spring 是另一个主流的 Java Web 开发框架,该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力. Spring 是分层的 Java SE/EE full-stack 轻量级开源框架, ...
- 不使用.h .lib文件使用DLL内的函数
#include <windows.h> typedef int (*Func)(const char *fmt, ...); //这里声明一个函数指针,typedef 关键字是必须的,好 ...