无忧启动论坛

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

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
391#
 楼主| 发表于 2011-1-14 11:22:19 | 只看该作者
原帖由 chenall 于 2011-1-14 10:56 发表


也许是没有交换磁盘映射,具体的忘记了。


确实,你的提醒是对的。是没有交换磁盘映射问题。microsoft.lst中:
# 0x6000C   harddrives_orig
......
#0
title [0] Micro Windows PE (autocheck)\n\r\n\t Micro Windows PE by chenall 2010.02.02 http://www.chenall.com
WENV calc hd_num=*0x475 & 0xff
WENV set srspath=/CSPE
echo grub4dos Version check Success... || goto 14
clear
checkrange 0x80 read 0x8280 && map --read-only ()+1 (fd3)
checkrange 0 read 0x8280 && map () (fd3)
checkrange 1:-1 read 0x6000C && map (hd0) (hd)
map --hook || echo

上面的hd_num没有写入0x6000c,导致checkrange 1:-1 read 0x6000C && map (hd0) (hd)永远没执行。
改成
WENV calc hd_num=*0x475 & 0xff
WENV call write 0x6000c ${hd_num}   新版可以改成 write 0x6000c %hd_num%

问题解决!

[ 本帖最后由 zhaohj 于 2011-1-14 11:24 编辑 ]

Snap1.jpg (187.22 KB, 下载次数: 115)

Snap1.jpg
回复

使用道具 举报

392#
发表于 2011-1-14 15:15:12 | 只看该作者
新版已经上传。
set命令添加/l /u参数
用于大小写转换
/l 转小写
/u 转大写。

@zhaohj
呵呵,不知什么时候改错了。找到原因就好
回复

使用道具 举报

393#
 楼主| 发表于 2011-1-14 16:26:13 | 只看该作者
很好,WENV的50%功能已经内置了。
回复

使用道具 举报

394#
 楼主| 发表于 2011-1-15 12:16:40 | 只看该作者
问下C大:
time、date是grub4内置的两个变量,如显示当前日期、时间 echo %@date%  %@time%
还有其他内置的变量吗?
回复

使用道具 举报

395#
发表于 2011-1-15 13:10:06 | 只看该作者
原帖由 zhaohj 于 2011-1-15 12:16 发表
问下C大:
time、date是grub4内置的两个变量,如显示当前日期、时间 echo %@date%  %@time%
还有其他内置的变量吗?


和WENV一样的,另外一个是@RANDOM生成一个随机数

另外还有一个功能也许在某些情况下会用到。。

0x4CB00 位置保存了上一个命令的返回值。

[ 本帖最后由 chenall 于 2011-1-15 13:11 编辑 ]
回复

使用道具 举报

396#
 楼主| 发表于 2011-1-15 14:33:03 | 只看该作者
这个返回值很有用处,比如set a=abc
read 0x4cb00得到0x3,就是变量值的长度

如果能这样就更好了:
set b=*0x4cb00

[ 本帖最后由 zhaohj 于 2011-1-15 14:54 编辑 ]
回复

使用道具 举报

397#
发表于 2011-1-15 18:59:52 | 只看该作者
原帖由 zhaohj 于 2011-1-15 14:33 发表
这个返回值很有用处,比如set a=abc
read 0x4cb00得到0x3,就是变量值的长度

如果能这样就更好了:
set b=*0x4cb00


set /a b=*0x4cb00就行了.

因为set /a是调用calc命令的计算结果的...calc支持的都可以使用.
回复

使用道具 举报

398#
发表于 2011-1-15 22:34:55 | 只看该作者

回复 #395 chenall 的帖子

哈哈,这个好。免得来计算。

对了,c大,什么时候增强一下clear?记得你好象说过,执行clear后,清除什么窗口行计数来着

[ 本帖最后由 zxw 于 2011-1-15 22:43 编辑 ]
回复

使用道具 举报

399#
发表于 2011-1-15 22:55:32 | 只看该作者
原帖由 zxw 于 2011-1-15 22:34 发表
哈哈,这个好。免得来计算。

对了,c大,什么时候增强一下clear?记得你好象说过,执行clear后,清除什么窗口行计数来着



好像已经修复了吧,现在的版本还会?
回复

使用道具 举报

400#
发表于 2011-1-15 23:07:20 | 只看该作者

回复 #399 chenall 的帖子

呵,那就好。免得在脚本中用pager off了。

另请教两个问题:
1.对于批处理中,%~d1%取得的设备名是用数字表达的。
本来我喜欢这种表达方式,但一般用户可能更倾向于字母表达法。
我目前用:
root + cat 命令来获取通常的字母表达法。
是否还有更简洁的获取方法?
2.calc 命令能否增强一下,结果可以取16进制值?

[ 本帖最后由 zxw 于 2011-1-16 00:56 编辑 ]
回复

使用道具 举报

401#
发表于 2011-1-16 11:42:19 | 只看该作者
原帖由 zxw 于 2011-1-15 23:07 发表
呵,那就好。免得在脚本中用pager off了。

另请教两个问题:
1.对于批处理中,%~d1%取得的设备名是用数字表达的。
本来我喜欢这种表达方式,但一般用户可能更倾向于字母表达法。
我目前用:
root + cat  ...


1.有这个必要吗?这个是程序内部处理的问题,最终用户好像没有必要管这个的吧.
在程序内部直接用数值来表示可以省去很多麻烦.

2.这个就比较不解了?还有返回十六进制的说法??也许是指CALC计算结果显示的数值吧.
目前不是已经有了吗?
回复

使用道具 举报

402#
 楼主| 发表于 2011-1-16 17:06:40 | 只看该作者
cat命令已经增加了参数--number=n,能否扩展一下--number=-n,输出倒数n个数。如-1是找到的最后一个。
现在通过locate=string 总数目可通过返回值0x4cb00得到。
通常情况下,用户需要的是第一个或最后一个结果值。
现在第一个通过--number=1已经解决,只需要最后一个,有没简单的方法?(只考虑内置命令)。
回复

使用道具 举报

403#
发表于 2011-1-16 17:40:35 | 只看该作者
@chenall

c大  有什么命令可以查找文件夹  比如类似find /boot/    现在的find还不支持

还有  什么时候能加入非连续文件直接map就好了
回复

使用道具 举报

404#
发表于 2011-1-16 17:45:28 | 只看该作者

回复 #403 sratlf 的帖子

查找文件夹,应该这样:find /boot
但不支持ud,因其是虚拟目录。
另find 目录,我实测发现,如 存在一个目录(hd0,2)/boot
实机测试,会find不到。
回复

使用道具 举报

405#
发表于 2011-1-16 17:46:34 | 只看该作者
原帖由 zhaohj 于 2011-1-16 17:06 发表
cat命令已经增加了参数--number=n,能否扩展一下--number=-n,输出倒数n个数。如-1是找到的最后一个。
现在通过locate=string 总数目可通过返回值0x4cb00得到。
通常情况下,用户需要的是第一个或最后一个结果 ...

这个好,建议添加。
回复

使用道具 举报

406#
发表于 2011-1-16 17:58:58 | 只看该作者
原帖由 zhaohj 于 2011-1-16 17:06 发表
cat命令已经增加了参数--number=n,能否扩展一下--number=-n,输出倒数n个数。如-1是找到的最后一个。
现在通过locate=string 总数目可通过返回值0x4cb00得到。
通常情况下,用户需要的是第一个或最后一个结果 ...


找最后一个你可以尝试用批处理循环来得到.
一个很简单的例子..
!BAT
cat --locate=\xec (md)0x300+1 | call :get_last
exit
:get_last
if "%1"=="" exit
shift
if "%1"=="" set last=%0
goto :get_last
回复

使用道具 举报

407#
发表于 2011-1-16 18:00:41 | 只看该作者
原帖由 sratlf 于 2011-1-16 17:40 发表
@chenall

c大  有什么命令可以查找文件夹  比如类似find /boot/    现在的find还不支持

还有  什么时候能加入非连续文件直接map就好了



因为之前find的设计是专门找文件使用的,找到文件后会尝试打开,文件夹当然是失败的了.

有空再看看可不可以改一下.

关于MAP的问题,目前就不要想了,我没有这个能力,,

[ 本帖最后由 chenall 于 2011-1-16 18:04 编辑 ]
回复

使用道具 举报

408#
发表于 2011-1-16 18:02:41 | 只看该作者
原帖由 zxw 于 2011-1-16 17:46 发表

这个好,建议添加。



添加这个功能很不划算,因为程序在还没有查找完成之前无法确定最后一个....

非要实现的话就必须缓存所有找到的内容,然后处理..太麻烦了,不划算...

还不如直接用批处理,几语句就搞定了..
回复

使用道具 举报

409#
发表于 2011-1-16 18:07:38 | 只看该作者
原帖由 zxw 于 2011-1-16 17:45 发表
查找文件夹,应该这样:find /boot
但不支持ud,因其是虚拟目录。
另find 目录,我实测发现,如 存在一个目录(hd0,2)/boot
实机测试,会find不到。



我没拿UD测试  我本身也不用UD  用cdrom测试的  找文件夹提示file not found
回复

使用道具 举报

410#
发表于 2011-1-16 18:18:05 | 只看该作者
另外关于find 目录其实目前也是可以的..
以下命令就可以找到有带/boot目录的磁盘并设置为root
find --set-root ls /boot
缺点是如果有boot1同样会被找到.

这时可以换一种写法
find --set-root ls /boot/
这样可以保证找到完全符合的..
同样的缺点,如果这个文件夹下面没有任何文件还是会失败.

具本怎么应用你们可以看着办..

实事上很多功能都可以通过一些命令的组合来实现.
回复

使用道具 举报

411#
发表于 2011-1-16 19:52:10 | 只看该作者

回复 #410 chenall 的帖子

这种组合,还真不知道。先试试。
回复

使用道具 举报

412#
 楼主| 发表于 2011-1-17 11:19:56 | 只看该作者
问C大,比如call :get_las要调用多次,
如:
!BAT
...
cat --length=%a% --locate=[ (fd1)/OEM | call :get_last
set /a b=0x%last%+1
cat --length=%a% --locate=] (fd1)/OEM | call :get_last
...

:get_last
if "%1%=="" goto :end
shift
if "%1%=="" set last=%0
goto :get_last
:end
-----------------------
上面call后无法返回到下一句,有什么办法?
需要return?
exit退出当前批处理了。
另外,我的批处理1中又调用了批处理2,如果批处理2中有exit是退出了全部批处理,而不会返回到批处理1中。

[ 本帖最后由 zhaohj 于 2011-1-17 11:53 编辑 ]
回复

使用道具 举报

413#
发表于 2011-1-17 11:53:12 | 只看该作者
  1. cat --length=%a% --locate=[ (fd1)/OEM | call :get_last
  2. set /a b=0x%last%+1
  3. cat --length=%a% --locate=] (fd1)/OEM | call :get_last
  4. ...
复制代码
注意call :get_last 后有一个空格。
或者修改为如下试试:
cat --length=%a% --locate=[ (fd1)/OEM | call :get_last %9
set /a b=0x%last%+1
cat --length=%a% --locate=] (fd1)/OEM | call :get_last %9


[ 本帖最后由 zxw 于 2011-1-19 15:45 编辑 ]
回复

使用道具 举报

414#
发表于 2011-1-17 12:04:58 | 只看该作者
原帖由 zhaohj 于 2011-1-17 11:19 发表
问C大,比如call :get_las要调用多次,
如:
!BAT
...
cat --length=%a% --locate=[ (fd1)/OEM | call :get_last
set /a b=0x%last%+1
cat --length=%a% --locate=] (fd1)/OEM | call :get_last
...
...


你试过了吗???为什么不试一下。。。

exit也不会像你说的那样,如果有加参数的exit另当别论。

[ 本帖最后由 chenall 于 2011-1-17 12:06 编辑 ]
回复

使用道具 举报

415#
 楼主| 发表于 2011-1-17 12:22:33 | 只看该作者
测试多次了
OEM2PCI.BAT:
!BAT
...
(fd2)/EXT/MAKEOEM.BAT
--------------------------
MAKEOEM.BAT
!BAT
...
cat --length=%a% --locate=[ (fd1)/OEM | call :get_last
set /a b=0x%last%+1
cat --length=%a% --locate=] (fd1)/OEM | call :get_last
...

:get_last
if "%1%=="" exit
shift
if "%1%=="" set last=%0
goto :get_last

[ 本帖最后由 zhaohj 于 2011-1-17 12:25 编辑 ]

Snap1.jpg (79.07 KB, 下载次数: 118)

Snap1.jpg
回复

使用道具 举报

416#
发表于 2011-1-17 12:25:38 | 只看该作者
那是你自己使用的问题。。。注意看提示,,参数错误,和exit一点关系也没有。

批处理里面什么时候有%1%了???
回复

使用道具 举报

417#
 楼主| 发表于 2011-1-17 12:30:23 | 只看该作者
哇,真写错了,%1写成%1%,晕
:get_last
if "%1"=="" exit
shift
if "%1"=="" set last=%0
goto :get_last

金山快盘怎么都删了?

[ 本帖最后由 zhaohj 于 2011-1-17 12:41 编辑 ]
回复

使用道具 举报

418#
发表于 2011-1-17 13:30:12 | 只看该作者
不知谁动了我的电脑,被移动了,汗。。
回复

使用道具 举报

419#
 楼主| 发表于 2011-1-17 14:09:38 | 只看该作者
cat --locate=string
string限制16个字符还真不够,另外还要区分大小写,目前看来还得使用wenv(tuxw)。

cat加强一下还是很有必要。因为目前对文本的处理cat是关键内置命令
另外cat命令只有--length=0时我想其它都是应该默认输出的。
回复

使用道具 举报

420#
发表于 2011-1-17 14:44:31 | 只看该作者
原帖由 zhaohj 于 2011-1-17 14:09 发表
cat --locate=string
string限制16个字符还真不够,另外还要区分大小写,目前看来还得使用wenv(tuxw)。

cat加强一下还是很有必要。因为目前对文本的处理cat是关键内置命令
另外cat命令只有--length=0时我 ...


复杂的情况还是用外部命令吧。内部命令只是为了方便,不会去考虑许多复杂的情况的。

cat --locate的输出上次忘了改了,,下一版再改。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-25 08:47

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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