0PE专用菜单文件MENU.0PE解读(二) 批处理篇

继续看 0PE 的批处理文件

http://bbs.wuyou.com/forum.php?mod=viewthread&tid=148300&page=1&authorid=187169

    整个 0PE 的菜单 2 楼已经补充完整了,继续看看 0PE 的批处理。

    批处理语句基本能看懂,就是流程太复杂了,转来转去的,看不太懂,只能理解个大概,错误的地方请 Pseudo 大侠指正。

    这里接着 2 楼的菜单继续启动,现在已经进入 DOS 了,由 autoexec.bat 调用 autoexe0.bat 来处理 PE 文件,内容如下:



autoexe0.bat:

--------------------------------------------------------------------------------
@echo off

:: 设置环境变量
CALL BAT\_ENV.BAT
del BAT\_ENV.BAT

:: 是否进入 DOS 
if "%SYS.VER%"=="DOS" goto :dos

:: 不进入 DOS,则设置 PATH 变量
path c:\;c:\bin;c:\bat

:: 执行 0PE 补丁程序(如果有的话)
if exist bin\0pepatch.bat call 0pepatch.bat

:: 删除 config.sys(不再需要)
del config.sys

:: 这些已经在软盘里面了,可以删除了
>nul del A.GZ
>nul del F6.GZ
>nul if not "%MENU.USR%"=="1" del B.GZ

:: 创建临时目录
md c:\TEMP
set temp=c:\TEMP

:: 如果不进入 DOS,则转道 start 启动
if not "%SYS.VER%"=="DOS" goto :start

:: 启动 DOS
:dos
:: 删除无用目录
>nul deltree /y bat
>nul deltree /y buf
>nul deltree /y bin
>nul deltree /y wxpe
>nul deltree /y temp
:: 删除无用文件
del config.sys
>nul del A.GZ
>nul del B.GZ
>nul del F6.GZ
del deltree.com
del autoexec.bat
:: 启动完毕
cls
goto :end



:Start

:: 清空 autoexec.bat
>autoexec.bat echo.

:: 从 _KERNEL.ZIP 中获取 KERNEL.ZIP
cd C:\BUF
call grtrim.bat KERNEL.ZIP

:: 解压 KERNEL.ZIP 到根目录,并删除 KERNEL.ZIP
cd c:\
if exist C:\BUF\KERNEL.ZIP pkunzip -od C:\BUF\KERNEL.ZIP>NUL
if exist C:\BUF\KERNEL.ZIP del C:\BUF\KERNEL.ZIP

:: 复制 Kernel 目录中的所有文件到 C:\ 根目录,并删除 Kernel 目录
:: 为什么不直接压缩到 KERNEL.ZIP 的根目录中,直接解压,还要这样转移一次?
>nul xcp /m c:\KERNEL\*.* c:\ /H /S /Y /R /Q
>nul deltree /y c:\KERNEL

:: 继续启动 autoexe1.bat
autoexe1.bat
:end

--------------------------------------------------------------------------------





autoexe1.bat:

--------------------------------------------------------------------------------

@echo off

:: 如果不是启动用户自定义菜单,则启动 PE
if not "%MENU.USR%"=="1" goto PE

:: 复制 MENUUSR.bat 到 A 盘
>nul xcp /m /y c:\bat\MENUUSR.bat a:\MENUUSR.bat
:: 执行 MENUUSR.bat
a:\MENUUSR.bat
goto :end

:: 启动 PE
:PE

cd C:\BUF
:: 如果不是从 PXE 启动,则删除 _NETMAP.TXT _NETID.TXT _DEF.CAB
if "%BTM%"=="PXE" goto :L1
for %%i in (_NETMAP.TXT _NETID.TXT _DEF.CAB) do if exist %%i del %%i
:: 如果不是从 ISO 启动,则删除 _EXT2.WIM _NET.WIM
if "%BTM%"=="ISO" goto :L1
for %%i in (_EXT2.WIM _NET.WIM) do if exist %%i del %%i

:L1
:: 获取 NETMAP.TXT NETID.TXT DEF.CAB NET.WIM EXT2.WIM 文件(处理由 Grub4Dos 转移进来的文件)
for %%i in (NETMAP.TXT NETID.TXT DEF.CAB NET.WIM EXT2.WIM) do call grtrim.bat %%i


:: 删除 auoexe0.bat,不再需要
cd C:\
del autoexe0.bat

:: 继续启动 auto_exe.bat
call auto_exe.bat
:end

--------------------------------------------------------------------------------





auto_exe.bat :

--------------------------------------------------------------------------------

@echo off

:: 全局变量%scsiImg%、%OEMF6%、%EXT1%、%config%、%MP%, etc.

:: 如果 PEISO 不为空,则将 set PEISO=%PEISO%的值 写入 C:\WXPE\setPEISO.cmd
:: 注:PEISO = 0PE.ISO 的相对存放位置,由 GRUB4DOS 传入DOS
if not "%PEISO%"=="" echo set PEISO=%PEISO%>C:\WXPE\setPEISO.Cmd

:: 如果 PEISO 不为空,则 ??
if exist C:\WXPE\setPEISO.cmd str C:\WXPE\setPEISO.cmd 0 0 /R /ASC:/ /ASC:\ /A>nul

:: 如果 "%BTM%"=="ISO" 则创建 C:\WXPE\BTMISO 空文件
if "%BTM%"=="ISO" echo.>C:\WXPE\BTMISO

:: 将 set SYS.VER=%SYS.VER%的值 写入到 C:\WXPE\setOSVER.cmd
echo set SYS.VER=%SYS.VER%>C:\WXPE\setOSVER.cmd

:: 如果不是 PXE 启动,也不是 ISO 启动,则跳转到 NOSERVER
set Tftp_Server=
if not "%BTM%"=="PXE" if not "%BTM%"=="ISO" goto :NOSERVER

:: 否则复制文件到相应位置
>nul if exist c:\buf\EXT2.WIM xcp /m c:\buf\EXT2.WIM c:\0PE\%SYS.VER%\EXT2.WIM
>nul if exist c:\buf\NET.WIM xcp /m c:\buf\NET.WIM c:\0PE\AutoRuns\@0#NET.WIM

:: 如果是 ISO 启动,则跳转到 NOSERVER
if "%BTM%"=="ISO" goto :NOSERVER

:: ??
>nul undipd 0x60

:: 设置 FTP 服务器地址
call setip.bat

:: 如果 Tftp_Server 为空,则跳转到 NOSERVER
if "%Tftp_Server%"=="" goto :NOSERVER

:: 将 set Tftp_Server=%Tftp_Server% 写入 C:\WXPE\setTFTPD.cmd
>C:\WXPE\setTFTPD.cmd echo set Tftp_Server=%Tftp_Server%



:NOSERVER

Cls

:: 设置变量 status
if "%EXT1%"=="TRUE" set status=EXT1.GZ: Ready
if not "%EXT1%"=="TRUE" set status=EXT1.GZ: None
if "%scsiImg%"=="TRUE" set status=%status%,  SRS*.ZIP: Ready
if "%OEMF6%"=="TRUE" set status=%status%,  F6.ZIP: Ready
if not "%scsiImg%"=="TRUE" if not "%OEMF6%"=="TRUE" set status=%status%,  SRS: None



:: 显示 0PE 菜单选择窗口 (WBAT 窗口)
if "%scsiImg%"=="TRUE" call w.bat box  @c:\bat\wbat.txt:cc #5,3
if "%OEMF6%"=="TRUE" call w.bat box  @c:\bat\wbat.txt:cc #5,3
if not "%scsiImg%"=="TRUE" if not "%OEMF6%"=="TRUE" call w.bat box  @c:\bat\wbat.txt:cc #4,3
set status=

:: 处理选择
:: 从 XP 系统获取 SRS 驱动
IF "%WBAT%"=="1" set config=N_SCSI
:: 从 ZIP 中获取 SRS 驱动
IF "%WBAT%"=="2" set config=SCSI
:: 启动到 DOS 
IF "%WBAT%"=="3" set config=DOS
:: 清除 CMOS 密码
IF "%WBAT%"=="4" set config=DELCMOS

:: 是否多核
set MP=ENABLE
IF "%wcb1%"=="1" set MP=DISABLE

:: 保存日志
set REPORT=FALSE
IF "%wcb2%"=="1" set REPORT=TRUE

:: 正常启动 PE
set MANUALSTART=FALSE
IF "%wcb3%"=="1" set MANUALSTART=TRUE


SET WBAT=
SET wcb1=
set wcb2=
set wcb3=
goto :%config%



:DOS
:: 进入 DOS
goto end




:DELCMOS
:: 清除 CMOS 密码
DELCMOS.com
echo CMOS password has been cleared, reboot system please!
goto end



:N_SCSI
:SCSI

:: 将 SRS 装载到虚拟软盘
call auto.bat

:: 消除莫名其妙的报txtsetup.sif某行错
>nul XCP.COM c:\wxpe\txtsetup.sif c:\wxpe\txtsetup.sjf /H
del c:\wxpe\txtsetup.sif
ren c:\wxpe\txtsetup.sjf txtsetup.sif


if "%OEMF6%"=="TRUE" IF not "%config%"=="N_SCSI" goto KEEPFD0
:: 卸载 (fd0), (fd1), (fd2), 光驱
>>0pemenu.lst echo map --unmap=0,1,2,0x81:0xff
goto REHOOK

:KEEPFD0
:: 卸载 (fd1), (fd2), 光驱
>>0pemenu.lst echo map --unmap=1,2,0x81:0xff

:REHOOK
:: 使 map 结果生效
>>0pemenu.lst echo map --rehook
>>0pemenu.lst echo map --hook=0x80 
:: 设置 (hd0,0)/setupldr.bin 为启动文件
>>0pemenu.lst echo chainloader (hd0,0)/setupldr.bin


:: 判断是否删除 c:\HDdrv
IF "%MANUALSTART%"=="TRUE" goto L1
IF "%DEBUGON%"=="1" goto L1

:: 删除 c:\HDdrv 目录
>nul deltree /Y c:\HDdrv

:L1
:: 清理文件目录
>nul UNDIPD.COM -u
>nul deltree /Y c:\bat
>nul deltree /Y c:\bin
>nul deltree /Y c:\BUF
del c:\deltree.com

:: 判断是否显示 Debug 信息
IF "%MANUALSTART%"=="TRUE" goto PRMPT
IF "%DEBUGON%"=="1" goto PRMPT

:: 直接启动 PE
startPE.bat



:PRMPT

:: 显示变量值
echo DEBUGON=%DEBUGON%,config=%config%,PEISO=%PEISO%,EXT1=%EXT1%,scsiImg=%scsiImg%,OEMF6=%OEMF6%,F6DEF=%F6DEF%,Tftp_Server=%Tftp_Server%
echo xpres=%xpres%,xpdrv=%xpdrv%,xpdir=%xpdir%,MP=%MP%,SYS.VER=%SYS.VER%

:: 显示 c:\HDDRV 所有文件列表
if exist c:\HDDRV\nul dir /a-d c:\HDDRV


:: 启动 PE
IF "%DEBUGON%"=="1" pause
IF "%DEBUGON%"=="1" startPE.bat
echo Note: You can then start PE by typing "startPE".
:end

--------------------------------------------------------------------------------





startPE.bat:

--------------------------------------------------------------------------------

@echo off

c:
cd \
:: 0pemenu.lst 是动态创建的
if not exist 0pemenu.lst goto quit

:: 清理文件
del io.sys
del autoexe1.bat
del auto_exe.bat
del command.com
if exist a:\_SRS.ZIP del a:\_SRS.ZIP
>nul copy /y grub.exe a:\grub.exe
del grub.exe

:: 启动 PE (借助 GRUB4DOS)
a:\grub --config-file=c:\0pemenu.lst 


:: 出错后转到这里
:quit
echo.
echo Sorry, PE not ready to start.

--------------------------------------------------------------------------------



    上面的还不是核心,只是流程,核心文件在 KERNEL\BAT 里面,文件列表如下:

auto.bat
check.bat
chknet.bat
CHKPCI.BIN
cpy.bat
drivers.txt
drvSif.bat
F6AUTO.bat
MENUUSR.bat
MP.SIF
REPORT.bat
SCSI.BAT
SCSI_DRV.EXE
setip.bat
system32.txt
tftpget.bat
userdl.bat
wbat.txt
xcpbat.bat



    希望 Pseudo 大侠有时间的话给大家解读一下这些脚本,这些脚本里面有太多判断和跳转,又牵扯到很多环境变量,如果不整体把握是很难读懂的,我就是被那些环境变量和跳转给搞晕了,看不懂了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: menu.js 是一个 JavaScript 文件,通常用于网站或应用程序的导航菜单。它包含了一些 JavaScript 代码,用于控制菜单的展开、折叠、激活当前选项等功能。在网站或应用程序的 HTML 代码中,通常通过 <script> 标签将 menu.js 文件引入,以便在加载页面时执行其中的 JavaScript 代码,从而实现菜单的交互功能。 ### 回答2: menu.js是一种JavaScript文件,用于创建和管理网页菜单。具体来说,它通常用于网站或应用程序的导航栏,以便用户可以通过点击菜单中的链接或按钮来浏览不同的页面或执行特定的操作。 在menu.js文件中,开发人员可以定义菜单的样式、布局和功能。它可以包含各种菜单项,例如主菜单、子菜单、下拉菜单等。开发人员可以使用JavaScript代码来处理菜单项的点击事件,以便在用户点击菜单项时执行相应的动作或导航。 通过menu.js文件,开发人员可以轻松地添加、删除或修改菜单项,从而实现灵活的菜单操作和导航功能。它可以与HTML和CSS文件结合使用,以便完整地构建和呈现网站的导航栏。 总之,menu.js是一个用于创建和管理网页菜单的JavaScript文件,通过它,开发人员可以定义菜单的样式和布局,并处理菜单项的点击事件,以提供灵活的导航功能。 ### 回答3: menu.js是一个JavaScript文件,通常用于网页开发中的菜单功能。它包含一些JavaScript代码,用于创建和控制网页上的菜单栏。这个文件会定义菜单项的样式和行为,以及鼠标悬停或点击菜单项时的响应事件。 menu.js文件可以通过在网页的HTML代码中调用来引入,通常是在<head>标签中使用<script>元素引用该文件。 一般来说,menu.js文件会定义一个JavaScript对象,用于存储菜单的相关信息,例如菜单的ID、菜单项的名称和链接等。同时,该文件也会包含一些函数,用于实现菜单的展开、收起、悬停和点击等交互功能。 通过使用menu.js文件,网页开发者可以方便地创建和管理网页上的菜单栏,使用户能够快速导航到不同的页面或功能模块。 总之,menu.js是一个用于实现网页菜单功能的JavaScript文件,通过定义菜单项的样式和行为,以及响应用户交互事件,使网页菜单更加可见和易用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值