无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 435540|回复: 3222
打印 上一主题 下一主题

[分享] RUN 1206 更新 支持磁盘交换,文件检索,自动菜单,自动列表,全自动安装nt5x系统

    [复制链接]
1#
发表于 2010-12-8 08:20:11 | 显示全部楼层
用了许多WENV命令,可以利用新版的load把wenv加载到内存再使用,否则加载可能会很慢,因为执 行一次就要读一次.
回复

使用道具 举报

2#
发表于 2010-12-12 16:35:46 | 显示全部楼层
不错,这样就更方便使用了,关于RUN一些需要注意的地方..
多加几个goto :eof

注意call和goto不同,call 调用后是继续执行下一句的.而goto直接跳过去.
当然如果你的本意是想让它继续执行下一句那就不需要goto :eof了.


  1. :isofile
  2. map --mem %1 (0xff) || map %1 (0xff)
  3. map --hook
  4. call chain (0xff)
  5. goto :eof

  6. :imgfile
  7. map --mem %1 (fd0)
  8. map --hook
  9. rootnoverify (fd0)
  10. call chain ()+1
  11. goto :eof

  12. :dtsima
  13. map --mem %1 (fd0)
  14. map --hook
  15. write --offset=317 (fd0)/autoexec.bat %2 end
  16. root (fd0)
  17. call chain (fd0)+1
  18. goto :eof

  19. :chain
  20. chainloader %1 || chainloader --force %1
  21. boot
  22. goto unknown

  23. :firaiso
  24. checkrange 0x80 read 0x8280 && map (hd0) (hd-1) && map (hd1) (hd0) && map --rehook
  25. WENV call cat --length=0 ()%2 ]]| call find --set-root --devices=ch ${path} || goto nofound
  26. WENV call map --mem ()${path} (0xff) ]]| call map ()${path} (0xff)
  27. map --hook
  28. map --mem (bd)/BOOT/IMGS/FIRADISK.IMG (fd1) || map --mem (hd-1,0)/BOOT/IMGS/FIRADISK.IMG (fd1)
  29. map --mem (md)0x6000+2880 (fd0)
  30. dd if=(fd1) of=(fd0) count=1 && clear
  31. echo -e \nInput "D" to boot from the disk to continue System Installation \nor press Enter key to boot form the ISO.
  32. WENV set in=$U,$input,Input here :
  33. WENV check ${in}<>D call chainloader (0xff) && boot
  34. find --set-root --devices=h /$LDR$ && cat --length=0 ()/WIN_NT$.~BT/SETUPLDR.BIN && chainloader --force /$LDR$ && boot
  35. find --set-root --devices=h /$LDR$ && cat --length=0 ()/NTDETECT.COM && chainloader --force /$LDR$ && boot
  36. find --set-root --devices=h /NTLDR && cat --length=0 ()/NTDETECT.COM && chainloader --force /NTLDR && boot
  37. goto nofound
  38. :unknown
  39. call back Unknown error
  40. goto :eof

  41. :nofound
  42. call back File not found
  43. goto :eof

  44. :error
  45. call back Command error
  46. goto :eof

  47. :back
  48. pause %1 %2 %3, press any key to return...
  49. configfile (md)4+8
复制代码
回复

使用道具 举报

3#
发表于 2010-12-12 16:40:23 | 显示全部楼层
还有一点...
尽量不要在批处理中使用configfile
因为这是不可返回命令,会造成内存占用无法释放.

如果执行一两次倒是不会有什么问题.多的就可能会发生一些问题..

其实这个configfile (md)4+8是完全不必要的..

稍后我再抽空详细看一下,修改一下这个RUN脚本.
回复

使用道具 举报

4#
发表于 2010-12-12 17:52:09 | 显示全部楼层
goto :eof
就是跳到批处理文件的未尾执行.当然就是退出了.

和批处理的语法一模一样的,经常写批处理的就看得比较明白了.

被我改得面目全非了..
测试一下看看是否能够达到理想的效果..

firadisk的执行方式改变了..
这个参数放在最后面.

run isofile FIRADISK

[ 本帖最后由 chenall 于 2010-12-12 17:53 编辑 ]

RUN.rar

966 Bytes, 下载次数: 597, 下载积分: 无忧币 -2

回复

使用道具 举报

5#
发表于 2010-12-13 11:24:15 | 显示全部楼层
原帖由 sratlf 于 2010-12-13 01:35 发表
@chenall

C大  麻烦再看下1#菜单  看有什么不妥之处  还有一件事  

菜单中只写
title run
RUN

类似这样的不能识别为可启动的  没办法通过上下键 ...


这个没有办法.
PS:好像errorcheck off可以,但出了什么问题也就无从查起了.

我们可以通过增加一个类似批处理的exit xxx用法,让批处理退出时产生一个错误.
这个晚上我再看一下.直接增强一下error命令好了.
回复

使用道具 举报

6#
发表于 2010-12-13 20:13:09 | 显示全部楼层
还是按照我的方式改得面目全非了.大家可以试试看有没有什么问题.
需要最新版本的GRUB4DOS(今天的版本)

  1. !BAT
  2. ::GRUB4DOS 批处理脚本 run
  3. ::使用方法:
  4. ::RUN /path/filename.bin
  5. ::RUN FIRADISK /path/filename.iso
  6. ::RUN /path/filename.img
  7. ::RUN /path/fileldr
  8. ::来源无忧启动论坛:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=182793&extra=page%3D1
  9. ::原版作者:sratlf ,修改:chenall
  10. ::需要的外部命令WENV下载:
  11. ::http://bbs.wuyou.net/forum.php?mod=viewthread&tid=182254&page=102#pid2110281
  12. debug off
  13. checkrange 20101213:-1 read 0x8278 || echo Err: Version too old! && exit 1
  14. delmod -l wenv || insmod WENV
  15. WENV check "%~1"=="" && goto input
  16. :start
  17. WENV check "firadisk"=="%~1" && goto firaiso
  18. WENV check "%~1"=="" && goto help
  19. echo -e \nNow loading %1...\n
  20. find --set-root %1
  21. WENV check ""=="%~x1" && goto chain
  22. WENV check ".bin"=="%~x1" && goto binfile
  23. WENV check ".iso"=="%~x1" && goto isofile
  24. goto imgfile
  25. :imgfile
  26. map --mem %1 (fd0)
  27. map --hook
  28. WENV check "%~2"<>"" && write --offset=317 (fd0)/autoexec.bat %2 end
  29. rootnoverify (fd0)
  30. chainloader +1
  31. goto :eof
  32. :binfile
  33. map --mem %1 (rd)
  34. map --in-place ()+1 (hd0)
  35. map --hook
  36. root (hd0,0)
  37. chainloader (rd)+1
  38. goto :eof
  39. :isofile
  40. map %1 (0xff) || map --mem %1 (0xff)
  41. map --hook
  42. chainloader (0xff)
  43. goto :eof
  44. :chain
  45. chainloader --force %1
  46. goto :eof
  47. :input
  48. clear && echo -e \nPlease input the ISO/IMG PATH or press Enter to use /WIN$.ISO as default.\n
  49. WENV set path=$U,$input,Input PATH here, begin with "/" :
  50. WENV get path || clear && echo -e \nNow use /WIN$.ISO as default. && WENV set path=/WIN$.ISO
  51. ::这里因为wenv的问题目前暂时这样处理,否则可以直接
  52. ::WENV call call start %1 ${path}
  53. WENV echo -n ${path} | call start %1
  54. goto :eof
  55. :firaiso
  56. WENV check "%~2"=="" goto input
  57. WENV echo -e \nNow loading firadisk\n
  58. find --set-root /BOOT/IMGS/FIRADISK.IMG
  59. map --mem /BOOT/IMGS/FIRADISK.IMG (fd1)
  60. map --mem (md)+2880 (fd0)
  61. map --hook
  62. dd if=(fd1) of=(fd0) count=1
  63. echo Now loading %2
  64. call :isofile %2
  65. echo -e \nPress "I" to boot from iso and any other key to continue System Installation(boot from harddisk).
  66. ::pause命令经过增强,会返回按键的ASCII值.0x69,0x49分别是i的大小写ASCII码.
  67. checkrange 0x69,0x49 pause --wait=5 && goto :eof
  68. find --set-root --devices=h /WIN_NT$.~BT/SETUPLDR.BIN && chainloader ()/WIN_NT$.~BT/SETUPLDR.BIN && exit
  69. find --set-root --devices=h /NTLDR cat --length=0 /NTDETECT.COM
  70. chainloader /NTLDR
  71. goto :eof
  72. :help
  73. echo Usage: RUN [FIRADISK] file/binfile
复制代码

RUN.rar

1.26 KB, 下载次数: 139, 下载积分: 无忧币 -2

回复

使用道具 举报

7#
发表于 2010-12-14 00:10:38 | 显示全部楼层
管理命令?是什么东西
回复

使用道具 举报

8#
发表于 2010-12-14 00:28:20 | 显示全部楼层
原帖由 zxw 于 2010-12-14 00:19 发表
不好意思,打错了。是“管道”命令,即|


汗,N个月前就已经实现了,你没有注意看我上面的批处理,里面用就用到一个管道功能..

只是目前的管道只有很简单的功能.没有CMD那么强大而已,但应付一般情况是够用了.

目前已经支持三种简单的管道命令 "|" ">" ">>"

但是和CMD又有一些区别,功能比较弱.注意看更新说明就知道了.

[ 本帖最后由 chenall 于 2010-12-14 00:30 编辑 ]
回复

使用道具 举报

9#
发表于 2010-12-14 01:08:27 | 显示全部楼层
这个是返回ASCII值的

直接用以下命令就可以得到它的值了
wenv call pause --wait=3 ; set key=${?_WENV}
回复

使用道具 举报

10#
发表于 2010-12-14 16:46:11 | 显示全部楼层
:binfile
map --mem %1 (rd)
map --in-place ()+1 (hd0)
map --hook
root (hd0,0)
chainloader (rd)+1
goto :eof
这个可以保证总是可以使用,如果用下面的

map --in-place ()+1 (hd0)
map --hook
chainloader --force %1
有可能会出错.
比如这个文件在(hd0,5)里面?

其它的修改,可能是因为想法不一样,我就不再修改了.


修改:  了解了一下--in-place的用法后,觉得这样子也没有什么问题.看来是我考虑太多了.^_^

[ 本帖最后由 chenall 于 2010-12-14 19:54 编辑 ]
回复

使用道具 举报

11#
发表于 2010-12-14 17:17:50 | 显示全部楼层
我也从来没有用过,呵呵
http://bbs.znpc.net/redirect.php?fid=4&tid=2467
回复

使用道具 举报

12#
发表于 2010-12-14 22:55:53 | 显示全部楼层
用你原来的方式就好了.
回复

使用道具 举报

13#
发表于 2010-12-17 13:13:54 | 显示全部楼层
原帖由 butyes 于 2010-12-16 13:45 发表
这个我明白,如果要自动生成第二个Menu列表怎么实现?


这个可以修改一下AUTOMENU的脚本.

使用参数来代替/BOOT/IMGS

这样想对什么目录生成菜单都是可以的了.我发的脚本只是为了演示.

更多的功能还有待大家去挖掘.一切皆有可能.
回复

使用道具 举报

14#
发表于 2010-12-27 10:36:10 | 显示全部楼层
原帖由 rose4cat 于 2010-12-26 21:29 发表
不知如何在pxe模式下动态生成菜单


pxe下只要服务器上的对应目录下有dir.txt文件操作和本地的一样。

可以用dir /b>dir.txt来生成,

目前pxe的文件列表不支持带空格的文件、目录。
回复

使用道具 举报

15#
发表于 2010-12-27 14:06:50 | 显示全部楼层
原帖由 zxw 于 2010-12-27 13:58 发表
批处理中还是允许使用configfile为好。


本来就没有不允许啊...........只是不建议使用而已.

而且新版已经对批处理执行configfile进行改进了.

[ 本帖最后由 chenall 于 2010-12-27 14:13 编辑 ]
回复

使用道具 举报

16#
发表于 2010-12-30 13:09:59 | 显示全部楼层
执行configfile命令后会改变(bd)设备为configfile 命令所指向文件的设备,所以当然失败了。
回复

使用道具 举报

17#
发表于 2010-12-30 16:10:47 | 显示全部楼层
看了一下源码,如果是configfile一个(md)上面文件的那bd不会被改变的.

应该是其它问题.
回复

使用道具 举报

18#
发表于 2010-12-30 22:20:49 | 显示全部楼层
原帖由 sratlf 于 2010-12-30 16:40 发表
@chenall

正好麻烦c大再看下  我用简易启动测试器测试时也有file not found错误  和111#h99h99问题相同  虚拟机内存为128M以上基本没有  内存64M时基本都是失败

64M时也不是一开始就失败  看屏显内容是执 ...

  1. :makemenu
  2. WENV check "#.txt#"=="#%~x3#" && goto :eof
  3. WENV check "%~x3"=="" && goto :eof
  4. cat --length=0 (bd)%2%~n3.TXT && cat (bd)%2%~n3.TXT >> (md)0x3000+0x10 ! WENV echo title ${n}. RUN %3 >> (md)0x3000+0x10
  5. echo -e \n%~nx0 %2%3\nboot >> (md)0x3000+0x10
  6. WENV calc n++

  7. :lst
  8. configfile ()%2 || find --set-root --devices=chpu %2
  9. configfile %2
  10. goto :eof
复制代码


上面的代码有问题。。。。
注意一下使用批处理的标签goto/call
而且标签尾部一般都要有exit或goto :eof命令。
当然了一些特殊情况下就不用了.看来你和zxw犯了同样的错误。
回复

使用道具 举报

19#
发表于 2010-12-31 17:11:43 | 显示全部楼层
如果还是那样,有可能是这个批处理脚本的执行逻辑还有问题,只能等你自己找出问题来了。。

提示:可以使用DEBUG ON的模式进行调试
debug on
会显示批处理脚本的执行过程。每个命令,很容易就可以看出执行到哪里出错了。
回复

使用道具 举报

20#
发表于 2011-1-2 00:09:58 | 显示全部楼层
更新了一下,也许会和这个有关系。。。

可以下载最新版本试一下
回复

使用道具 举报

21#
发表于 2011-1-3 14:21:06 | 显示全部楼层
原帖由 rose4cat 于 2011-1-3 13:13 发表
我按此方法试验pxe环境中,出现如下提示不再继续      

ALL FILE IN PATH OF /IMG/:
WENV for  %I IN (start,step,end|file|"string") DO sub-command
%%i in ( (md)0x3800+0x80) do call call :.autoli ...


你服务器上没有对应的DIR.TXT文件。无法生成列表。
你可以在GRUB4DOS 命令行中
root (pd)
ls
ls /yourpath/
如果可以显示列表那就正常。
回复

使用道具 举报

22#
发表于 2011-1-13 09:20:30 | 显示全部楼层
原帖由 Plantsoot 于 2011-1-13 08:40 发表
可以考虑下我的思路,直接给参数,让用户自己去写参数,会调用MAXDOS里面的程序的基本上也会写参数,不会调用的也基本上不太会写参数。

期待更好的解决方案。


建议把MAXDOS里面的程序转成MODBOOT的一个个模块

想启动什么直接在GRUB4DOS的界面上选择就可以了,更方便。
回复

使用道具 举报

23#
发表于 2011-1-15 19:02:27 | 显示全部楼层
原帖由 sratlf 于 2011-1-15 18:07 发表
@ tubaozi

我晕倒  198#注意里写明了  fb启动(bd)=(ud)  但是  不等于()或什么都不加  因为什么都不加等同于()

可见区的就写()或不写  UD区就写(bd)或(ud)

@ blithewind

那是个失误  上传前我忘记把 ...


为了方便调试建议不要硬编码debug off或debug on

而是用一个变量比如debug
debug %debug%

以后需要调试时只需要如下命令就可以了.
set debug=on
回复

使用道具 举报

24#
发表于 2011-1-19 14:16:16 | 显示全部楼层
贴一个获取指定行内容的批处理代码
调用方法
第一个参数是文件名
第二个参数是一个变量名(获取到的内容会放在这个变量中)
第三个参数是行数,第几行。从1开始的。

例子:读取test.txt 的第9行设为变量line9
call :read_line /test.txt line9=9
exit

:read_line
set _start=0
set _end=0
cat --locate=\xA --number=%3 %1 | call :get_last_line
set /a _end=%_end%-%_start%
cat --skip=%_start% --length=%_end% %1 | set %2=
set _start=
set _end=
exit

:get_last_line
if "%1"=="" exit
if "%2"=="" && set /a _end=0x%1 ! if "%3"=="" && set /a _start=0x%1+1
shift
goto :get_last_line

注:如果文件的换行符是回车+换行的,获取到内容最后会有一个换行符0xd

[ 本帖最后由 chenall 于 2011-1-19 14:28 编辑 ]
回复

使用道具 举报

25#
发表于 2011-1-19 15:08:25 | 显示全部楼层
原帖由 zxw 于 2011-1-19 14:40 发表
@chenall:
学习了,受益不浅。

call :get_last_line后面不用紧跟空格?


因为 cat命令的结果第一个字符肯定是空格,所以就不用了。。其它命令要看情况。。

不过可以加一个空格比较保险。。

另外为了防止不清楚的人误删必要的空格,我会采用类似如下的做法
ls | call :get_last_line %9
使用一个参数%9,一般情况下%9都是不存在的,当然了特殊情况要特殊考虑。。
回复

使用道具 举报

26#
发表于 2011-1-19 15:46:25 | 显示全部楼层
应该是GZ压缩的吧,用WINRAR或其它工具解压一下就可以了。。
回复

使用道具 举报

27#
发表于 2011-1-20 14:20:27 | 显示全部楼层
我直接测试是正常的。。
你用的GRUB4DOS是什么版本的?
回复

使用道具 举报

28#
发表于 2011-2-14 18:50:22 | 显示全部楼层
原帖由 mrwang123 于 2011-2-14 16:04 发表
看了你的0214代码,
:chdis
root | set root=
if %root:~3,1%==) set root=%root:~,4% || if %root:~4,1%==) set root=%root:~,5% || if %root:~5,1%==) set root=%root:~,6% || if %root:~6,1%==) set root ...



虽然不知道为什么要这样截取,但是获得当前ROOT的方法应该不用这么麻烦
比如
1.用批处理
set root=%~d0

2.比较通用的方法
find --set-root | set root=

因为find默认优先当前root,而使用了--set-root就会只找当前root.所以也就达到了目的.
回复

使用道具 举报

29#
发表于 2011-8-31 09:44:01 | 显示全部楼层

回复 #737 tulongwa 的帖子

出现这个提示,那就是文件没有找到,原因有很多

比如在光盘上使用,区分大小写.

RUN文件没有放在默认目录下
回复

使用道具 举报

30#
发表于 2011-8-31 10:04:23 | 显示全部楼层
command ()/BOOT/GRUB/RUN
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-17 11:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表