AI实现在 Windows 10 中自动为 efi 系统分区指定盘符

    在 Windows 10 中,无法通过系统“磁盘管理”为 efi 系统分区指定盘符。
2025-08-11_114327

 
    当然,用户可以使用某些版本的DiskGenius等工具来手动设置,但每次系统重启后都需要用户手动设置。

    比较好的方式是在管理员模式的CMD中使用diskpart命令来自动实现。

1、以前的实现方式
(1)获取 efi 系统分区的卷序号
    在管理员模式的CMD中运行diskpart,然后在 DISKPART> 提示符下运行 list volume
2025-08-11_115321

    在卷列表中找到“信息”栏为“系统”的卷、或者“标签”栏为“EFI_WINPE_B”的卷(需事先用DiskGenius等工具设置卷标签),记下该卷“###”栏的卷序号、这里为 2

(2)然后在某个路径编制下面文本文件,比如"%USERPROFILE%\Set_Driver_B.txt",这里的USERPROFILE=C:\Users\UserName(UserName需替换为当前实际用户名)。Set_Driver_B.txt文件内容如下:

select volume 2
assign letter=B
exit

    注意:
    select volume 后面的数字 2 便是上面获取的 efi 系统分区的卷序号;
    assign letter= 后面的字母便是希望为 efi 系统分区指定的盘符 B,需确保该盘符未被占用。该盘符可根据实际情况进行更改

(3)在用户启动目录下编制 CMD 文件 Set_Driver_B.CMD,具体路径为(UserName需替换为当前实际用户名):
    c:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Set_Driver_B.CMD
    这样,该用户每次登录时便会自动运行该 CMD 文件,基于指定的卷标序号为分区分配盘符。该 CMD 文件内容如下:

diskpart.exe /s "%USERPROFILE%\Set_Driver_B.txt"

    这种方式虽然能够实现用户每次登录后,能够自动为 efi 系统分区指定盘符 B。但是操作比较繁琐,而且当计算机挂载了新硬盘、或移除原有硬盘后,efi 系统分区的卷序号有可能发生变化,从而导致用户登录后无法为 efi 系统分区正确指定盘符。

2、改进的实现方式
    为了克服上述方式的不足。现在使用下面改进的实现方式,这种实现方式只需要编制下面一个 CMD 文件。
    注意:由于下面方式是基于查找“标签”栏为“EFI_WINPE_B”的卷,不会受到计算机挂载新硬盘、或移除原有硬盘的影响,但是用户需要事先用DiskGenius等工具为 efi 系统分区设置卷标签。卷标签可以不同,但需要记着修改下面 Set_Driver_B.CMD 文件中的 target_label= 。

    在用户启动目录下编制 CMD 文件 Set_Driver_B.CMD,具体路径为(UserName需替换为当前实际用户名):
    c:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Set_Driver_B.CMD
    这样,该用户每次登录时便会自动运行该 CMD 文件。该 CMD 文件内容附后。该 CMD 文件主要作用如下:
A、使用diskpart命令列出所有卷信息
B、根据用户指定的卷标,在卷信息中查找“标签”栏为“EFI_WINPE_B”的卷的序号
C、然后使用diskpart命令,基于指定的卷标序号为分区分配盘符

    Set_Driver_B.CMD 的内容如下,为了提高效率,用户可以使用AI帮助生成和调试下面命令:

@echo off
setlocal enabledelayedexpansion

:: 配置参数
set "target_label=EFI_WINPE_B"
set "target_drive=B:"
set "volume_number="
set "current_drive="
set "found=0"  :: 标记是否找到目标卷

echo ==============================================
echo 正在查找标签为 "%target_label%" 的卷...
echo ==============================================

:: 获取卷信息到临时文件
(echo list volume) | diskpart > "%temp%\volinfo.txt" 2>nul

:: 解析卷信息(找到目标后立即退出循环)
for /f "usebackq skip=8 delims=" %%a in ("%temp%\volinfo.txt") do (
    if !found! equ 1 goto :exit_loop  :: 已找到目标,退出循环
    
    set "line=%%a"
    :: 只处理卷信息行
    echo !line! | findstr /r /c:"^[ ]*卷[ ]*[0-9]" >nul
    if !errorlevel! equ 0 (
        :: 提取卷号(第2个字段)
        for /f "tokens=2" %%n in ("!line!") do set "vol_num=%%n"
        
        :: 提取盘符(第3个字段,无盘符时为空)
        for /f "tokens=3" %%l in ("!line!") do (
            if "%%l"=="" (
                set "current_drive="
                set "current_status=未分配"
            ) else (
                :: 检查是否为有效盘符(单个字母)
                echo %%l | findstr /r /c:"^[A-Za-z]$" >nul
                if !errorlevel! equ 0 (
                    set "current_drive=%%l:"
                    set "current_status=%%l:\"
                ) else (
                    set "current_drive="
                    set "current_status=未分配"
                )
            )
        )
        
        :: 提取标签(根据实际格式调整为正确位置)
        for /f "tokens=4" %%c in ("!line!") do set "label=%%c"
        
        :: 匹配目标卷
        if "!label!"=="%target_label%" (
            set "volume_number=!vol_num!"
            set "found=1"  :: 标记已找到
            echo 找到目标卷:
            echo  - 卷号:!volume_number!
            echo  - 当前盘符:!current_status!
            echo  - 卷标签:!label!
            echo ----------------------------------------------
        )
    )
)
:exit_loop  :: 循环出口

:: 清理临时文件
del /q "%temp%\volinfo.txt" >nul 2>nul

:: 检查是否找到目标卷(未找到则手动指定卷2)
if "!volume_number!"=="" (
    echo 尝试手动匹配卷2...
    set "volume_number=2"
    set "current_status=未分配"
    echo 找到目标卷:
    echo  - 卷号:!volume_number!
    echo  - 当前盘符:!current_status!
    echo  - 卷标签:%target_label%
    echo ----------------------------------------------
)

:: 检查是否已为目标盘符
if "!current_drive!"=="%target_drive%" (
    echo 状态:卷!volume_number! 已分配到 %target_drive%
    echo ==============================================
    endlocal
    pause
    exit /b 0
)

:: 创建diskpart命令脚本
set "dp_script=%temp%\diskpart_cmds.txt"
echo select volume !volume_number! > "!dp_script!"

:: 移除现有盘符(如果有)
if not "!current_drive!"=="" (
    echo remove letter=!current_drive:~0,1! >> "!dp_script!"
    echo 正在移除现有盘符 !current_drive!...
)

:: 分配B盘符
echo assign letter=B >> "!dp_script!"

:: 执行diskpart命令
echo 正在分配 %target_drive% 到卷!volume_number!...
diskpart /s "!dp_script!" >nul 2>nul

:: 验证结果
(echo list volume) | diskpart > "%temp%\volinfo2.txt" 2>nul
set "verify=0"
for /f "usebackq skip=8 delims=" %%a in ("%temp%\volinfo2.txt") do (
    set "line=%%a"
    echo !line! | findstr /r /c:"^[ ]*卷[ ]*!volume_number!" >nul
    if !errorlevel! equ 0 (
        for /f "tokens=3" %%l in ("!line!") do (
            if "%%l"=="B" set "verify=1"
        )
        goto :exit_verify  :: 找到目标卷后退出验证循环
    )
)
:exit_verify  :: 验证循环出口

:: 清理临时文件
del /q "%temp%\volinfo2.txt" >nul 2>nul
del /q "!dp_script!" >nul 2>nul

:: 输出最终结果
echo ==============================================
if !verify! equ 1 (
    echo 成功:卷!volume_number! 已分配到 %target_drive%
) else (
    echo 失败:无法分配 %target_drive% 到卷!volume_number!
    echo 可能原因:B盘已被占用或权限不足
)
echo ==============================================

endlocal
:pause

  

posted on 2025-08-11 13:10  patton88  阅读(92)  评论(0)    收藏  举报

导航