首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
拉钩
V2EX  ›  程序员

为什么 Windows 会在 C 盘重复存放这么多的安装包,占用这么多磁盘空间?

  •  1
     
  •   shijingshijing · 95 天前 · 5086 次点击
    这是一个创建于 95 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以前就发现从 Win7 开始,微软会在安装文件的时候把安装包保存在 C 盘用 UUID 命名的某个文件夹下,Stackoverflow 和 Microsoft Community 上面也有人讨论过这个问题,结论是不删。好,那就让你存吧。

    现在发现这货还会重复保存。

    用小工具扫了一下,占了加起来差不多 10 个多 G 的空间,对于 SSD 来说,可不少了。特别是装了 Visual Studio 2015 以后的版本,明显感觉膨胀了不少。VS 2010 其实都还好。

    这几个位置是重灾区: C:\ProgramData\Package Cache
    C:\Users\All Users\Package Cache
    C:\Windows\Installer\

    在 C:\Windows\Installer\下保存的是重命名后的安装文件,经过二进制对比,其实跟安装程序使用的安装文件是一模一样的。

    微软能不能上点心啊,v2 上的微软员工能不能内部提一下这种低级的问题。

    58 回复  |  直到 2018-09-10 09:17:27 +08:00
        1
    xd314697475   94 天前
    这是什么软件?
        2
    shijingshijing   94 天前
    @xd314697475 NoClone 很久以前的一个小工具,貌似是 VB 写的。
        3
    orangeade   94 天前
    MSI 安装包就是这个缺点,太浪费空间,好处就是多了更改和修复的功能
        4
    azh7138m   94 天前 via Android   ♥ 1
    这些存下来的 msi 在卸载和修改的时候会用到
        5
    kerr92   94 天前 via iPhone   ♥ 12
    微软的程序员是不会注意到这种问题的,他们的 C 盘大小都是以 TB 为单位……
        6
    zro   94 天前   ♥ 1
    Win10 每半年升个级就滚出硬盘了,Win7 就。。。其实也快没几个月的更新了
        7
    reus   94 天前   ♥ 2
    找个软粉洗洗就干净了
        8
    shijingshijing   94 天前
    @azh7138m 我知道 msi 文件的作用,我的 point 是不应该重复性的拷贝,特别是 vs 的安装文件,本身个头就大,再翻倍一把,随时受不了。

    @orangeade 其实 msi 文件完全不需要备份,只需要你自己在特定的地方保留最原始的安装包即可。我猜之所以有备份安装包这种脑残的设定是因为微软收到太多的用户投诉说 xx 软件不能卸载,最后不得不一股脑儿的把所有的安装文件全部备份一把。

    微软的问题是不提供选项关闭这个备份功能,即使默认备份了,不提供工具 /选项可以有选择的删除这些无用的包。像 VS 这种大软件,基本上都会保留一个原始的安装镜像的,这些安装包对使用 vs 的人(起码是很懂 windows 了吧)根本就没有意义。

    微软为 vs 的安装提供了一个 --no-cache 选项,实际上只是缓解了 vs 这一个文件的安装而已。
        9
    daigouspy   94 天前 via Android
    @azh7138m 谁无聊会天天修改软件啊?
        10
    anonymous256   94 天前 via Android
    你可以用 everything 搜这个文件: windows.edb
    我的这个文件都 30G 了,windows 索引数据库文件。
    windows 在某些方面做的很糟糕。
        11
    Cooky   94 天前   ♥ 3
    XP 才是最好的 Windows (
        12
    FlyChina   94 天前
    Dism++ 了解一下
        13
    shijingshijing   94 天前
    @Cooky 你说对了,Win 7 里面就掺了太多屎,而且砍掉了太多实用的小功能:搜索功能,右下角显示网络状态功能,经典的开始菜单等等。

    @anonymous256 说到 everything,我就顺便给你安利一款更好用的搜索软件 Agent Ransack,比 Windows XP 的搜索还好用,能查找 pdf 里面的文字,非常强大。

    @FlyChina 这个 Dism++我也装了,然而仍然不敢删这几个 package cache,怕出什么幺蛾子。其实问题不在于删不删,而是微软不给个官方的准信到底这些东西留着有啥用,删了有啥后果,也不提供官方的选项。
        14
    heiybb   94 天前 via Android
    就是很多垃圾…只能眼不见心不烦
    以前精力旺盛还会测一测到底哪个和哪个关联删了有什么影响
    现在懒得动了 不去自己翻它就当它不存在算了
        15
    RainyH2O   94 天前   ♥ 1
    所以我买了 500G 的 SSD 来防止心烦
    即使这样卸载不干净,注册表残留等等问题还是总让我个强迫症难受
    要想根治还是换 Linux 吧,啥时候不玩 Steam 我可能就直接放弃 Win 了
        16
    ooo3o   94 天前
    复制移到其他分区后删除, 然后再 mklink 指向, 算是比较好的解决方式.
        17
    shijingshijing   94 天前
    @ooo3o 这个 mklink 官方的解答里面也说了,只能说是缓解吧,我的全是 ssd,没有用普通硬盘。

    @RainyH2O 我也是转 Linux 了,游戏我倒不玩,主要是办公的 excel 还是很厉害,算是必需品;取代 Linux 还有一点就是笔记本的电池管理,希望能够越做越好。开发这一块主力已经从 C#切到 Java 了,Debian 开 JB 全家桶和 Android Studio 不要太爽。
        18
    azh7138m   94 天前 via Android
    @shijingshijing msi 就这么设计的啊,我可以先精简安装,然后缺了啥功能能直接安装,不就得保存一份完整的安装包嘛

    现在上班主要是 Linux,excel 有 online,基础功能都在,一般买得起 jb 的 IDE 也不缺钱换块大 SSD 的吧。
    Linux 桌面问题还是太多了,我的 font config 爆炸很久了,还有好多程序莫名的不支持缩放,还有就是缺好多驱动
        19
    kokutou   94 天前
    Installer 里的别动,卸载、打补丁需要用到。
        20
    crab   94 天前
    有的是自动修复用的,主要系统分区容量也够就无所谓。
        21
    geelaw   94 天前   ♥ 5
    @kerr92 #5 @reus #7 无知的典型,大放厥词

    首先 C:\Users\All Users 就是 C:\ProgramData,这是一个 NTFS junction,出于兼容性目的存在的,为的是让一些(古早味)程序访问 All Users 的时候不会找不着北。

    接下来看 C:\Windows\Installer 和 C:\ProgramData\Package Cache。在我的电脑上,我自己分析了一下:

    # 获得所有的 hash
    $WindowsInstaller = Get-ChildItem C:\Windows\Installer -File -Recurse -Force | Get-FileHash
    $ProgDataPkgCache = Get-ChildItem 'C:\ProgramData\Package Cache' -File -Recurse -Force | Get-FileHash

    # 查看文件夹自重复
    $WinInstSelfDup = $WindowsInstaller | Group-Object Hash | Where-Object Count -gt 1

    # 我这里看到重复的文件都只重复了一次
    $WinInstSelfDup | Out-Host;

    # 查看重复文件的大小(每组算一次)
    $WinInstSelfDup | ForEach-Object { Get-Item $_.Group[0].Path } | Select-Object -ExpandProperty Length | Measure-Object -Sum | ForEach-Object { $_.Sum / 1MB }

    # 我这里不到 2MB

    # ProgramData\Package Cache 里面的文件自己重复大小是 2-3 次
    # 重复文件(每组一次)不到 9 MB

    # 接着我们分析两个文件夹之间的重复文件
    $WindowsInstaller | Where-Object { $ProgDataPkgCache | Where-Object Hash -eq $_.Hash | Measure-Object | Select-Object -ExpandProperty Count } | ForEach-Object { Get-Item $_.Path } | Select-Object -ExpandProperty length | Measure-Object -Sum

    # 上述命令输出两个文件夹之间重复的文件大小(只算 Windows\Installer 里面出现的次数)
    # 不到 60MB

    我觉得这应该不算是什么问题。我的电脑安装了如下软件:7-Zip, Adobe Reader CC, iTunes, Git for Windows, Image Composite Editor, Office 365 Home, Visual Studio 2017 Community (Managed Desktop, Native Desktop, UWP), Pulse Secure, SourceTree, MiKTeX.

    此外,可以用 fsutil 验证上述两个文件夹里的文件不互为 hard link。

    @shijingshijing #8 MSI 安装包不总是可用,例如它存在于可移动介质或者是 on-demand 来自网络。

    这些文件也不是所有的东西的完整安装包,因为在我的电脑上两个文件夹一共才 1300 MB 左右,根本不可能容纳我安装的那些软件。
        22
    kerr92   94 天前 via iPhone
    @geelaw 不对之处请谅解😁印象里见过不止轮子哥一人称赞微软硬盘容量大的福利。
        23
    xuanbg   94 天前   ♥ 1
    @shijingshijing Linux 也会产生很多垃圾文件。。。同样很难删除。。。这个问题不是操作系统的锅,而是应用软件的锅。
        24
    reus   94 天前   ♥ 2
    你看,软粉一洗就只有几十兆了,多干净啊。十几个 G ?不存在的!楼主还不升级 SSD ?小心他们说你大放厥词!
        25
    krixaar   94 天前   ♥ 1
    @reus 但是 C:\ProgramData\Package Cache 和 C:\Users\All Users\Package Cache 确实是同一个地方,开个 cmd,cd 到 C:\Users,用 dir /A:L 回车可以看到是链接,所以这两个位置不存在重复一说,能看到两个,只占一份空间。
        26
    shijingshijing   94 天前
    @geelaw
    @krixaar

    刚看了一下,确实是 SYMLINKD

    C:\Users>dir /aL
    驱动器 C 中的卷是 Win7
    卷的序列号是 0000-FFFF

    C:\Users 的目录

    2009/07/14 13:08 <SYMLINKD> All Users [C:\ProgramData]
    2009/07/14 13:08 <JUNCTION> Default User [C:\Users\Default]
    0 个文件 0 字节
    2 个目录 1,160,388,608 可用字节
        27
    rainex   94 天前 via iPad
    软件的锅,跟系统关系不大,osx 里系统自带的卸载方式基本都不管垃圾文件的,一样是系统越来越臃肿,linux 也是
        28
    CRVV   94 天前   ♥ 1
    @geelaw

    在我的机器上
    Windows/Installer 27.4 GiB
    ProgramData 7.58 GiB

    ProgramData 和 Windows/Installer 里重复的文件,每个文件只算一次,一共有 1.5 GiB

    重复次数最多的是 /c/ProgramData/Microsoft/Search/Data/Applications/Windows/GatherLogs/SystemIndex/SystemIndex.12.Crwl,79 次,不过这个文件只有 2 bytes

    大于 100 MiB 的文件有 3 个,全是微软家的东西,一共 440 MiB

    14903790e1237de08c6243db5de6e062bf3867561212b0baa8a8812bc3697fdf 150634496 /c/ProgramData/Microsoft/VisualStudio/Packages/Microsoft.VisualStudio.AspNetPackages.Msi,version=1.0.20124.0/AspNetWebToolsPackagesVS15_ENU.msi
    14903790e1237de08c6243db5de6e062bf3867561212b0baa8a8812bc3697fdf 150634496 /c/Windows/Installer/4a6ef0.msi

    3675b2e23df6b639dba1706ae0b969df1e1b359d25c8ed770401430d58807358 160104448 /c/ProgramData/Microsoft/VisualStudio/Packages/Microsoft.VisualStudio.AspNetCoreLocalFeed.1.1.Msi,version=15.0.11421.0/AspNetCoreLocalFeed_1_1_VS15_ENU.msi
    3675b2e23df6b639dba1706ae0b969df1e1b359d25c8ed770401430d58807358 160104448 /c/Windows/Installer/4a6f41.msi

    9ac20c0e94ca5c22388d710e0ff4f11576ff420cded1866b9bcd1a9cca74e026 123056128 /c/ProgramData/Microsoft/VisualStudio/Packages/Microsoft.VisualStudio.AspNetCoreLocalFeed.Msi,version=15.0.11421.0/AspNetCoreLocalFeedVS15_ENU.msi
    9ac20c0e94ca5c22388d710e0ff4f11576ff420cded1866b9bcd1a9cca74e026 123056128 /c/Windows/Installer/4a6f3a.msi

    还有一个 WinSxS 也是类似的情况,越用越大,据说不能删
    更扯的是 Windows 还经常到一个盘的根目录下面创建一大堆临时文件不删
    https://social.technet.microsoft.com/Forums/ie/en-US/b65af122-f4db-4053-a22d-f2b1081cc01e/windows-update-temporary-folder-location?forum=winserverwsus
    2010 年就有人提了,我在最近 30 天之内还遇到过

    Windows 特别喜欢搞一大堆不知道有没有用的文件存着,这种事情大家都早就知道了,其实没什么可辩解的
        29
    wenzhen   94 天前 via Android
    @RainyH2O 前段时间好像看到 steam 在 Linux 平台上已经支持部分游戏了。
        30
    reus   94 天前   ♥ 1
    @krixaar 重复不重复是其次,占空间越来越大,这才是问题。linux 不断增大的只有日志文件,没见过安装包还需要留着不能删除的。磁盘读写量还明显比旧版的高得多,虽然 SSD 快,但 SSD 也有读写寿命的,我就不明白每次开机写入的那堆究竟是什么东西。
        31
    geelaw   94 天前   ♥ 4
    @CRVV WinSxS 里面一些文件和 Windows 以及 System32 和 SysWoW64 里面是硬链接关系,见 https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/determine-the-actual-size-of-the-winsxs-folder

    Windows 10 会自己删除没有用的 WinSxS 文件,见 https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/clean-up-the-winsxs-folder

    至于“不知道有用没用”的原因,是因为不知道用户未来的需要( Windows 不能预测未来),而不是本身是否知道。

    你最后提到的那个帖子的问题是 Windows 的更新安装器最后留下了不含内容的文件夹,而不是留下了有内容的临时文件,是两个不同的问题。此外,那个帖子的重点并不是占用空间的问题,而是安全和速度问题(帖子主人提到 server 的最大剩余空间 volume 很可能是 Storage Area Network 或者非 NTFS 格式的分区)。

    对于 VS,你可以通过 https://blogs.msdn.microsoft.com/heaths/2017/04/19/cleaning-up-the-visual-studio-2017-package-cache/ 提到的方法删除 cache,但是这将失去离线修复 VS 组件的功能。

    你的 Installer 文件夹大得有些离谱了,根据 https://blogs.msdn.microsoft.com/heaths/2005/11/29/windows-installer-cache/ 这个文件夹里是不包括很多信息的( cabinet streams are stripped ),应该调查是否是你安装的程序的 MSI 编写方法有问题。
        32
    ysc3839   94 天前 via Android
    @rainex macOS 下大部分软件没有“卸载”这个操作,“安装”只是解压,“卸载”只是删除,系统自然不会处理程序产生的文件。
    macOS 系统的 pkg 安装包也没有卸载操作。
    有卸载操作的只有那种使用自己的安装 /卸载程序的软件。
        33
    geelaw   94 天前   ♥ 2
    @reus #30 That wouldn't make sense for me. 因为 Windows 的日志默认都是有限额的。而且这个问题和 Linux 还是 Windows 没关系。如果你需要卸载和更新软件,总是需要存储关于安装的信息的。

    如果您不能读懂重复文件的大小和总大小的区别,我觉得您不适合考虑安装信息占了多少空间的问题的。
        34
    janus77   94 天前
    @anonymous256 #10 我只有 600m ……
        35
    msg7086   94 天前
    @reus 「没见过安装包还需要留着不能删除的。」
    你可能没听说过 ArchLinux→_→
        36
    alvin666   94 天前 via Android
    还有更恶心的驱动...老驱动得借助第三方软件+管理员权限才能删,你说为了备份也就算了吧,一个驱动保存三四个版本我很服气,尤其是 nv 家驱动一个几百 m
        37
    gnaggnoyil   94 天前
    @msg7086 `pacman -S pacman-contrib & paccache -rk 0`
        38
    zwh2698   94 天前 via Android
    Office 还内置游戏呢
        39
    gnaggnoyil   94 天前
    当然我得废话一句 pacman 的 cache 中的安装包都是很有用的,特别是在要滚回到之前的版本的时候.Windows 中的安装包同理.我这边 VS2017+MS Office 2016 全家桶的情况下 Package Cache 和 Installer 也不过 1.3GB,所以至少对我而言只要定期清理 windows.edb 就没什么空间不足的问题的……
        40
    fengleidongxi   94 天前
    关闭 update 应该能解决
        41
    xxgirl2   94 天前
    用 baobab 看了一下,.../Windows/Installer 大小是 18G。反正 Win8.1 能用到 2023 年,先放着不管了。
        42
    CRVV   94 天前
    @msg7086
    Arch Linux 上,可以直接 rm /var/cache/pacman/pkg/*
    对系统没有任何影响,当然删完就不能回滚版本了
        43
    uptime   94 天前
    一看标题就知道说 MSI 格式了
    即使删了也没啥,就是正常卸载是卸载不了,提示缺了这个 MSI 文件。
    如果你确实你使用的软件不卸载的,删了也没什么。至于修复安装,几乎没人会用到。
        44
    CRVV   93 天前
    @geelaw

    $ du -sh /mnt/c/Windows/Installer
    28G /mnt/c/Windows/Installer

    $ du -sh /mnt/c/Windows/Installer/* | sort -k 1 -h -r | head
    2.0G /mnt/c/Windows/Installer/$PatchCache$
    252M /mnt/c/Windows/Installer/feb3822.msp
    252M /mnt/c/Windows/Installer/a6ac9.msp
    252M /mnt/c/Windows/Installer/9b30e.msp
    252M /mnt/c/Windows/Installer/9044ce9.msp
    252M /mnt/c/Windows/Installer/70511be.msp
    252M /mnt/c/Windows/Installer/644a705.msp
    252M /mnt/c/Windows/Installer/38e694c4.msp
    252M /mnt/c/Windows/Installer/36ec9d5e.msp
    252M /mnt/c/Windows/Installer/2f1a6.msp

    网上说排第一的 PatchCache 里的东西可以删所以略过
    下面这一堆奇怪名字的 msp,我一个一个点开看了,出来的窗口的标题全是 Microsoft Office xxxxx
    所以这锅还是微软的
        45
    ooooo   93 天前   ♥ 1
    C:\Windows\Installer\
    下面的文件大小高达 39G
    然后我把删了
        46
    ooooo   93 天前
    也是前几天发现此目录占用非常大
        47
    murmur   93 天前
    @shijingshijing 网络状态也就拨号时代那个动画有意义 现在都宽带了 电脑里没几个一直联网的软件都不好意思用
        48
    reus   93 天前
    @msg7086 呵呵,我用 archlinux 超过十年,难道 pacman -Sccc 有什么问题?
        49
    mingl0280   93 天前
    @shijingshijing
    1.msi 包不止是安装 /卸载信息,某些程序会把自己的图标和部分资源放在这里面(例如楼上那个 ooo 如果你装了 XShell 的话你就会发现 XShell 的默认图标没了)
    2.微软的软件并不是从中心服务器上弄下来的,包管理器根本不可行,这种情况下你如果要卸载一个八百年前的软件还能指望软件供应商服务器上有下载包?不本地存一个怎么办? pacman 等玩意儿平时能删掉包的原因就是可以随时从服务器上再下一份缓存,就这样还是很容易出现奇怪的残留问题( ERROR 目录不为空想必各位都见过),怎么就这么肯定 linux 包管理比 windows 好的?
    3.msi 还有个功能是“恢复最近一次正确的配置”,以及回滚安装。
        50
    May725   93 天前 via iPhone
    @kerr92 好像拥有以 TB 为单位的 ssd c 盘
        51
    dalieba   93 天前 via Android
    PE 访问 C 盘,找这几个文件夹以后再设为压缩。
        52
    geelaw   93 天前
    @CRVV #44 在我的电脑上 Installer 文件夹里最大的几个(超过 30 MB )是 Adobe Reader CC 和 iTunes。

    此外,$PatchCache$ 的正确删除方式是使用 Disk Cleanup (cleanmgr.exe)。

    你可以通过如下脚本确定 Installer 里面是否有不需要的文件(“需要”的定义是该安装包在注册表中有注册,这表示删除、更改、修复、更新软件的时候需要它)

    $found = Get-ChildItem "$env:WINDIR\Installer\*" -Force -Recurse -Include *.msi, *.msp -File | ForEach-Object { $_.FullName.ToLowerInvariant() }

    $registered = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData -Recurse -Force | Get-ItemProperty -Name LocalPackage -ErrorAction Ignore | ForEach-Object { $_.LocalPackage.ToLowerInvariant() }

    $found | Where-Object { $_ -notin $registered }

    @ooooo #45 删除该文件夹中的文件可能导致你无法 **更新** 和 **卸载** 使用 MSI 的软件。

    @zwh2698 #38 Office 软件若没有明确表示内置游戏,且你是在较新的版本中发现这个现象的,建议你联系微软。因为 Trustworthy Computing 的要求,微软的产品中不应该包含任何“彩蛋”。

    @alvin666 #36 这些驱动不删除的原因是,如果你可以 sysprep Windows,然后把镜像复制到另一台电脑。
        53
    LGA1150   93 天前
    你看到的只是同一个文件的两个引用,叫“硬链接”
        54
    roshad   93 天前   ♥ 1
    我 wInstaller 100 多 G. 我是弱智, 我装的都是垃圾软件, 微软是全知全能超越众生的上帝.
        55
    components   93 天前
    @RainyH2O
    改进版的 Steam Play,允许 Linux 玩家游玩 Windows 游戏。为了实现这个目标,Steam Play 加入了一个改良版的 Wine,叫做 Proton,为 Windows 游戏提供兼容性和使用 Vulkan API。
    来源:
    https://steamcommunity.com/games/221410/announcements/detail/1696055855739350561
        56
    msg7086   93 天前
    @reus 呵呵,删了以后就和你在 Windows 里把安装程序删了一样,不能修复不能回滚了。
    你说有什么问题?
        57
    zk8802   93 天前 via iPhone
    不要用硬链接把 Windows\Installer 文件夹移到其它地方。某些安装程序(比如 Visual Studio 2015 )会删掉那个硬链接,然后创建一个空的 Windows\Installer 目录。
        58
    reus   93 天前
    @msg7086 修复直接用 livecd,然后 arch-chroot 进去,用 pacstrap 爱修啥修啥,怎么不能修复?
    回滚?干嘛要回滚?用上面的方法,有什么解决不了的?我没发现有任何问题,有问题也是你的水平问题。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2461 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 21ms · UTC 12:24 · PVG 20:24 · LAX 04:24 · JFK 07:24
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1