|
本帖最后由 2011htpcfans 于 2014-7-18 12:40 编辑
整篇帖子前2/3明显不是我的风格,后1/3我才做了少许改动,看完这篇帖子只要知道个概念就行了,不用细究。
真正要用原始命令BcdEdit+copy去修复引导时情况肯定千差万别,这个帖子就是给大家培养个方向感而已。
下面是一段无责任引导项修复代码,大家有兴趣可以看看,没什么营养价值的。
@echo off&mode con cols=90
title pwDD_Marc倾力提供
color 0a
setlocal enabledelayedexpansion
echo.
echo.
echo ^>^>^> DiskPart-Dism-Boot-BCD-PE-SysPrep-小型工具包 ^<^<^<
echo.
@echo ---------------------------------------------------------------------------
rd %systemdrive%\users\Dir_Test>nul 2>nul
md %systemdrive%\users\Dir_Test>nul 2>nul||(Echo 请使用右键管理员身份运行&&Pause >nul&&Exit)
rd %systemdrive%\users\Dir_Test>nul 2>nul
echo 任务开始时间是%time:~,2%点%time:~3,2%分%time:~6,2%秒
echo.
set /a Tday=0
set "T1=%time%"
echo 需要用到Dism、Diskpart、BCDBoot、BootSect和Find命令,如果不支持请现在退出!
echo.
::取得当前目录控制权,解决访问被拒的问题,PE可能不支持两条命令,要报错,后续无影响!
set bIcacls=n
set /p bIcacls=是否需要取得当前目录的所有权,默认不需要,PE中不需要,需要输入小写y----
if !bIcacls!==y takeown /f %~dp0 /r /d y>nul 2>nul&&echo y|icacls %~dp0 /t /q /grant %username%:f>nul 2>nul
if !bIcacls!==y icacls %~dp0common /remove:d administrator /t >null
:op
cls
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo ┋ 任务类型 1: Dism应用映像安装系统。 ┋
echo ┋ ┋
echo ┋ 任务类型 2: Dism捕获映像备份系统。 ┋
echo ┋ ┋
echo ┋ 任务类型 3: Dism导出映像整理文件。 ┋
echo ┋ ┋
echo ┋ 任务类型 4: BCDBoot、BootSect常规引导修复重建。 ┋
echo ┋ ┋
echo ┋ 任务类型 5: Diskpart磁盘分区。 ┋
echo ┋ ┋
echo ┋ 任务类型 6: 为卷(某分区如ESP)分配装载或删除盘符。 ┋
echo ┋ ┋
echo ┋ 任务类型 7: 在某目录中新建定容vhd虚拟磁盘文件,同时装载。 ┋
echo ┋ ┋
echo ┋ 任务类型 8: 装载或卸载指定虚拟磁盘文件。 ┋
echo ┋ ┋
echo ┋ 任务类型 9: 全新硬盘分区与Dism安装系统一条龙。 ┋
echo ┋ ┋
echo ┋ 任务类型10: 全新硬盘分区与Ghost安装系统一条龙。 ┋
echo ┋ ┋
echo ┋ 任务类型11: Ghost分区备份与恢复安装。 ┋
echo ┋ ┋
echo ┋ 任务类型12: 将本PE安装于本地硬盘EFI/MBR中独立引导分区。 ┋
echo ┋ ┋
echo ┋ 任务类型13: 系统集成与功能调整。 ┋
echo ┋ ┋
echo ┋ 任务类型14: SysPrep封装Win8.1/8/7 x64 x86系统。 ┋
echo ┋ ┋
echo ┋ 任务类型15: 为Win8.1/8/7 x64 x86系统添加引导菜单项。 ┋
echo ┋ ┋
echo ┋ 任务类型16: 删除Win8.1/8/7 x64 x86系统引导菜单项。 ┋
echo ┋ ┋
echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
echo.
set OpChoice=0
set /p OpChoice=请选则任务类型,输入有效序号----
echo.
::凡涉及输入引导菜单项名字的,可以输入空格,再回车,引导项名字就是空,这样看起来就像没有这个引导项,娱乐娱乐!
if !OpChoice!==15 (
set bIsUEFI=y
set /p bIsUEFI=请问BIOS是否UEFI,默认是,不是请输入小写n----
echo.
set bHvLab=n
set /p bHvLab=采用MBR但无独立引导,或者MBR中独立引导分区/ESP分区如已有盘符,输入y,其余直接回车----
echo.
if !bHvLab!==y (
set /p LabelEFI=请输入ESP分区或MBR中独立引导分区盘符或者MBR无独立引导分区时的系统盘符----
)
if not !bHvLab!==y (
::给EFI或者MBR中独立引导分区分配盘符
set bHvSetESP=n
for %%i in (z y x w v u t s r q p o n m) do (
if !bHvSetESP!==n ( if not exist %%i: set LabelEFI=%%i&&set bHvSetESP=y )
)
echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
set /p NumVolESP=请输入GPT中ESP分区或MBR中独立引导分区的卷编号,直接回车----
echo select vol !NumVolESP!>%temp%\DiskPart.txt
echo assign letter=!LabelEFI!>>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt
)
bcdedit /create {bootmgr} /d "Marc Boot Manager" >nul 2>nul
bcdedit /set {bootmgr} device partition=\device\harddiskvolume!NumVolESP! >nul 2>nul
echo.
set b8Boot=n
set /p b8Boot=请问是否建8.1/8/7引导,默认不,如果要建输入小写y----
echo.
if !b8Boot!==y (
::创建8.1/8/7引导项
set l_Sys8=null
set /p l_Sys8=请问要为哪个盘的Windows 8.1/8/7建立引导,输入盘符----
echo.
set name_MenuWindows=Windows_8.1/8/7
set /p name_MenuWindows=默认菜单项名字Windows_8.1/8/7,可自行输入不带空格名字,如Windows_7----
bcdedit /create /d "!name_MenuWindows!" /application osloader>%temp%\fmid.txt
for /f "tokens=2 delims= " %%i in (%temp%\fmid.txt) do (set fmid=%%i)
bcdedit /set !fmid! device partition=!l_Sys8!:
if not !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.efi
if !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.exe
bcdedit /set !fmid! osdevice partition=!l_Sys8!:
bcdedit /set !fmid! systemroot \windows
bcdedit /displayorder !fmid! /addlast
)
echo.
set b8VhdBoot=n
set /p b8VhdBoot=请问是否建8.1/8/7 VHD引导,默认不,如果要建输入小写y----
echo.
if !b8VhdBoot!==y (
::创建8.1/8/7 VHD引导项
set namePathVhd=null
::准备VHD系统文件与序号。
set bHvLSr=n
for /l %%i in (1,1,5) do (
if !bHvLSr!==n (
set /p LPartSource=请输入VHD系统文件所在盘,不带冒号----
if not exist !LPartSource!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
if exist !LPartSource!: set bHvLSr=y
)
)
dir !LPartSource!:\*.vhd /b /s >%temp%\fSeek.txt
echo 查找到!LPartSource!分区下所有VHD文件如下表
echo -----------------------------------------------------
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
set /a CountWim=!a!
if !a!==0 echo 该分区无系统VHD文件,退出重来吧!&&goto End
echo.
set NumWimSource=1
set /p NumWimSource=请输入VHD系统文件序号,我不检测无效序号,默认1----
set bVldNSr=n
for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y )
if !bVldNSr!==n echo 你没有输入有效VHD系统文件序号,退出重来吧!&&goto End
set /a a=0
for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
set /a a+=1
if !a!==!NumWimSource! (
set nameTmp=%%i
echo 你选择的VHD系统文件是:%%i
)
)
set namePathVhd=!nameTmp:~3!
echo.
set name_MenuVHD=VHD_MBY
set /p name_MenuVHD=输入菜单项名字,默认VHD_MBY,可自行输入,如MAXDOS_WYS----
bcdedit /create /d "!name_MenuVHD!" /application osloader>%temp%\fmid.txt
for /f "tokens=2 delims= " %%i in (%temp%\fmid.txt) do (set fmid=%%i)
bcdedit /set !fmid! device vhd=[!LPartSource!:]\!namePathVhd!
if not !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.efi
if !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.exe
bcdedit /set !fmid! osdevice vhd=[!LPartSource!:]\!namePathVhd!
bcdedit /set !fmid! systemroot \windows
bcdedit /set !fmid! detecthal yes
bcdedit /displayorder !fmid! /addlast
)
if !bIsUEFI!==n (
echo.
set bXP=n
set /p bXP=请问是否建XP引导,默认不,如果要建输入小写y----
if !bXP!==y (
::创建XP引导项
echo.
set l_SysXP=null
set /p l_SysXP=请问要为哪个盘的XP建立引导,输入盘符----
echo.
set name_MenuXP=XP_MBY
set /p name_MenuXP=输入菜单项名字,默认XP_MBY,可自行输入,如MAXDOS_WYS----
bcdedit /create {ntldr} /d "!name_MenuXP!"
bcdedit /set {ntldr} device partition=!l_SysXP!:
bcdedit /set {ntldr} path \ntldr
bcdedit /displayorder {ntldr} /addlast
)
)
goto End
)
if !OpChoice!==16 (
bcdedit /enum /v >%temp%\x.txt
::取得GUID所在行。
set numOrder=null
set /a a=0
for /f "delims= " %%i in ( %temp%\x.txt ) do (
set /a a+=1
if %%i==displayorder set numOrder=!a!
)
find "description" %temp%\x.txt >%temp%\m.txt
set /a a=0
for /f "skip=3 tokens=1,* delims= " %%i in ( %temp%\m.txt ) do (
echo.
set bDel=n
set /a Tmp=!a!+1
set /p bDel=系统启动菜单第!Tmp!项是:%%j,请问是否删除,默认不删,删除输入y----
set /a numItem=!a!+!numOrder!
if not !bDel!==n (
set /a c=0
for /f "tokens=1,* delims= " %%k in ( %temp%\x.txt ) do (
set /a c+=1
if !c!==!numItem! (
if !numItem!==!numOrder! (
set item=%%l
bcdedit /delete %%l >nul 2>nul
bcdedit /delete %%l /f >nul 2>nul
)
if not !numItem!==!numOrder! (
set item=%%k
bcdedit /delete %%k >nul 2>nul
bcdedit /delete %%k /f >nul 2>nul
)
)
)
)
set /a a+=1
)
del /f /s /q %temp%\x.txt>nul 2>nul
del /f /s /q %temp%\m.txt>nul 2>nul
bcdedit /enum
goto End
)
:End
echo.
set bProceed=n
set /p bProceed=请问继续其它任务吗,重复运行默认应答选项有效,默认不n,直接回车/是输入小写y----
if !bProceed!==y goto op
del /f /s /q %temp%\fSeek.txt>nul 2>nul
del /f /s /q %temp%\fSrSeek.txt>nul 2>nul
del /f /s /q %temp%\fDsSeek.txt>nul 2>nul
del /f /s /q %temp%\dirPatSeek.txt>nul 2>nul
del /f /s /q %temp%\dirDrvSeek.txt>nul 2>nul
del /f /s /q %temp%\dirIESeek.txt>nul 2>nul
del /f /s /q %temp%\fPatSeek.txt>nul 2>nul
del /f /s /q %temp%\ImageInfo.txt>nul 2>nul
del /f /s /q %temp%\DiskPart.txt>nul 2>nul
del /f /s /q %temp%\tmp.txt>nul 2>nul
del /f /s /q %~dp0fAppUntitled.txt>nul 2>nul
del /f /s /q %~dp0fTmp.txt>nul 2>nul
del /f /s /q %~dp0null>nul 2>nul
del /f /s /q %temp%\Out_DiskPart.txt>nul 2>nul
del /f /s /q %temp%\Out_tmp.txt>nul 2>nul
del /f /s /q %temp%\tmp.txt>nul 2>nul
del /f /s /q %~dp0fdid.txt>nul 2>nul
del /f /s /q %~dp0fmid.txt>nul 2>nul
set "T2=%time%"
if "%T2:~,2%" lss "%T1:~,2%" (set Tday+=8640000)
set /a "T_d=%Tday%+(%T2:~,2%*360000)+(%T2:~3,1%*60000+%T2:~4,1%*6000)+(%T2:~6,1%*1000+%T2:~7,1%*100)+(%T2:~9,1%*10+%T2:~-1%)-(%T1:~,2%*360000)-(%T1:~3,1%*60000+%T1:~4,1%*6000)-(%T1:~6,1%*1000+%T1:~7,1%*100)-(%T1:~9,1%*10+%T1:~-1%)"
set /a "ss=%T_d%/100%%60"
set /a "mm=%T_d%/6000%%60"
set /a "hh=%T_d%/360000%%1"
set /a "ms=%T_d%%%100"
echo.
echo 任务结束时间是%time:~,2%点%time:~3,2%分%time:~6,2%秒,本次任务消耗时间为 %hh%:%mm%:%ss%.%ms%秒。
echo.
pause
|
|