尝试改进Windows全盘备份的排除选项(失败)

之前我使用wbadmin进行全盘备份,之后使用restic备份生成的vhdx产物。

wbadmin start backup -backuptarget:D: -include:C: -quiet

但有一个问题,我无法排除一些不需要的文件夹,例如.venv, node_modules等。这些文件夹内容巨大而且毫无意义。wbadmin虽然提供-exclude参数,但并不支持任意位置的通配符。官方文档写得有点模糊,没提到具体通配符具体支持到了什么程度,是只支持在路径末尾使用通配符来匹配文件还是支持任意位置。所以我让AI给我写了个测试脚本。

restic_scripts on  main is 📦 v0.1.0 via 🐍 v3.11.3 took 2s
❯ sudo pwsh .\test_wbadmin_native_glob.ps1 -BackupTarget "D:" -RunBackup
Lab root: C:\Tools\playground\restic_scripts\wbadmin-glob-lab

Candidate exclude patterns to test:
  FileNameWildcard: C:\Tools\playground\restic_scripts\wbadmin-glob-lab\logs\*.tmp
  DirectoryWildcard: C:\Tools\playground\restic_scripts\wbadmin-glob-lab\profiles\*\cache2
  BrowserCacheWildcard: C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Code Cache
  BrowserServiceWorkerWildcard: C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Service Worker\CacheStorage
  JetBrainsWildcard: C:\Tools\playground\restic_scripts\wbadmin-glob-lab\jetbrains\*\caches
  VenvSingleLevelWildcard: C:\Tools\playground\restic_scripts\wbadmin-glob-lab\*\.venv
  VenvRecursiveWildcard: C:\Tools\playground\restic_scripts\wbadmin-glob-lab\**\.venv

Recommended test order:
  1. logs\*.tmp
  2. profiles\*\cache2
  3. chrome\User Data\*\Code Cache
  4. jetbrains\*\caches
  5. *\.venv
  6. **\.venv

Example preview command:
  .\test_wbadmin_native_glob.ps1 -BackupTarget 'D:'

Example execution command:
  .\test_wbadmin_native_glob.ps1 -BackupTarget 'D:' -RunBackup

To actually run wbadmin, add -RunBackup and use an admin shell.
BackupTarget must be another volume or a network share accepted by wbadmin.

Lab tree:
  chrome\User Data\Default\Code Cache\EXCLUDE__chrome_default_code_cache.bin
  chrome\User Data\Profile 1\Bookmarks.json
  chrome\User Data\Profile 1\Code Cache\EXCLUDE__chrome_profile1_code_cache.bin
  chrome\User Data\Profile 1\Service Worker\CacheStorage\EXCLUDE__chrome_profile1_sw_cache.txt
  jetbrains\PyCharm2025.1\caches\EXCLUDE__jetbrains_cache.txt
  jetbrains\PyCharm2025.1\config\KEEP__jetbrains_config.xml
  logs\EXCLUDE__logs__trace.tmp
  logs\KEEP__logs__app.log
  logs\nested\KEEP__nested__trace.tmp
  profiles\alpha\cache2\EXCLUDE__profiles_alpha_cache2.txt
  profiles\alpha\data\KEEP__profiles_alpha_data.txt
  profiles\beta\cache2\EXCLUDE__profiles_beta_cache2.txt
  projects\service-a\.venv\EXCLUDE__projects_service_a_venv.txt
  projects\service-a\packages\worker\.venv\EXCLUDE__projects_worker_venv.txt
  projects\service-a\packages\worker\src\KEEP__projects_worker_src.txt
  projects\service-a\src\KEEP__projects_service_a_src.txt
  README.md
  workspace-alpha\.venv\EXCLUDE__workspace_alpha_venv.txt
  workspace-alpha\src\KEEP__workspace_alpha_src.txt

Prepared wbadmin commands:
  [FileNameWildcard]
    wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\logs\*.tmp -quiet
  [DirectoryWildcard]
    wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\profiles\*\cache2 -quiet  
  [BrowserCacheWildcard]
    wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Code Cache -quiet
  [BrowserServiceWorkerWildcard]
    wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Service Worker\CacheStorage -quiet
  [JetBrainsWildcard]
    wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\jetbrains\*\caches -quiet 
  [VenvSingleLevelWildcard]
    wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\*\.venv -quiet
  [VenvRecursiveWildcard]
    wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\**\.venv -quiet

=== Testing pattern: FileNameWildcard ===

Running command:
  wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\logs\*.tmp -quiet

wbadmin 1.0 - 备份命令行工具
(C) Microsoft Corporation 版权所有。保留所有权利。

正在检索卷信息...
在此版本的 Windows 上不支持对卷进行部分备份。

=== Testing pattern: DirectoryWildcard ===

Running command:
  wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\profiles\*\cache2 -quiet    

wbadmin 1.0 - 备份命令行工具
(C) Microsoft Corporation 版权所有。保留所有权利。

正在检索卷信息...
错误 - 无法验证文件路径“C:\Tools\playground\restic_scripts\wbadmin-glob-lab\profiles\*\cache2”

文件名、目录名或卷标语法不正确。

=== Testing pattern: BrowserCacheWildcard ===

Running command:
  wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Code Cache -quiet

wbadmin 1.0 - 备份命令行工具
(C) Microsoft Corporation 版权所有。保留所有权利。

正在检索卷信息...
错误 - 无法验证文件路径“C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Code Cache”

文件名、目录名或卷标语法不正确。

=== Testing pattern: BrowserServiceWorkerWildcard ===

Running command:
  wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Service Worker\CacheStorage -quiet

wbadmin 1.0 - 备份命令行工具
(C) Microsoft Corporation 版权所有。保留所有权利。

正在检索卷信息...
错误 - 无法验证文件路径“C:\Tools\playground\restic_scripts\wbadmin-glob-lab\chrome\User Data\*\Service Worker\CacheStorage”

文件名、目录名或卷标语法不正确。

=== Testing pattern: JetBrainsWildcard ===

Running command:
  wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\jetbrains\*\caches -quiet   

wbadmin 1.0 - 备份命令行工具
(C) Microsoft Corporation 版权所有。保留所有权利。

正在检索卷信息...
错误 - 无法验证文件路径“C:\Tools\playground\restic_scripts\wbadmin-glob-lab\jetbrains\*\caches”

文件名、目录名或卷标语法不正确。

=== Testing pattern: VenvSingleLevelWildcard ===

Running command:
  wbadmin start backup -backuptarget:D: -include:C:\Tools\playground\restic_scripts\wbadmin-glob-lab -exclude:C:\Tools\playground\restic_scripts\wbadmin-glob-lab\*\.venv -quiet

wbadmin 1.0 - 备份命令行工具
(C) Microsoft Corporation 版权所有。保留所有权利。

正在检索卷信息...
错误 - 无法验证文件路径“C:\Tools\playground\restic_scripts\wbadmin-glob-lab\*\.venv”

可见,wbadmin只支持exclude在路径末尾用于匹配文件的通配符,而不支持匹配目录的通配符,也不支持在路径中间使用通配符。也就是说,我只能排除特定路径下特定文件类型的文件,无法排除任意位置的特定文件夹,这对于我的使用场景来说是远远不够的。

因此如果我需要实现我想要的排除功能就需要自己扫盘然后手动展开通配符之后拼接构建参数传给wbadmin。但是扫全盘毫无疑问是非常慢的。想到可以使用everything来做文件索引和搜索,配合它的命令行工具es.exe来快速获取需要排除的文件夹路径列表,然后再传给wbadmin

让gpt帮我写完之后,补了一些测试确认exclusion展开没问题。

最后准备用的时候反转了

❯ sudo wbadmin start backup -backuptarget:D: -include:C: -exclude:C:\Tools
wbadmin 1.0 - 备份命令行工具
(C) Microsoft Corporation 版权所有。保留所有权利。

正在检索卷信息...
在此版本的 Windows 上不支持对卷进行部分备份。

该试一下的()。合理推测是消费级windows压根不支持排除。但我还是决定把尝试过程留存一下,说不定还有别人/ai也会遇到一样的问题呢()

另外需要提示如果使用了allCritical选项的话,wbadmin会忽略exclude参数直接备份所有文件,这也是我之前没测出exclude在我这用不了的原因之一。


Last modified on 2026-03-08