AI實現在 Windows 10 中自動為 efi 系統分區指定盤符
在 Windows 10 中,無法通過系統“磁盤管理”為 efi 系統分區指定盤符。
當然,用戶可以使用某些版本的DiskGenius等工具來手動設置,但每次系統重啟后都需要用戶手動設置。
比較好的方式是在管理員模式的CMD中使用diskpart命令來自動實現。
1、以前的實現方式
(1)獲取 efi 系統分區的卷序號
在管理員模式的CMD中運行diskpart,然后在 DISKPART> 提示符下運行 list volume
在卷列表中找到“信息”欄為“系統”的卷、或者“標簽”欄為“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、改進的實現方式
為了克服上述方式的不足?,F在使用下面改進的實現方式,這種實現方式只需要編制下面一個 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 失?。簾o法分配 %target_drive% 到卷!volume_number!
echo 可能原因:B盤已被占用或權限不足
)
echo ==============================================
endlocal
:pause
浙公網安備 33010602011771號