找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 2499|回复: 27

[分享] 删除ESP、MSR分区盘符或者无效盘符

  [复制链接]
发表于 2026-6-14 18:27:11 | 显示全部楼层 |阅读模式
本帖最后由 kedion 于 2026-6-29 13:35 编辑

在正常启动的Windows系统中使用CGI给移动硬盘安装系统,系统安装后,给ESP和MSR分区分区盘符,移动硬盘拔了之后,CGI给MSR分配的盘符会变成无效盘,正常无法访问,通过命令发现Windows无法正常读取出来盘符信息
Snipaste_2026-06-14_18-26-37.png

解决方法代码是由deepseek全程提供,由代码导致的所有后果本人不负任何责任!
  1. #Requires -RunAsAdministrator

  2. if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
  3.     Write-Host "请以管理员身份运行此脚本!" -ForegroundColor Red
  4.     Read-Host "按 Enter 键退出"
  5.     exit 1
  6. }

  7. if (-not (Get-Command Get-Volume -ErrorAction SilentlyContinue)) {
  8.     Write-Host "Get-Volume 命令不可用,请确认系统中已安装 Storage 模块。" -ForegroundColor Red
  9.     Read-Host "按 Enter 键退出"
  10.     exit 1
  11. }

  12. Write-Host "正在扫描系统中的临时盘符..." -ForegroundColor Cyan

  13. $signature = @"
  14. [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  15. public static extern bool DefineDosDevice(uint dwFlags, string lpDeviceName, string lpTargetPath);
  16. "@

  17. try {
  18.     $api = Add-Type -MemberDefinition $signature -Name "DosDeviceAPI" -Namespace Win32 -PassThru -ErrorAction Stop
  19. } catch {
  20.     Write-Host "无法编译 DefineDosDevice 函数: $_" -ForegroundColor Red
  21.     Read-Host "按 Enter 键退出"
  22.     exit 1
  23. }

  24. $drives = Get-CimInstance Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 } | Select-Object -ExpandProperty DeviceID
  25. $tempDrives = @()
  26. $hasError = $false
  27. $systemDrive = [System.Environment]::SystemDirectory[0].ToString() + ':'

  28. foreach ($d in $drives) {
  29.     if ($d -eq $systemDrive) { continue }
  30.     $vol = Get-Volume -DriveLetter $d[0] -ErrorAction SilentlyContinue
  31.     if (-not $vol) { $tempDrives += $d }
  32. }

  33. if ($tempDrives.Count -eq 0) {
  34.     Write-Host "未发现任何临时盘符" -ForegroundColor Green
  35.     for ($i = 5; $i -gt 0; $i--) {
  36.         Write-Host "`r将在 $i 秒后退出... " -NoNewline -ForegroundColor Yellow
  37.         Start-Sleep -Seconds 1
  38.     }
  39.     Write-Host ""
  40.     exit 0
  41. }

  42. Write-Host "发现以下临时盘符:" -ForegroundColor Yellow
  43. $tempDrives | ForEach-Object { Write-Host " $_" }


  44. $DDD_REMOVE = 0x3

  45. foreach ($d in $tempDrives) {
  46.     Write-Host "正在移除 $d ..." -NoNewline

  47.     $result = $api::DefineDosDevice($DDD_REMOVE, $d, $null)
  48.     if ($result) {
  49.         Write-Host " 成功 (API)" -ForegroundColor Green
  50.         continue
  51.     }

  52.     # 如果 API 失败,尝试 mountvol
  53.     $errCode = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
  54.     Write-Host " API 失败 (错误: $errCode),尝试 mountvol..." -NoNewline
  55.     if (Get-Command mountvol.exe -ErrorAction SilentlyContinue) {
  56.         try {
  57.             $null = mountvol $d /d 2>&1
  58.             if ($LASTEXITCODE -eq 0) {
  59.                 Write-Host " 成功 (mountvol)" -ForegroundColor Green
  60.                 continue
  61.             } else {
  62.                 Write-Host " mountvol 失败,尝试 subst..." -NoNewline
  63.             }
  64.         } catch {
  65.             Write-Host " mountvol 异常,尝试 subst..." -NoNewline
  66.         }
  67.     }

  68.     # 尝试 subst
  69.     if (Get-Command subst.exe -ErrorAction SilentlyContinue) {
  70.         try {
  71.             $LASTEXITCODE = 0
  72.             subst $d /d 2>&1 | Out-Null
  73.             if ($LASTEXITCODE -eq 0) {
  74.                 Write-Host " 成功 (subst)" -ForegroundColor Green
  75.                 continue
  76.             } else {
  77.                 Write-Host " subst 失败,尝试注册表删除..." -NoNewline
  78.             }
  79.         } catch {
  80.             Write-Host " subst 异常,尝试注册表删除..." -NoNewline
  81.         }
  82.     }

  83.     # 注册表兜底
  84.     $regPath = "HKLM:\SYSTEM\MountedDevices"
  85.     $valueName = "\DosDevices\$d"
  86.     try {
  87.         if (Test-Path "$regPath\$valueName") {
  88.             Remove-Item -Path "$regPath\$valueName" -Force -ErrorAction Stop
  89.             Write-Host " 成功 (注册表)" -ForegroundColor Green
  90.         } else {
  91.             Write-Host " 失败,注册表项不存在" -ForegroundColor Red
  92.             $hasError = $true
  93.         }
  94.     } catch {
  95.         Write-Host " 失败,注册表操作被拒绝" -ForegroundColor Red
  96.         $hasError = $true
  97.     }
  98. }

  99. Write-Host "操作完成。" -ForegroundColor Cyan

  100. if ($hasError) {
  101.     Write-Host "部分盘符移除失败,请手动检查" -ForegroundColor Red
  102.     Read-Host "按 Enter 键退出"
  103. } else {
  104.     Write-Host "所有临时盘符已成功移除。" -ForegroundColor Green
  105.     for ($i = 5; $i -gt 0; $i--) {
  106.         Write-Host "`r将在 $i 秒后退出... " -NoNewline -ForegroundColor Yellow
  107.         Start-Sleep -Seconds 1
  108.     }
  109.     Write-Host ""
  110. }
复制代码

删除盘符.exe

188.5 KB, 下载次数: 1, 下载积分: 无忧币 -2

源码.txt

4.22 KB, 下载次数: 0, 下载积分: 无忧币 -2

 楼主| 发表于 昨天 19:06 | 显示全部楼层
wuyou 发表于 2026-6-28 18:57
估计你编辑时,复制了HTML代码的内容到code 标签里面,现在需要你去掉code标签,保存一次,再纯文本复制 ...

我都没有改动code标签里面的内容,只改了标题栏,然后点保存就成这样了。不知道是哪儿的问题,有时候得把所有code标签给删除了再添加才正常
回复

使用道具 举报

发表于 昨天 18:57 | 显示全部楼层
kedion 发表于 2026-6-28 18:25
@wuyou 版主看看这个是啥情况,点了修改帖子,代码块里面的内容全被加了HTML标签了 ...

估计你编辑时,复制了HTML代码的内容到code 标签里面,现在需要你去掉code标签,保存一次,再纯文本复制文字到code标签中。

点评

我都没有改动code标签里面的内容,只改了标题栏,然后点保存就成这样了。不知道是哪儿的问题,有时候得把所有code标签给删除了再添加才正常  详情 回复 发表于 昨天 19:06
回复

使用道具 举报

 楼主| 发表于 昨天 18:25 | 显示全部楼层
@wuyou 版主看看这个是啥情况,点了修改帖子,代码块里面的内容全被加了HTML标签了

点评

估计你编辑时,复制了HTML代码的内容到code 标签里面,现在需要你去掉code标签,保存一次,再纯文本复制文字到code标签中。  详情 回复 发表于 昨天 18:57
回复

使用道具 举报

发表于 6 天前 来自手机 | 显示全部楼层
感谢分享收藏了
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
恭喜恭喜已解决

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 6 天前 来自手机 | 显示全部楼层
学习了谢谢分享
回复

使用道具 举报

发表于 7 天前 来自手机 | 显示全部楼层
kedion 发表于 2026-6-20 17:50
需要用到系统的api,用我上面代码里面使用的api应该是可行的

pecmd有帮助可以大概率知道,ps必须学过基本的语言才行,那玩意儿对于我就是天书。
回复

使用道具 举报

发表于 2026-6-21 22:28:05 | 显示全部楼层
谢谢楼主分享,下载一个来学习下
回复

使用道具 举报

 楼主| 发表于 2026-6-20 17:50:39 | 显示全部楼层
窄口牛 发表于 2026-6-20 17:07
试图找ai写个pecmd脚本,失败了,检测有效盘符搞不对。
自动删除所有无效盘符,然后交互删除有效盘符,知道 ...

需要用到系统的api,用我上面代码里面使用的api应该是可行的

点评

pecmd有帮助可以大概率知道,ps必须学过基本的语言才行,那玩意儿对于我就是天书。  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 2026-6-20 17:07:13 | 显示全部楼层
试图找ai写个pecmd脚本,失败了,检测有效盘符搞不对。
自动删除所有无效盘符,然后交互删除有效盘符,知道用户选择退出。

点评

需要用到系统的api,用我上面代码里面使用的api应该是可行的  详情 回复 发表于 2026-6-20 17:50
回复

使用道具 举报

发表于 2026-6-20 07:48:03 | 显示全部楼层
“移动硬盘拔了之后,CGI给MSR分区分配的盘符会变成无效盘,”
试过F5或ctrl-r刷新?
回复

使用道具 举报

发表于 2026-6-18 00:41:52 | 显示全部楼层
感谢提供!谢谢
回复

使用道具 举报

发表于 2026-6-15 11:55:50 | 显示全部楼层
期待牛人的解答啊
回复

使用道具 举报

发表于 2026-6-15 11:09:01 | 显示全部楼层
从新启动
回复

使用道具 举报

发表于 2026-6-15 08:24:19 来自手机 | 显示全部楼层
学习学习
回复

使用道具 举报

发表于 2026-6-15 07:40:46 来自手机 | 显示全部楼层
回复

使用道具 举报

发表于 2026-6-15 07:29:27 来自手机 | 显示全部楼层
一直用的bootice的功能
回复

使用道具 举报

发表于 2026-6-15 07:13:32 | 显示全部楼层
就用pecmd吧,又不是经常的
回复

使用道具 举报

发表于 2026-6-15 06:15:50 | 显示全部楼层
帮楼主顶一下,我也想知道
回复

使用道具 举报

发表于 2026-6-14 20:29:40 | 显示全部楼层
嗯,总感觉是安装出问题
回复

使用道具 举报

发表于 2026-6-14 20:25:19 | 显示全部楼层
会用subj ,那就直接把命令保存为wcs,再调用不就可以了。
回复

使用道具 举报

发表于 2026-6-14 20:09:37 | 显示全部楼层
在磁盘管理里删除不行吗?一定要用脚本删除?
回复

使用道具 举报

发表于 2026-6-14 19:08:10 | 显示全部楼层
用DiskGenius隐藏。启动DiskGenius选择esp分区,然后菜单:分区-隐藏当前分区,确定,保存更改。
回复

使用道具 举报

发表于 2026-6-14 18:49:19 来自手机 | 显示全部楼层
kedion 发表于 2026-6-14 18:37
CGI安装的,点确定安装的时候就会给ESP和MSR分区分配上盘符

它判断不了分区类型,可能会吧ext,apfs等都给挂载上;没有做善后,搞完引导就应该卸载掉了。
回复

使用道具 举报

发表于 2026-6-14 18:46:37 | 显示全部楼层
怀疑“正常”系统不正常。
回复

使用道具 举报

 楼主| 发表于 2026-6-14 18:37:15 | 显示全部楼层
窄口牛 发表于 2026-6-14 18:31
你的安装软件有问题,理论上这些就不需要盘符,尤其是msr。esp也是修复引导的时候挂载,完了就卸载。成了无 ...

CGI安装的,点确定安装的时候就会给ESP和MSR分区分配上盘符

点评

它判断不了分区类型,可能会吧ext,apfs等都给挂载上;没有做善后,搞完引导就应该卸载掉了。  详情 回复 发表于 2026-6-14 18:49
回复

使用道具 举报

发表于 2026-6-14 18:31:30 来自手机 | 显示全部楼层
你的安装软件有问题,理论上这些就不需要盘符,尤其是msr。esp也是修复引导的时候挂载,完了就卸载。成了无效盘符,目前只有pecmd可以做到。想过做个右键,但用的时候太少太少了。

点评

CGI安装的,点确定安装的时候就会给ESP和MSR分区分配上盘符  详情 回复 发表于 2026-6-14 18:37
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-6-29 15:00

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表