{“content”:”---\nname: windows-install-to-d-drive\ndescription: Windows 软件安装到非 C 盘的通用方法,绕过 winget 和 NSIS 安装限制\ntrigger: 安装软件到 D 盘, winget 安装位置不对, NSIS SSH 无法运行, 软件安装到指定目录失败\n---\n\n# Windows 软件安装到非系统盘(D:/E:/F:)通用方法论\n\n## 核心问题\n\nWindows 软件(尤其是通过 winget)默认安装到:\n- C:\\Program Files\\\n- C:\\Users\\<USER>\\AppData\\Local\\Programs\\\n\n当 C: 满时,需要安装到 D: 等其他盘。\n\n## 安装失败的根本原因\n\n| 方法 | 问题 |\n|------|------|\n| winget install -l D:\\App | winget 对某些包的 --location 参数不生效 |\n| winget install --override \"/S /D=D:\\App\" | manifest 已有 /S,双重 silent 参数冲突 |\n| NSIS GUI 安装程序 + SSH | NSIS 需要图形界面,SSH 非交互会话直接失败(exit code 2) |\n| cmd /c start /WAIT installer.exe | 参数传递不正确,start 处理方式异常 |\n| winget uninstall 残留 | 文件手动删除后,注册表 HKCU\\...\\Uninstall\\<AppID> 仍存在,导致 “already installed” |\n\n## 通用解决方案流程\n\n### 第一步:检查磁盘空间\n\npowershell\nGet-PSDrive C,D | Select-Object Name, @{N='FreeGB';E={[math]::Round($_.Free/1GB,1)}}\n\n\n### 第二步:清理残留(如果”already installed”)\n\npowershell\n# 1. 杀掉相关进程\ntaskkill /F /IM <appname>.exe\n\n# 2. 删除安装目录\nrmdir /s /q \"C:\\Users\\<USER>\\AppData\\Local\\Programs\\<App> 1.1\\\"\n\n# 3. 删除注册表(关键!)\nreg delete \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\<AppID>\" /f\n\n\n### 第三步:选择安装方式\n\n方式 A — winget install -l(如果支持)\n\nbash\nwinget install <AppName> --accept-source-agreements --silent --force -l D:\\<AppFolder>\n\n\n适用情况:winget manifest 明确支持 -l 参数。\n\n方式 B — winget + —override 传递 /D=(仅 NSIS silent)\n\nbash\n# 注意:不要同时用 -l 和 --override\nwinget install <AppName> --accept-source-agreements --silent --force --override \"/S /D=D:\\AppFolder\"\n\n\n方式 C — GitHub API 找 .7z/.zip 便携版(最可靠)\n\npowershell\n# 1. 获取 release assets\nInvoke-RestMethod -Uri \"https://api.github.com/repos/<owner>/<repo>/releases/tags/<version>\" `\n | Select-Object -ExpandProperty assets `\n | Select-Object name,size,browser_download_url\n\n# 2. 下载 7z 或 zip 便携版\ncurl -L -o D:\\App.zip \"<url>\"\n\n# 3. 用 7-Zip 解压(绕过安装程序)\n\"C:\\Program Files\\7-Zip\\7z.exe\" x D:\\App.zip -oD:\\App -y\n\n\n适用情况:NSIS GUI 安装程序 + SSH 非交互会话。\n\n### 第四步:验证安装\n\npowershell\n# 检查目标路径\ndir \"D:\\App\\bin\\appcmd.exe\"\n\n# 测试运行\n\"D:\\App\\bin\\appcmd.exe\" --version\n\n\n## 关键经验总结\n\n1. winget registry 残留 — 卸载不干净时,注册表项仍存在,导致无法重新安装\n2. NSIS installer 交互限制 — 需要图形界面,SSH 非交互环境无法直接运行\n3. GitHub API 获取真实 URL — GitHub release 页面的文件名和下载 URL 必须通过 API 获取(直接复制会拿错)\n4. 7z 便携版 — 很多软件提供 7z/zip 便携版,解压即用,绕过所有安装程序问题\n5. 先杀进程再删目录 — 文件被进程锁定时无法删除\n\n## 常见修复对照表\n\n| 问题 | 解决 |\n|------|------|\n| winget “already installed” | reg delete HKCU\\...\\Uninstall\\<AppID> /f + 手动删目录 |\n| NSIS installer exit code 2 | 改用 7z/.zip 便携版 |\n| winget -l 参数不生效 | 查看 manifest 是否支持;改用 --override \"/D=path\" 或便携版 |\n| 文件被进程锁定 | taskkill /F /IM app.exe 后再删 |\n| curl 下载只有 9 字节 | GitHub redirect,需 -L 跟随重定向 |\n| GitHub 下载 URL 不对 | 用 GitHub API 获取真实 release assets URL |\n\n## 常用路径速查\n\n\nwinget 安装列表: winget list --name <App>\nwinget 日志: %LOCALAPPDATA%\\Microsoft\\WindowsApps\\winget\\logs\\\n卸载注册表: HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\\n7-Zip 路径: C:\\Program Files\\7-Zip\\7z.exe\nwinget cache: C:\\Users\\<USER>\\AppData\\Local\\Temp\\winget\\cache\\\n\n”}