动作强制刷新文件夹图标缓存的方法展示

经验创意 · 541 次浏览
白云朔 创建于 2024-11-25 18:54

研究了一下大佬是如何实现强制刷新文件夹图标缓存,

常规方法:

  1. 重启explorer.exe进程(文件资源管理器):
    该方法会造成部分程序和进程中断,影响范围过大。

  2. 更改“日期与设置”(ms-settings:dateandtime)中更改系统时间:
    还是一样的问题,会造成部分程序和进程出现错误(比如搜狗输入法),影响范围过大。

  3. 进入文件夹的属性窗口,在“自定义”选项卡中点击确定(无需更改设置,直接点击确定即可):
    影响范围小,但是太麻烦,唤醒文件夹的属性窗口只能通过模拟键盘操作或PowerShell(并且该方法还会导致PowerShell占用文件夹)
    Start-Process powershell -ArgumentList "-NoExit", "-Command", "(New-Object -ComObject Shell.Application).Namespace('要打开属性窗口的路径').Self.InvokeVerb('Properties')"

直到看到了的大佬的这个方法,才算是找到了完美解决方法

核心代码(VBS):

set shell = CreateObject("Shell.Application")
set folder = shell.NameSpace("文件夹路径")
folder.MoveHere "desktop.ini文件路径", 4+16+1024

核心就是通过VBS脚本移动desktop.ini文件,将外部desktop.ini移入,或内部desktop.ini移出再移入,然后执行一次普通的刷新(F5),就能看到文件夹的图标成功被刷新。
大佬这个动作中采用的方法是在外部(系统Temp文件夹)创建desktop.ini文件,再移入的方法,刷新文件夹图标。个人使用的话,确保目标文件夹或目标文件夹的父级文件夹的desktop.ini有移入操作就行了。个人这边建议移入父级文件夹的desktop.ini,因为这可以实现批量更新文件夹图标时,只通过该VBS代码执行一次命令,即可刷新父级文件夹中的所有文件夹。


感谢,不过我要改些什么吗?  

不用,感谢大佬发布的动作。我这边也在开发一个批量更换文件夹图标、显示名、标记、备注的动作,目前正在把标记设置功能增加上去。
比较好奇您是从哪找到这个方法的?以及对于文件夹的标记参数的参数名是从哪查到的,可能话我这边还想给文件夹增加更多desktop.ini属性设置,微软官方给的desktop.ini功能文档实在是太简陋了,定义文件夹图标的参数在Windows10中都是不生效的

这个vbs方法是群里的 冰雷木子 提供的. 当时正好讨论这个 他有些不会弄. 别的条目是我找的一些资料. 不过根据之前的资料来看. 就这俩好实现. 其他的比如图标那个, 就实现的有问题.   我后来已经转Directory Opus了

图标那个是编码问题,这边了测试一下,以gb2312或UTF32编码保存都是正常的,可能desktop.ini默认以系统编码进行解码运行

哦哦 那你真厉害

瞑空凌 2025-01-12 23:57 :

无意中发现文件夹重命名也行😂,不知道是不是普遍存在的方式,我在win11测试的,是手动重命名。-----作用不大,因为缓存还在,重命名回去还是老样子🫠

瞑空凌 最后更新于 2025-01-13 00:26
白云朔 回复 瞑空凌 2025-01-13 00:14 :

这个测试过,如果在缓存刷新前将名称改回去,图标又会变回原样

瞑空凌 回复 白云朔 2025-01-13 00:28 :

找了几天,就没找到其他能生效的方式。。。
 ie4uinit -show可以但是只能桌面,而且win11不行Windows11 怎么更新桌面图标缓存?不重启资源管理器的情况下 - Microsoft Community

瞑空凌 回复 白云朔 2025-01-13 00:34 :

🙃找来找去没有一个关于调用api实现的,都只指向一个通知的apiSHChangeNotify,一点用都没有🫠。

白云朔 回复 瞑空凌 2025-01-13 00:42 :

文件夹的属性窗口的“自定义”选项卡中点击确定倒是可以触发刷新,不知道有没有办法抓到这个这之中传输的命令。

我方法比较糙,就是直接用的我上述的那个。具体运用可以在我的动作的讨论中查看:https://getquicker.net/Common/Topics/ViewTopic/29655

瞑空凌 回复 白云朔 2025-01-13 00:45 :

我把你们那改成这样使用的😂😁
 $$
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")

' 用实际文件夹路径替换
strFolderPath = "{Path}"

' 检查文件夹路径是否存在
If objFSO.FolderExists(strFolderPath) Then
    ' 设置当前 desktop.ini 文件路径
    strDesktopIniPath = objFSO.BuildPath(strFolderPath, "desktop.ini")
    ' 设置临时目录路径
    strTempFolderPath = objFSO.GetSpecialFolder(2).Path
    ' 设置临时 desktop.ini 路径
    strTempIniPath = objFSO.BuildPath(strTempFolderPath, "desktop.ini")
    
    ' 创建一个Shell.Application对象实例,这个对象提供了与Windows外壳交互的方法和属性
    set shell = CreateObject("Shell.Application")
    ' 使用Shell.Application对象的NameSpace方法来获取指定文件夹路径的命名空间对象
    ' 这个命名空间对象代表了文件夹,可以用来访问文件夹的属性、图标、文件等
    set folder = shell.NameSpace(strFolderPath)
    
    ' 检查 desktop.ini 文件是否存在
    If objFSO.FileExists(strDesktopIniPath) Then
        objFSO.MoveFile strDesktopIniPath, strTempIniPath
        folder.MoveHere strTempIniPath, 4+16+1024
        ' objFSO.MoveFile strTempIniPath, strDesktopIniPath '这个移动无用,不会触发刷新
    Else
        ' 创建新的 desktop.ini 文件内容
        strIniContent = "[.ShellClassInfo]" & vbCrLf &_
                        "IconResource=C:\Windows\System32\SHELL32.dll,4" & vbCrLf
        
        ' 创建新的 desktop.ini 文件
        Set objTempFile = objFSO.CreateTextFile(strTempIniPath, True)
        objTempFile.Write strIniContent
        objTempFile.Close
        
        ' 设置 desktop.ini 文件的隐藏和系统属性
        Set objFile = objFSO.GetFile(strTempIniPath)
        objFile.Attributes = objFile.Attributes + 3 ' Hidden + System
        ' 移动到当前文件夹路径
        folder.MoveHere strTempIniPath, 4+16+1024
        
        ' 删除临时 desktop.ini 文件___手动删除可以触发刷新,这个删除不行。。。
        objFSO.DeleteFile strDesktopIniPath, True
    End If
End If

白云朔 回复 瞑空凌 2025-01-13 00:50 :

我没记错的话还是得在每个文件夹中创建文件才行,否则在非详细信息视图可能会不刷新。

瞑空凌 回复 白云朔 2025-01-13 00:52 :

还是很想找到能不能直接触发的方式😂(不为别的,就想找到答案,是有没传播开,还是没有仅仅内部机制),属性窗口那完全搜不到相关信息,不知道哪儿找。

白云朔 回复 瞑空凌 2025-01-13 00:54 :

大佬你要是找到了的话踹我一下,我也想知道🤓

瞑空凌 回复 白云朔 2025-01-13 00:54 :
我这vbs是直接抄的你们的,如果文件夹内有,我就移出再移入,反之则外部创建移入再删除。因为存在在打开的文件夹内刷新。父文件夹没有对应文件。
瞑空凌 回复 白云朔 2025-01-13 00:56 :

🙃网上一系列都是杀进程。谷歌也没搜到,可能是我还不熟悉谷歌搜索。

白云朔 回复 瞑空凌 2025-01-13 01:00 :

建议在父文件夹执行vbs脚本,在子文件夹中用quicker执行vbs太慢了,如果文件夹比较多得等很久。

父文件夹中执行的话可能会出现我前面提到的,非详细信息视图可能会不刷新,这种情况在每个文件夹内创建任意文件再删除即可解决,Quicker创建文件还有删除文件倒是挺快的

瞑空凌 回复 白云朔 2025-01-13 01:05 :

索德斯类,你上面说的是这个意思啊,😂我根本没想过一个个刷新,是直接获取资源管理器路径,我上面那vbs是一条龙,创建移动删除全在一起。

瞑空凌 回复 白云朔 2025-01-13 01:06 :

喔,看漏了,你说的不刷新的情况我还没遇到,可能我默认详细视图,而且桌面刷新也没影响

白云朔 回复 瞑空凌 2025-01-13 01:11 :

对于已有desktop.ini文件的文件夹,创建desktop.ini不会使得非详细信息视图中的文件夹图标被刷新,你可以自己测试一下。似乎一定得是一个新文件才行。

不过我还是建议尽量不要在Quicker中用VBS循环创建文件还有移动文件,会很慢。当然如果你没有批量刷新的需求的话,当我没说。

瞑空凌 回复 白云朔 2025-01-13 01:17 :

已有desktop.ini文件的文件夹-------是移到其他文件夹再移入
建议尽量不要在Quicker中用VBS循环创建文件还有移动文件---------------------------使用此方式获取的路径

瞑空凌 回复 白云朔 2025-01-13 01:19 :

是不是网页bug?你的回复和我的回复重叠了一部分

瞑空凌 回复 白云朔 2025-01-13 01:21 :

我只是把你们的操作糅合到一起,一个vbs搞定。只运行一次。

瞑空凌 回复 白云朔 2025-01-13 01:23 :

总感觉你没看我发的vbs代码。。。?

白云朔 回复 瞑空凌 2025-01-13 01:53 :

或许我们对于执行的目标有歧义。
你截图中获取的路径,我称之为父文件夹,而该文件夹内的文件夹,我称之为子文件夹。

我猜你要修改的是父文件夹?

而我指的情况中,需要修改图标的文件夹都是子文件夹,即当前文件资源管理器视图中可见的文件夹。通过获取选中文件夹路径的方式来获取,获取到的路径将会是一个列表(即选中文件夹路径列表)。
在该情况中,要修改所有选中文件夹,直接的做法是在Quicker中循环执行vbs脚本,但是这样太慢了,会在载入vbs时消耗大量时间(创建vbs文件→运行指定路径文件→vbs执行),所以我的方法是:
在父文件夹中执行一次vbs脚本,这会使得所有子文件夹的图标,在详细信息视图中得到刷新,但对于其他文件夹视图,可能会出现图标未能刷新情况。
所以需要在父文件夹执行vbs前或后,在所有子文件夹创建一个新的文件(任意名称及格式)即可,并在创建后删除该文件,这样就能在任意文件夹视图中,都能刷新子文件夹的图标。

以上内容仅针对要修改一个文件夹内的大量文件夹时使用。如果要修改单个文件夹,获取当前窗口路径并执行VBS当然可行,但是这样还得点击到目标文件内,是否有些麻烦了?不知道应用场景是什么呢

白云朔 最后更新于 2025-01-13 01:53
瞑空凌 回复 白云朔 2025-01-13 01:55 :

我从未想过你想的,因为我运行后就刷新完了,为啥还需要点进文件夹内执行😂

瞑空凌 回复 白云朔 2025-01-13 01:57 :

我就是刷新打开的文件夹内看得到的文件啊,为啥还要打开到内部刷新?那不是把我改的覆盖了吗🤣🫠🙃

白云朔 回复 瞑空凌 2025-01-13 01:58 :

不过你仍然可以看一下,你的目标文件夹在“大图标”或“类别”之类的视图中应该是未刷新的。

瞑空凌 回复 白云朔 2025-01-13 01:58 :

我vbs的创建就是固定值,要是在要刷新的文件夹内执行,那不就报废了吗?😂

瞑空凌 回复 白云朔 2025-01-13 01:59 :


然而并没有你说的发生

白云朔 回复 瞑空凌 2025-01-13 01:59 :

你截图中不是获取的窗口路径吗?那这个路径应该是父文件夹路径啊

瞑空凌 回复 白云朔 2025-01-13 02:00 :

我vbs的检测已有文件就移出再移入是避免覆盖了打开的文件夹的设置

白云朔 回复 瞑空凌 2025-01-13 02:01 :

已有desktop.ini会出现此情况。如果没有,那可能是win11的机制相较于win10有更改,毕竟视图这块两个版本的外观不一样。

瞑空凌 回复 白云朔 2025-01-13 02:01 :

我使用窗口路径下的desktop.ini去刷新窗口路径内的文件或文件夹图标

瞑空凌 回复 白云朔 2025-01-13 02:02 :

已有的情况不是移出去再移入吗?不用再创建吧?你教程都说了移出移入就行😂

瞑空凌 回复 白云朔 2025-01-13 02:03 :

我在win10刷新桌面的文件夹也没出现过你说那问题

白云朔 回复 瞑空凌 2025-01-13 02:10 :

是通过脚本对父文件夹中的desktop.ini进行操作,以此来刷新子文件夹的图标,那就没问题,这方面没有歧义。

而在非详细信息视图中,子文件夹图标不刷新的问题,仅在我在win10环境中进行测试时,较高概率出现,但也并不是每次都有这个问题,也没遇到其他用户反馈有此问题,只能说比较玄学了。解决方法我上面也有提到,没有遇到这个问题那就无所谓了。

瞑空凌 回复 白云朔 2025-01-25 22:49 :

宣告失败.....查找越到后面越是我不能理解的地方DeepSeek - 探索未至之境,最后借助这个AI验证,找到的不行😂,发现这个AI写的代码可以直接执行,没有各种奇奇怪怪的错误.😂

白云朔 回复 瞑空凌 2025-01-25 23:21 :

AI也不是万能的,没有数据给他扒,很容易虚构一些东西出来。

瞑空凌 回复 白云朔 2025-01-25 23:26 :

不是,这个AI挺强的,他的代码的确可以执行,不是虚构的,我把验证后的代码按我搜到的理解的方式组合一起使用,没有反应

瞑空凌 回复 白云朔 2025-01-25 23:35 :

根据这段时间的使用,豆包是最拉的,胡扯后纠正还是回答错误的...智谱清言要好些,纠正可以,不过循规蹈矩,不给资料会胡扯
抄书侠大佬的智核不错,大量文本输出不会截断.严正性更高一点,不过建立在有迹可循的情况下,回答的才更能复制后直接执行,后面就是deepSeek了,这个的代码他本身深度思考+联网的情况下,可以把我看不懂的代码写成我需要的样子还能执行😂

白云朔 回复 瞑空凌 2025-01-25 23:53 :
其实就实际应用而言,现在这个方案已经够用了,只是相对来说不够简洁和直接而已。但是对于这种windows没有提供接口的功能,自行开发到最后的结果可能也不会比现有方案更简洁,比如可能需要逆向什么的。从时间成本上来说,在这个问题上花这么多时间其实有点不值。windows毕竟不是完全开源的,有些过于细节的功能,会有点得不偿失。
瞑空凌 回复 白云朔 2025-01-26 14:38 :

反正最初只是下找到有没有,并不需要考虑是否可用,并且还通过这个过程来提升了一些自己对com,c++的理解。虽然结果没得到好结果,而且也影响了其他方面的学习,但是这个过程对以后自己再接触相关部分只有利而没有弊😁。例如在Quicker学习C#理解一些C#的概念后再看自己以前学的脚本,可以想得更通透,不再需要和以前一样闭眼摸石头。概念是相通的,而小领域相关知识却是匮乏的。

瞑空凌 回复 白云朔 2025-02-08 18:36 :

感觉exe的图标似乎很方便刷新,虽然直接替换图标组的情况下不会自动刷新,vbs方式也刷新不了.但是我发现删除一个图标组或者添加一个图标组它就会自动刷新.👀,似乎有搞头

瞑空凌 回复 瞑空凌 2025-02-08 18:43 :

DeepSeek是真屌,我找来找去找不到资料说明,也不清楚是啥问题,但这个AI深度思考直接给我解决,可惜就是基本连不到服务器,只能隔很长一段时间用一次.在Quicker用C#给无图标的exe添加图标 - Quicker这个代码总共就问了它两次.一次转译,一次解决问题,中间我找其他ai问了好多次都解决不了,结果换它,一次搞定.要不是连不上服务器估计昨天就代码出来了😂

瞑空凌 回复 白云朔 2025-02-27 15:50 :

突发奇想,这个特性可以利用,通过添加删减零宽字符来刷新,然后挂钩一个事件处理,隔一段时间,会自发刷新缓存时,由事件子功能把零宽字符删除改回原名.为了兼容某些情况下无法重命名零宽字符,因此如果遇到运行时内部就含零宽字符,那么删除零宽字符,后续再使用就用不一样的其他零宽字符添加.那么从使用体验来看似乎也差不多.除了文件名要求高的情况.
虽然没啥使用环境,也可以作为一种简单粗暴的思路记录.

白云朔 回复 瞑空凌 29天11小时前 :

这也是一个方法,不过如果动作被终止,有可能会出现零宽字符没被删除的问题,可能会导致用户检索文件夹时无法完全匹配文件夹名称。而且对于部分重要文件夹,更改文件夹名称的行为属于高风险行为,可能会导致部分应用程序甚至系统无法识别路径

瞑空凌 回复 白云朔 29天10小时前 :

多线程或者异步的时,除非设定了终止,不然不会随动作停止而终止,而且也可以采用记录路径的方式,在外部开个循环来检测。。。。突然想到文件夹不是可以两个名字吗?话说这个别名更改会不会触发图标刷新?如果可以的话就不存在风险问题而且两个名字都能访问只需保证其中一个是原名。后面如果有vbs解决不了的情况可以研究试试行不。

白云朔 回复 瞑空凌 29天10小时前 :

我指的终止是用户手动终止,比如直接停止Quicker运行、注销用户、关机等,当然这些问题也有解决方法,但是这样的话就把解决方案复杂化了。对于更改别名,直接修改desktop.ini无法刷新文件夹属性缓存,但是模拟键鼠手动操作应该是可以的,因为在有别名的情况下,F2键重命名的操作对象会默认是别名。
但是这也仍然会存在低效(因为是模拟键鼠)问题,在操作文件夹数量庞大的情况下,会增加不少时间。

瞑空凌 回复 白云朔 29天5小时前 :

是的,所以这才是一种简单粗暴的方式,属于最后的备用思路

回复内容
暂无回复
回复主贴