You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PowerShell让Windows Explorer彻底刷新图标缓存

在PowerShell中强制刷新Windows 10图标缓存的可行方案

一、直接调用SHChangeNotify API(推荐)

Windows的SHChangeNotify API是通知Shell刷新系统状态(包括图标缓存)的官方方式,你可以通过PowerShell的Add-Type导入该API并调用,无需依赖C语言代码。

执行以下PowerShell脚本即可触发全局图标缓存刷新:

Add-Type @"
using System;
using System.Runtime.InteropServices;

public class ShellRefresh {
    [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern void SHChangeNotify(
        uint wEventId,
        uint uFlags,
        IntPtr dwItem1,
        IntPtr dwItem2
    );
}
"@

# 发送全局Shell刷新通知:SHCNE_ASSOCCHANGED表示关联关系变更(包括图标)
[ShellRefresh]::SHChangeNotify(0x08000000, 0x0000, [IntPtr]::Zero, [IntPtr]::Zero)

这个调用会通知Windows Shell所有文件关联和图标缓存需要重新加载,覆盖同名文件后的新图标会被正确显示。

二、重启Explorer进程(简单粗暴但有效)

如果上述API调用偶尔不生效,可直接重启Explorer进程,彻底清空当前缓存:

# 终止所有Explorer进程
Get-Process explorer | Stop-Process -Force
# 重新启动Explorer
Start-Process explorer

这种方法适合批量替换图标后使用,能确保缓存完全重置。

三、针对单个文件的图标刷新(精准刷新)

如果你只需要刷新某个特定文件的图标,可调用SHUpdateImage API,针对性更新单个文件的缓存:

Add-Type @"
using System;
using System.Runtime.InteropServices;

public class SingleFileRefresh {
    [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern int SHUpdateImage(
        string pszPath,
        uint dwFileAttributes,
        IntPtr phfi,
        uint dwFlags,
        uint uMsg
    );
}
"@

# 替换为你需要刷新的文件路径
$targetPath = "C:\Your\Icon\Path\example.ico"
# 调用API刷新单个文件图标
[SingleFileRefresh]::SHUpdateImage($targetPath, 0, [IntPtr]::Zero, 0x00000001, 0)

参数0x00000001(SHUFI_UPDATEIMAGE)表示强制更新指定文件的图标缓存。

为什么你之前的方法无效?

  • Shell.Application的Refresh方法仅刷新当前Explorer窗口的视图,无法触发系统级的图标缓存重置;
  • 单纯模拟F5刷新只会重新加载当前目录的文件列表,不会触发缓存的重新解析。

内容的提问来源于stack exchange,提问作者fmotion1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:18:19