liu_zhenfeng 发表于 2019-9-14 23:32:22

用批处理实现的wimPE硬盘安装模板【20190916更新】加了uefi判断

本帖最后由 liu_zhenfeng 于 2019-9-16 00:40 编辑

批处理添加bcd菜单项功能来源自http://bbs.wuyou.net/forum.php?mod=viewthread&tid=408477&page=2#pid3752228
在我的电脑(win7x64)上实验成功后这几天修改了一下,用winrar打包成自解包后实现了PE安装模板。

20190916更新:加了uefi判断
if "%boot_mode%" == "UEFI" (bcdedit /set %id1% path \Windows\system32\boot\winload.efi)
uefi判断来自 http://wuyou.net/forum.php?mod=viewthread&tid=413675 bcdedit方案
Win10x64 uefi 模式能够启动女娲工坊win10PEx64 ,其他未测试。







附件里面的boot.sdi、test.wim是空文件。addwim.exe里是打包成64位自解包的addwim.cmd文件。


wim文件同名TXT对应Description项,取首行为菜单标题。如没有同名的txt文件,就取wim文件名为菜单标题



运行后有个是否安装提示(winrar自解压实现)


点是自解压到临时目录后依次运行copywimfiles.cmd、addwim.exe(64位)或addwim.cmd(32位)


看看BCD菜单项


自动生成删除批处理






批处理文件内容:         

copywimfiles.cmd


@echo off
TITLE CopyWimFiles
set aa=0
if /i %SystemDrive% == x: set aa=1
ver|find "5.">nul && set aa=1
if "%aa%" == "1" (cls&echo 不能在PE、XP中运行 &echo.&pause&exit)
::
for /f "delims=" %%i in ('dir/b *.wim')do echo %%~ni>"%temp%\wim"
for /f "delims=" %%i in ('dir/b *.sdi')do echo %%~ni>"%temp%\sdi"
set/p wim=<"%temp%\wim"
set/p sdi=<"%temp%\sdi"
::
if exist "%wim%.txt" (set /p title=<"%wim%.txt" )
if exist "%wim%.txt" (echo %title% >"%temp%\title" )
del %wim%.txt >nul 2>nul
::
md "%SystemDrive%\boot" >nul 2>nul
md "%SystemDrive%\boot\%wim%" >nul 2>nul
del "%SystemDrive%\boot\%wim%\*.wim" >nul 2>nul
del "%SystemDrive%\boot\%wim%\*.sdi" >nul 2>nul
::
copy "%wim%.wim" "%SystemDrive%\boot\%wim%"
del "%wim%.wim"
copy "%sdi%.sdi" "%SystemDrive%\boot\%wim%"
del "%sdi%.sdi"
if exist %windir%\SysWOW64 (start addwim.exe)else (start addwim.cmd)
if exist %windir%\SysWOW64 (del addwim.cmd)else (del addwim.exe)
echo.&echo.&echo 即将关闭窗口&timeout /t 15
del addwim.exe >nul 2>nul
del addwim.cmd >nul 2>nul
del %0



addwim.cmd

@echo off
TITLE 添加BCD启动项
set aa=0
if /i %SystemDrive% == x: set aa=1
ver|find "5.">nul && set aa=1
if "%aa%" == "1" (cls&echo 不能在PE、XP中运行 &echo.&pause&exit)
::
setlocal ENABLEDELAYEDEXPANSION
set /a n=0
set /a current_n=-1
set /a bootmgr_n=-1
for %%h in ({bootmgr},{current}) do (set /a n+=1 &for /f "tokens=1* delims= " %%a in ('bcdedit /enum%%h') do (set "!n!_%%a=%%b"))
set "boot_mode=-1"
IF defined 2_path ( for %%q in (!2_path!) do (if /i "%%~xq"==".efi" set "boot_mode=UEFI"))
if !boot_mode! equ -1 (IF defined 1_path ( set "boot_mode=UEFI"))
::
set/p wim=<"%temp%\wim"
del "%temp%\wim"
set/p sdi=<"%temp%\sdi"
del "%temp%\sdi"
::
set title=%wim%
if exist "%temp%\title" (set/p title=<"%temp%\title" )
del "%temp%\title" >nul 2>nul
::
if exist "%SystemDrive%\boot\%wim%\id_1" (set/p id_1=<"%SystemDrive%\boot\%wim%\id_1" )
if exist "%SystemDrive%\boot\%wim%\id_2" (set/p id_2=<"%SystemDrive%\boot\%wim%\id_2" )
bcdedit /delete %id_1% /f >nul 2>nul
bcdedit /delete %id_2% /f >nul 2>nul
::
set id1={%time:~6,2%%time:~9,2%ffff-8d96-11de-8e71-fffffffffffa}
set id2={%time:~6,2%%time:~9,2%ffff-8d96-11de-8e71-fffffffffffb}
bcdedit /create %id2% /d "%title%" /device
bcdedit /set %id2% ramdisksdidevice partition=%SystemDrive%
bcdedit /set %id2% ramdisksdipath "\boot\%wim%\%sdi%.sdi"
::
bcdedit /create %id1% /d "%title%" /application osloader
bcdedit /set %id1% device ramdisk="[%SystemDrive%]\boot\%wim%\%wim%.wim",%id2%
bcdedit /set %id1% osdevice ramdisk="[%SystemDrive%]\boot\%wim%\%wim%.wim",%id2%
bcdedit /set %id1% path \windows\system32\boot\winload.exe
if "%boot_mode%" == "UEFI" (bcdedit /set %id1% path \Windows\system32\boot\winload.efi)
bcdedit /set %id1% description "%title%"
bcdedit /set %id1% locale zh-CN
bcdedit /set %id1% inherit {bootloadersettings}
bcdedit /set %id1% systemroot \windows
bcdedit /set %id1% detecthal Yes
bcdedit /set %id1% winpe Yes
bcdedit /set %id1% ems no
bcdedit /displayorder %id1% /addlast
echo %id1%>"%SystemDrive%\boot\%wim%\id_1"
echo %id2%>"%SystemDrive%\boot\%wim%\id_2"
::
echo @echo off >"%SystemDrive%\boot\DEL_%wim%.cmd"
echo bcdedit /delete %id1% >>"%SystemDrive%\boot\DEL_%wim%.cmd"
echo bcdedit /delete %id2% >>"%SystemDrive%\boot\DEL_%wim%.cmd"
echo rd /s /q "%SystemDrive%\boot\%wim%" >>"%SystemDrive%\boot\DEL_%wim%.cmd"
echo del "%SystemDrive%\boot\DEL_%wim%.cmd" >>"%SystemDrive%\boot\DEL_%wim%.cmd"
::
echo.&echo.&echo 即将关闭窗口&timeout /t 10 &del %0 &exit

dongjun 发表于 2019-9-15 00:12:30

支持一下。

liujun2000 发表于 2019-9-15 00:14:20

谢谢共享

MPFENG 发表于 2019-9-15 07:19:32

好东西。

jkj 发表于 2019-9-15 07:41:09

好东西,支持一下

rockup 发表于 2019-9-16 18:19:33

小白请问一下楼主,boot.sdi文件是那里来的呢?
我找了一个PE,替换testpe.wim,但最张用不了。可能问题出在BOOT.SDI文件,那个文件我不知道来源

liu_zhenfeng 发表于 2019-9-16 22:18:39

本帖最后由 liu_zhenfeng 于 2019-9-16 22:31 编辑

rockup 发表于 2019-9-16 18:19
小白请问一下楼主,boot.sdi文件是那里来的呢?
我找了一个PE,替换testpe.wim,但最张用不了。可能问题出 ...

压缩包里的wim、sdi是零字节的空文件,是为了让批处理认名字好添加到BCD启动项。


ISO版PE里看看boot目录下有没有,我下载的PE是有这俩关键文件的。

???.wim    ???.sdi 名字不必一样, ???.wim 改名叫xxxPE.wimboot.sdi就叫boot.sdi好了


rockup 发表于 2019-9-17 08:59:29

谢谢楼主,我要下载ISO版的,直接下载*.Wim文件,是不带这文件

Dream漂移 发表于 2019-9-17 09:14:07

感谢分享

dxvyi 发表于 2019-9-17 19:58:13

太好了,一直在找这样的批处理程序
想问一下,addwim.exe比addwim.cmd多了什么设置?解包看两个批处理是一样一样的

liu_zhenfeng 发表于 2019-9-18 11:14:51

dxvyi 发表于 2019-9-17 19:58
太好了,一直在找这样的批处理程序
想问一下,addwim.exe比addwim.cmd多了什么设置?解包看两个批处理是一 ...




addwim.exe里的addwim.cmd与外面的addwim.cmd什么区别也没有,重点是压成自解压时选64位模块。我一开始用winrar打成自解压缩包提示找不到bcdedit命令,查了下是因默认自解包执行批处理命令是32位环境,重定向到SysWOW64里面去。想了个办法:将addwim.cmd压缩成64位自解包;用批处理判断是否存在SysWOW64,存在运行addwim.exe不存在运行addwim.cmd 。但这样带来另一个麻烦是每次都要改addwim.cmd再压成addwim.exe。所以改用临时文件传递wim、sdi文件名,平时使用时不需要改批处理内容了。

dxvyi 发表于 2019-9-18 19:35:37

liu_zhenfeng 发表于 2019-9-18 11:14
addwim.exe里的addwim.cmd与外面的addwim.cmd什么区别也没有,重点是压成自解压时选64位模块。我一 ...

我在64位环境下没问题,改成用一个Cmd了,以后有问题再改回来{:1_186:}

qty51c 发表于 2019-9-25 21:28:00

谢谢共享

czvo 发表于 2019-12-22 01:21:26

太赞了,从2018的帖子看到这,居然已经有成功方案了,谢谢老大的付出,小白我就不客气啦

完美大叔 发表于 2020-2-6 11:17:54

..........哈

liuzhaoyzz 发表于 2020-3-10 13:48:08

本帖最后由 liuzhaoyzz 于 2020-3-10 18:07 编辑

下载试了下楼主的批处理,运行了下,结果直接修改的是C:\boot\BCD,而且指向的也是C盘的C:\boot\TestPE\TestPE.sdi,TestPE.wim也拷贝到了C:\boot\TestPE\TestPE.wim,这显然是不行的。我的C盘是RAMOS,是个内存盘,重启就没有了,怎么能够启动?

估计VHD启动的情况类似,C盘被VHD占据,指向C盘肯定无法启动。

批处理应该给用户自定义选择的权利。

qingyi78 发表于 2020-3-10 22:53:22

liuzhaoyzz 发表于 2020-3-10 13:48
下载试了下楼主的批处理,运行了下,结果直接修改的是C:\boot\BCD,而且指向的也是C盘的C:\boot\TestPE\Tes ...
它其实就是一个一键批处理,从COPY到安装BCD启动项。楼主应该指明不能在PE RAMOS XP环境安装,不能再多EFI分区安装等等。我个人的解决方案是直接修改批处理中%SystemDrive% 全部替换成自己想要的盘符。当然也可以是EFI分区,或者其他隐藏分区。但是前面需要个命令先挂载。

qingyi78 发表于 2020-3-10 22:59:00

liuzhaoyzz 发表于 2020-3-10 13:48
下载试了下楼主的批处理,运行了下,结果直接修改的是C:\boot\BCD,而且指向的也是C盘的C:\boot\TestPE\Tes ...

我自己不会写批处理,但是批处理高手可以在这几个命令之前加一段选择的命令,以替换%SystemDrive%

md "%SystemDrive%\boot" >nul 2>nul
md "%SystemDrive%\boot\%wim%" >nul 2>nul
del "%SystemDrive%\boot\%wim%\*.wim" >nul 2>nul
del "%SystemDrive%\boot\%wim%\*.sdi" >nul 2>nul
::
copy "%wim%.wim" "%SystemDrive%\boot\%wim%"
del "%wim%.wim"
copy "%sdi%.sdi" "%SystemDrive%\boot\%wim%"
del "%sdi%.sdi"

wugg 发表于 2020-3-11 00:25:13

好东西,支持一下

wugg 发表于 2020-3-11 00:25:35

好东西,支持一下

zhang9876 发表于 2020-4-5 20:58:08

我替换了提示更改了硬件,启动不了,唉。。。

liu_zhenfeng 发表于 2020-4-5 21:50:12

zhang9876 发表于 2020-4-5 20:58
我替换了提示更改了硬件,启动不了,唉。。。

是什么PE?我试下?

zhang9876 发表于 2020-4-6 19:44:23

liu_zhenfeng 发表于 2020-4-5 21:50
是什么PE?我试下?

https://yunpan.360.cn/surl_yxn22vEP2Yh   有时间帮忙试试看,非常感谢

liu_zhenfeng 发表于 2020-4-7 04:49:23

zhang9876 发表于 2020-4-6 19:44
https://yunpan.360.cn/surl_yxn22vEP2Yh   有时间帮忙试试看,非常感谢
已测试,正常启动

zhang9876 发表于 2020-4-7 17:20:37

zhang9876 发表于 2020-4-6 19:44
https://yunpan.360.cn/surl_yxn22vEP2Yh   有时间帮忙试试看,非常感谢

我重新测试了一下,还是EFI下提示就是这个,手动用easy bcd添加的是正常的。

liu_zhenfeng 发表于 2020-4-14 19:28:02

liuzhaoyzz 发表于 2020-3-10 13:48
下载试了下楼主的批处理,运行了下,结果直接修改的是C:\boot\BCD,而且指向的也是C盘的C:\boot\TestPE\Tes ...

用choice试了一下,应该可以实现等待几秒默认选%SystemDrive%和手动输入驱动器字母。我还没有完整的思路...

liuzhaoyzz 发表于 2020-4-14 21:09:38

liu_zhenfeng 发表于 2020-4-14 19:28
用choice试了一下,应该可以实现等待几秒默认选%SystemDrive%和手动输入驱动器字母。我还没有完整的思路. ...

      需要考虑的因素其实挺多的,比如有多个硬盘,一个ssd硬盘,若干个机械硬盘,这样的电脑有不少,如果硬盘是GPT分区,需要考虑指定的esp分区挂载的问题。对于有的电脑根本不需要esp/fat32分区,任何一个分区都可能是启动分区 ,对于VHD启动的情况也需要考虑,VHD启动的情况原来的真实C盘可能还需要挂载。

liu_zhenfeng 发表于 2020-4-14 23:23:41

本帖最后由 liu_zhenfeng 于 2020-4-15 17:10 编辑




.

liu_zhenfeng 发表于 2020-4-15 16:38:38

本帖最后由 liu_zhenfeng 于 2020-4-15 17:31 编辑

qingyi78 发表于 2020-3-10 22:59
我自己不会写批处理,但是批处理高手可以在这几个命令之前加一段选择的命令,以替换%SystemDrive%

md...
@echo off
:begin
choice /t 10 /c:yn /d:y /m:"是否安装到%SystemDrive:~0,1%盘?"
if %errorlevel%==2 goto no
if %errorlevel%==1 set DriveLetter=%SystemDrive:~0,1% &goto DriveLette

:no
cls&set/p DriveLetter=请输入盘符,再按回车键:
echo %DriveLetter%|findstr "^">nul||(echo 输入错误!请重新输入!&timeout /t 5 &goto no)
if not exist %DriveLetter%: (echo %DriveLetter%盘不存在!&timeout /t 5 &goto no)

:DriveLette
echo 安装到%DriveLetter%盘
pause>nul
cls &goto begin

qingyi78 发表于 2020-4-15 17:49:18

本帖最后由 qingyi78 于 2020-4-15 17:55 编辑

liu_zhenfeng 发表于 2020-4-15 16:38
@echo off
:begin
choice /t 10 /c:yn /d:y /m:"是否安装到%SystemDrive:~0,1%盘?"

谢谢大神,辛苦啦!我自己做了一个简陋的挂载ESP分区到Z盘并安装到Z盘的。只是用了简单的一个命令和替换变量。




页: [1] 2 3
查看完整版本: 用批处理实现的wimPE硬盘安装模板【20190916更新】加了uefi判断