无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: chenall
打印 上一主题 下一主题

grub4dos 外部命令 wenv [2010-10-17 ]

  [复制链接]
1021#
发表于 2010-12-14 12:26:53 | 只看该作者
没看明白,setrd没有屏幕输出,\n加在什么地方?
回复

使用道具 举报

1022#
发表于 2010-12-14 14:30:47 | 只看该作者
原帖由 tuxw 于 2010-12-14 12:26 发表
没看明白,setrd没有屏幕输出,\n加在什么地方?


呵呵,是指find后的_RD,仔细想想还是算啦,目前这样也没有问题。

下面这段:
WENV get value ]]& find -end=[ [Config.${value}] (fd1)/OEM ]]& setrd ]]] call cat (rd)+1 >> (fd1)/T.OEM
echo -n ######END######### >> (fd1)/T.OEM

当文件OEM最后段落 [Config.${value}]最后 一行没有回车换行时,setrd ]]] call cat (rd)+1竟然没输出回车换行符。
如下面128后面没回车换行
[Config.vvmscsi]
value = "", Tag, REG_DWORD, 5
value = Parameters\Device,NumberOfRequests,REG_DWORD, 128
回复

使用道具 举报

1023#
发表于 2010-12-14 15:04:43 | 只看该作者
不是竟然没有,输出的是文件原始内容,没有增减过换行
find 输出的是 STRING 和 ENDS 之间的内容
输出中间段时,一般段名前会有个换行,输出就有换行
最后一段时,ENDS实际上是文件结束符,如果文件没有换行,输出也没有换行。

加个换行倒是不麻烦,这个问题看有没有必要,因为加换行实际上改变了文件内容。
目前可以通过修改rd_size,然后用echo追加一个换行符
回复

使用道具 举报

1024#
发表于 2010-12-14 15:40:20 | 只看该作者
1.增加 getdev/setdev 命令,保存恢复引导、当前设备
2.取消 read 命令(可完全由批处理取代了)
3.dir 命令增加 -f 参数,显示文件大小


WENV  getdev  [VAR]

保存 0x8208, 0x8280, 0x829C, 0x82A0 四个32位整数值到 VAR 中。保存格式是空格分开 4 个 16 进制数。
这个保存值可以被 SETDEV 命令使用。
如未指定变量,将保存到内置变量 ?_DEV

如希望保存值生存周期比较长,尽量指定变量名。因为目前可能动态使用的变量有三个: ?_FIND, ?_RD, ?_DEV,但动态使用变量名字空间只有2个,中间可能需要使用 reset ?* 清理动态生成的内置变量


WENV  setdev  [-b] [-c]  [VAR]

从指定变量 VAR 或 内置变量 ?_DEV 恢复引导、当前设备。
-b 只恢复引导设备
-c 只恢复当前设备

======================
这么快有1个下载了,先上传的忘了打包源代码,重新上传了


[ 本帖最后由 tuxw 于 2010-12-14 15:49 编辑 ]

wenv-tuxw-2010-12-14.zip

74.18 KB, 下载次数: 143, 下载积分: 无忧币 -2

回复

使用道具 举报

1025#
发表于 2010-12-14 16:24:26 | 只看该作者
有时候希望保留全局变量,但中间使用了wenv reset,所以希望有清除(除全局变量外)的所有变量的方法。
也即除全局变量外的所有变量都清除。wenv reset -keep (boot ; curr)
或直接wenv (keep boot ; keep curr)
--------
当然编程者也可用按规律来设置变量,但为了把这个变量设置得有些意思,清除时又不添麻烦,上述也是合理的。
一般全局变量很少。

象上面的getdev,肯定要设置一个全局变量。

[ 本帖最后由 zhaohj 于 2010-12-14 16:29 编辑 ]
回复

使用道具 举报

1026#
发表于 2010-12-14 16:38:12 | 只看该作者
我在使用过程中也碰到这个问题,多个模块既可独立工作,也可相互配合工作,独立使用是reset没问题,配合使用时reset会清掉需要相互传递环境变量。目前暂时只能随用随清除,尽量少用reset全清。

这是个比较有用的需求,可以考虑一下用什么样的语法来实现这个问题。或者将60个变量分成两类,如50+10,reset -u 清掉前50个,reset 清所有,这样对set命令会有一些要求,就是如何区分一个变量是放在50中还是放在10中

================

一个折中的方案
wenv reset -keep=prefix
指前缀的变量不要清除,这样改动比较少,用户可以使用自己习惯的前缀。

[ 本帖最后由 tuxw 于 2010-12-14 16:55 编辑 ]
回复

使用道具 举报

1027#
发表于 2010-12-14 17:44:33 | 只看该作者
一个奇怪的问题,下面手动执行没有问题(以前也是执行良好):
#19
title
clear
find --set-root /SRS/_LIST.TXT || configfile (fd2)/MENUSRS.LST
FAT copy /o ()/SRS/_LIST.TXT (fd2)/_LIST
## 先清除注释行
cat --length=0 (fd2)/_LIST && WENV calc a=*0x8290
map --rd-base=0xF00000
WENV call map --rd-size=${a}
WENV for /f "eol=# delims=;" %i in ( (fd2)/_LIST ) do (set a=$u,%i  ; check "\"<-"$${a}" set a=$${a!\=/}  ; check "$${a:-1}"<>"/" set a=$${a}/ ; echo $${a})  > (rd)+1
FAT copy /o (rd)+1 (fd2)/_LIST
WENV reset a
cat --locate=// (fd2)/_LIST | WENV set -t a=
WENV get a || configfile (fd2)/ERROR.LST
map --rd-base=0xF00000
map --rd-size=2048
echo color white/blue blue/yellow light-red/blue 10 > (rd)+1
echo default 2 >> (rd)+1
echo timeout 50 >> (rd)+1
echo title ==== Please Choose S&R&S Drivers Directory ==== >> (rd)+1
echo clear  >> (rd)+1
echo title  >> (rd)+1
echo clear  >> (rd)+1
WENV for /f "eol=# delims=;" %i in ( (fd2)/_LIST ) do (set a=%i ; echo title $${a:1} ; echo clear ; echo WENV set srspath=$${a:1} ; echo configfile (fd2)/LIST.LST) >> (rd)+1
clear && configfile (rd)+1

在菜单中执行,变量a消失了

_list.txt
#保证此文件放在/SRS目录下,所有驱动目录以//开头,否则...;大小写也无关。
# SRSID格式驱动
//SRS/SRSID
# SIF格式驱动
//SRS/SIF/
# F6格式OEM驱动
//SRS/OEM
# INTEL芯片组1
//SRS/INTEL/ich4-6/
# INTEL芯片组2
//SRS/INTEL/ich7-9/
# INTEL芯片组3
//SRS/INTEL/ich10/
# VIA芯片组
//SRS/VIA
# INTEL芯片组
//SRS/ATI

[ 本帖最后由 zhaohj 于 2010-12-14 18:07 编辑 ]

Snap1.jpg (92.33 KB, 下载次数: 126)

Snap1.jpg

Snap2.jpg (18.03 KB, 下载次数: 111)

Snap2.jpg
回复

使用道具 举报

1028#
发表于 2010-12-14 18:22:27 | 只看该作者
蓝色部分改成下面就通过了:
WENV find // (fd2)/_LIST || configfile (fd2)/ERROR.LST

发现使用12-14的WENV又没有问题了,看来12-13的wenv有问题

[ 本帖最后由 zhaohj 于 2010-12-14 18:24 编辑 ]
回复

使用道具 举报

1029#
发表于 2010-12-14 21:22:03 | 只看该作者
原帖由 zhaohj 于 2010-12-14 18:22 发表
蓝色部分改成下面就通过了:
WENV find // (fd2)/_LIST || configfile (fd2)/ERROR.LST

发现使用12-14的WENV又没有问题了,看来12-13的wenv有问题


12-13 修改没动过set命令,有可能是debug状态0时cat没有输出,管道后面相当于 wenv set a=


1.reset增加参数
2.用户变量59个,内置变量5个

WENV reset [-k[=prefix]]

WENV reset -k,     保留内置变量,清除用户变量
WENV rseet -k=abc, 保留内置变量和abc打头的用户变量
-k 不能与 -s 同时使用

现在3个内置变量 ?_DEV, ?_RD, ?_FIND 可以当全局变量用

======================
修复可 reset 两个固定内置变量的BUG,附件已更新

[ 本帖最后由 tuxw 于 2010-12-14 22:06 编辑 ]

wenv-tuxw-2010-12-14.zip

74.57 KB, 下载次数: 428, 下载积分: 无忧币 -2

回复

使用道具 举报

1030#
发表于 2010-12-14 23:10:33 | 只看该作者
“-k 不能与 -s 同时使用”,-s代表什么?
回复

使用道具 举报

1031#
发表于 2010-12-14 23:37:47 | 只看该作者
-s 复位同时预置开关状态
回复

使用道具 举报

1032#
发表于 2010-12-15 10:32:09 | 只看该作者
请教  WENV set tmp=$input,Enter path to the .VHD (default: /boot/boot.VHD):
怎么加个时间限制  如果2秒钟内没有按键则自动回车
回复

使用道具 举报

1033#
发表于 2010-12-15 12:49:45 | 只看该作者
原帖由 xiaoy 于 2010-12-15 10:32 发表
请教  WENV set tmp=$input,Enter path to the .VHD (default: /boot/boot.VHD):
怎么加个时间限制  如果2秒钟内没有按键则自动回车


目前WENV不能实现这个要求,需要grub4dos支持才行,因为键盘输入是调用grub4dos的接口实现的。
如果只输入一个字符,可以通过pause实现,现在pause支持返回按键值了。
回复

使用道具 举报

1034#
发表于 2010-12-16 21:00:07 | 只看该作者
修复 calc *ADDR>>/<< bug
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=23#pid2113044

wenv-tuxw-2010-12-16.zip

75.43 KB, 下载次数: 207, 下载积分: 无忧币 -2

回复

使用道具 举报

1035#
发表于 2010-12-16 21:40:12 | 只看该作者
批处理中%字符截取还有问题,见下图,grldr及wenv版本测试最新的好几个。wenv包括chenall的11-29、tuxw的最近的几个版本。命令行测试没有问题。再以前的有无问题未测试过。…^_^


[ 本帖最后由 zxw 于 2010-12-16 21:45 编辑 ]
回复

使用道具 举报

1036#
发表于 2010-12-16 22:00:00 | 只看该作者
批处理会将2个%处理成一个,只能在批处理里多写几个%
回复

使用道具 举报

1037#
发表于 2010-12-16 22:06:28 | 只看该作者

回复 #1036 tuxw 的帖子

批处理中确实有这个处理方式,应该鉴别处理一下,以免用户误解。
回复

使用道具 举报

1038#
发表于 2010-12-16 22:13:57 | 只看该作者
这个问题应该由grldr处理,不要将非参数的%%替换成%。
wenv是无能为力的,因为执行命令时命令行已经被grldr替换过了,wenv不可能猜测用户的原始命令再将%再替换成%%,那样会引出更多的问题,如何知道用户需要的两个%还是截取操作符呢?

其实这个问题是win cmd遗留下来的BUG,被grldr继承了,目前只能按cmd的习惯,批处理中双写%

[ 本帖最后由 tuxw 于 2010-12-16 22:19 编辑 ]
回复

使用道具 举报

1039#
发表于 2010-12-16 22:30:56 | 只看该作者
谢谢tuxw,问题已解决。
回复

使用道具 举报

1040#
 楼主| 发表于 2010-12-17 00:32:45 | 只看该作者
原帖由 tuxw 于 2010-12-16 22:13 发表
这个问题应该由grldr处理,不要将非参数的%%替换成%。
wenv是无能为力的,因为执行命令时命令行已经被grldr替换过了,wenv不可能猜测用户的原始命令再将%再替换成%%,那样会引出更多的问题,如何知道用户需要的 ...


呵呵,GRLDR的批处理同样不可能正确猜测用户的命令行%n到底是应该替换成参数呢,还是不替换.
虽然可以做到不符合参数条件的不处理,但因为这个参数条件是多样的.处理起来很麻烦.
符合条件的字符组合.
%,0-9,d,p,n,x,~

为了避免意外,还是由用户去处理.
程序不是万能的,但用户是万能的,所以把这个问题丢给用户去处理是最完美的.

如果要在批处理中使用%,除非明确它是一个批处理参数,否则最好是换成%%.
回复

使用道具 举报

1041#
发表于 2010-12-17 09:59:12 | 只看该作者
原帖由 chenall 于 2010-12-17 00:32 发表

呵呵,GRLDR的批处理同样不可能正确猜测用户的命令行%n到底是应该替换成参数呢,还是不替换.
虽然可以做到不符合参数条件的不处理,但因为这个参数条件是多样的.处理起来很麻烦.
符合条件的字符组合.
%,0-9 ...


噢,我对批处理参数的了解一直停留在 %0-%9,什么时候已经扩展了 dpnx~ 这些截取特性?如果是这样的话,确实不好判断

有没有可能只处理偶数个的%%?这样WENV有可能将它再替换回去,目前这样不行,因为命令行里的%%被grldr替换前有可能是3个也有可能是4个,wenv不能还原它。还有一点,WENV如何识别当前的命令是在批处理中运行的?

[ 本帖最后由 tuxw 于 2010-12-17 10:03 编辑 ]
回复

使用道具 举报

1042#
 楼主| 发表于 2010-12-17 13:07:34 | 只看该作者
/* The flags for the builtins.  */
#define BUILTIN_CMDLINE                0x1        /* Run in the command-line.  */
#define BUILTIN_MENU                        (1 << 1)/* Run in the menu.  */
#define BUILTIN_TITLE                (1 << 2)        /* Only for the command title.  */
#define BUILTIN_SCRIPT                (1 << 3)/* Run in the script.  */
#define BUILTIN_NO_ECHO                (1 << 4)        /* Don't print command on booting. */
#define BUILTIN_HELP_LIST        (1 << 5)/* Show help in listing.  */
#define BUILTIN_BOOTING                (1 << 6)        /* The command is boot-sensitive.  */
#define BUILTIN_BAT_SCRIPT        (1 << 7)
#define BUILTIN_USER_PROG        (1 << 8)

if (flags & BUILTIN_BAT_SCRIPT)
目前是在运行批处理
回复

使用道具 举报

1043#
发表于 2010-12-18 09:54:27 | 只看该作者
call 传递参数是否改进一下?
将完整路径设置为变量再传递就不正常了。



[ 本帖最后由 zxw 于 2010-12-18 09:55 编辑 ]
回复

使用道具 举报

1044#
 楼主| 发表于 2010-12-18 11:17:48 | 只看该作者
这不是call的问题..

注意GRUB4DOS批处理里面的CALL和WENV的CALL不要混在一起.

想要使用变量就必需用wenv

你可以试试

wenv call call :test ${a}
回复

使用道具 举报

1045#
发表于 2010-12-18 11:38:48 | 只看该作者

回复 #1044 chenall 的帖子

晕,我一再提醒自己要注意“批处理里面的CALL和WENV的CALL不要混在一起.”
这几天弄个批处理,被这个搞晕了。

谢谢指点,问题解决。
回复

使用道具 举报

1046#
发表于 2010-12-22 23:34:27 | 只看该作者

感谢无忧

无忧的楼主们辛苦了,我不材,来这里学了不了东西。和自己说加油!
回复

使用道具 举报

1047#
发表于 2010-12-23 09:26:28 | 只看该作者
@chenall、tuxw:
WENV calc 的运算符中&, |, ^分别是什么意思?

[ 本帖最后由 zxw 于 2010-12-23 09:36 编辑 ]
回复

使用道具 举报

1048#
发表于 2010-12-23 10:02:15 | 只看该作者
1.  &  位与符    如 0&1=0
2.  |   位或符    如 0|1=1
3. ^  位异或符  如 0^1=1
回复

使用道具 举报

1049#
发表于 2010-12-23 10:10:58 | 只看该作者

回复 #1048 zhaohj 的帖子

明白了,谢谢。
原来是c语言运算符的风格。
回复

使用道具 举报

1050#
发表于 2011-1-1 00:18:31 | 只看该作者
@tuxw  chenall

WENV dir 命令是否有点问题  显示非8.3命名的文件名时会显示两次  见图

e.jpg (17.79 KB, 下载次数: 132)

e.jpg
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-1 15:07

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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