修复 scoop update 后 vcpkg 无法运行的故障

系统使用的 vcpkg 是由 scoop 安装的,在某次 scoop update -a 更新后故障无法运行。通过分析发现是由于安装脚本未能正确执行导致文件缺失引起的。以下是故障分析过程。

发现问题

打开 UniGetUI 更新时发现 vcpkg 的安装源不见了。

在命令行中运行 vcpkg 提示:

Shim: Could not determine if target is a GUI app. Assuming console.
Shim: Could not create process with command '"D:\Apps\scoop\apps\vcpkg\current\vcpkg.exe" '.

运行命令 scoop list vcpkg,显示软件已安装:

Installed apps matching 'vcpkg':

Name  Version    Source Updated             Info
----  -------    ------ -------             ----
vcpkg 2025.07.25 main   2025-07-29 10:56:05

尝试修复

看起来是 scoop shim 出了问题。尝试用 scoop reset vcpkg 命令重置。再次运行 vcpkg,无响应。接着尝试卸载 vcpkg 重新安装。运行 scoop uninstall vcpkg 命令,卡在运行 uninstall script 无响应。

查看 vcpkg.shim 文件,内容如下:

path = "D:\Apps\scoop\shims\vcpkg.exe"

scoop shim 竟然指向自己。这导致运行 vcpkg 命令后会不断调用自身,形成死循环。这就是执行 vcpkg 命令无响应的原因。而卸载脚本中调用了 vcpkg integrate remove 命令,导致卸载命令也无响应。这应该是之前执行 scoop re set vcpkg 命令导致的。

打开 vcpkg 的安装目录,发现目录下找不到 vcpkg.exe 可执行文件。这应该就是引起故障的最终原因。

可以排除软件是被外部破话的,因此怀疑是安装过程中的某些原因导致文件缺失。用 scoop cat vcpkg 查看它的 manifest。发现安装脚本是 bootstrap-vcpkg.bat。运行该脚本后发现安装目录下生成了 vcpkg.exe 文件。查看安装脚本,发现可执行文件是从 github 下载的:

powershellif ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64' -or $env:PROCESSOR_IDENTIFIER -match "ARMv[8,9] \(64-bit\)") {
    & "$scriptsDir/tls12-download-arm64.exe" github.com "/microsoft/vcpkg-tool/releases/download/$versionDate/vcpkg-arm64.exe" "$vcpkgRootDir\vcpkg.exe"
} else {
    & "$scriptsDir/tls12-download.exe" github.com "/microsoft/vcpkg-tool/releases/download/$versionDate/vcpkg.exe" "$vcpkgRootDir\vcpkg.exe"
}

至此问题解决。

总结

Scoop 缺乏一种验证和保障软件安装完整性的机制,一旦软件安装脚本执行过程中发生某些错误或异常引起数据缺失会导致后续各种莫名其妙的问题。

亦或者说,scoop 将保障安装完整性的责任丢给了安装脚本。但仍然希望 scoop 能提供类似 scoop repair 命令来检查和修复已安装的软件。