无忧启动论坛

标题: 请教:关于G4D搜索文件的问题 [打印本页]

作者: mygamexxx    时间: 2011-8-11 21:41
标题: 请教:关于G4D搜索文件的问题
想搜索硬盘上的.gho后缀的文件,由于功力有限,看C大的现成的QGHO的批处理看的一头雾水。不知有没有G4D的全盘搜索列出指定后缀名文件的简易的命令行或批处理。
请教各位大大如何简单实现(只要搜索两层子目录就满意了)。

[ 本帖最后由 mygamexxx 于 2011-8-12 17:26 编辑 ]
作者: chenall    时间: 2011-8-11 22:15
我明天再把qgho里面搜gho的代码提出来,像硬盘分区列表菜单那样整成一个可以调用的模块。
作者: mygamexxx    时间: 2011-8-11 22:22
标题: 回复 #2 chenall 的帖子
有劳C大了,最好可以让我能直接抄袭一下,就可以用的。嘻嘻,菜鸟的心思!!
下面的链接是我抄袭C大的作品加工的,能指点一下存在的问题吗?
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=194499&extra=page%3D1

[ 本帖最后由 mygamexxx 于 2011-8-11 22:24 编辑 ]
作者: chenall    时间: 2011-8-12 13:37
本模块是一个grub4dos的批处理,
可用于搜索N级目录下的指定类型文件,并显示于菜单上
这是一个通用模块,可以通过参数直接调用或者通过预先设置变量的方法再调用,
使用方法请参考本站另一贴子
[原创] GRUB4DOS 通用模块之分区选择

本模块支持的参数如下
以下是使用的效果截图,欢迎反馈BUG或建议.









复制源代码请点这里
http://fayaa.com/code/view/21739/raw/




转载自:chenall's blog

本文链接地址: [原创] GRUB4DOS 通用模块之文件选择模块

[ 本帖最后由 chenall 于 2011-8-12 13:39 编辑 ]
作者: chenall    时间: 2011-8-12 13:41
标题: 回复 #3 mygamexxx 的帖子
看了一下,没有发现什么问题,不错的想法,准备在下一版本的QGHO中加入处理0备份失败的问题.

在主界面也加入判断.
作者: mygamexxx    时间: 2011-8-12 17:26
太棒了,用着很好。
作者: scxiegangxy    时间: 2011-8-15 15:55
标题: 终于实现了梦寐以求的超级搜索!谢谢
该批处理终于实现了我梦寐以求的g4d超级搜索!我已将源码复制另存并命名为SuperFinder。谢谢C大的辛勤工作于我等菜鸟!!
一点小建议:建议支持搜索无扩展名文件,同时此模块能供wee使用。我的想法是这样的:1.硬盘中有很多个grldr(内置菜单可能不同),可以选择启动;2.在BIOS中装入wee后,即使硬盘中不知grldr放哪里了,也能搜索找到并启动之。目前能使用SuperFinder的前提条件是已经启动并进入了一个grldr环境,有时粗心的我们将硬盘mbr改为了g4d引导,但在重装系统或其它操作中竟然将grldr格式化掉了或放在文件夹中了,导致启动时出现“can not find grldr”,只得又进入pe复制一份进去,而通常我们硬盘上的grldr肯定不止一份,只是不在根目录或默认目录下而已!!
再次谢谢C大。
作者: chenall    时间: 2011-8-15 16:41
现在的版本对于一般的应用是没有问题.

因为目前GRUB4DOS下没有办法快速确认这是一个文件或目录.

所以会有一些问题,比如有可能把一个带扩展名的目录显示到菜单上.
作者: chenall    时间: 2011-8-15 16:43
标题: 回复 #7 scxiegangxy 的帖子
要支持无扩展名也行,但是处理的速度会慢一些,因为需要确定这是否一个文件(原因上面已经说过了)
要想支持wee那可没有那么简单.
作者: scxiegangxy    时间: 2011-8-16 09:23
感谢c大的耐心解答。很多时候,系统的默认引导文件都是一些不带扩展名的文件,如ntldr,peldr,grld和很多pe等,因此支持无扩展名有必要(grldr搜索文件慢总比找不到启动文件好,虽然实际上我们在grldr环境下都知道常用的引导文件的位置和名称,但启动一些专门的引导文件可能位置不容易记住。当然自定义grldr扩展名也很方便,但我十分倾向于不要动系统的默认引导文件,包括更名,这样通用性要好一些)。让wee支持既然暂有难度,那能否辛苦c大满足前述第一愿望。
谢谢c大。grub4dos有你而精彩!!
作者: chenall    时间: 2011-8-16 13:58
OK,新的版本已经更新,暂时没有发现问题。

2011-08-16 更新:(新的版本处理的速度会慢一些,但精确度比较高,之前的版本会把带扩展名的目录当成文件显示在菜单上)
作者: zxw    时间: 2011-8-16 15:56
标题: 回复 #11 chenall 的帖子
新的版本使用cat –locate=0来检测是否一个文件
===============================
对于ntfs分区的文件夹,这个检测不准确。
=========================================
我的run模块,也是纠结这个问题。期待c大完善。

[ 本帖最后由 zxw 于 2011-8-16 16:06 编辑 ]
作者: chenall    时间: 2011-8-16 16:24
标题: 回复 #12 zxw 的帖子
这个好像影响不大,0字节我们不考虑,

不管它是文件还是目录都无所谓了.
作者: zxw    时间: 2011-8-16 17:11
find %m.devs% call :生成文件列表
这里是否笔误?
作者: tingyue-wu    时间: 2011-8-16 17:54
菜单中是怎么调用的?
比如批处理文件命名M
是不是这样写
tittle 搜索硬盘上所有gho后缀的文件
M CMD=ECHO EXT=.GHO DEVS="--DEVICES=H"  RETURN=configfile (md)4+8

是不是这样呀?
作者: chenall    时间: 2011-8-16 19:03
标题: 回复 #14 zxw 的帖子
这个没错,因为偷懒了,直接让devs参数作为FIND的参数。
这样子使用起来就很灵活,比如你可以指定查找存在某个文件的磁盘,例:

devs="--devices=h /boot/grldr"

这样就只有存在/boot/grldr文件的磁盘才会被查找。其实find命令是非常灵活的。

没有指定devs参数时就只会查找当前root下的文件,如果有指定了root,则查找root下的文件。


@tingyue-wu

1.所有的参数都是小写的。
2.return参数后面有带空格需要用用半角的引号否则会传递错误。

其它的自己看例子就知了。

[ 本帖最后由 chenall 于 2011-8-16 19:09 编辑 ]
作者: tingyue-wu    时间: 2011-8-16 19:35
标题: 回复 #16 chenall 的帖子
cmd=后面可以使用多个参数,以及使用&&和||吗?

另外发现title=后面的标题内容不能像默认标题一样居中显示,而是处于左边,

目前只是用这个来灵活搜索文件,为一时记不住文件位置起到提示作用
暂时还想不出有什么更好的应用,主要是我对其它命令不熟悉的原因。
直觉上认为cmd=后面跟的参数将会使这个模块的作用得到很大发挥。
还有用set变量也可以发挥更大作用,如set TT=SEE cmd=echo ext=.gho subdir=2 devs="--devices=h" root=(hd0,0)/ABC return=configfile (md)4+8
只是不知道怎么用。

title  20  搜索文件并列出菜单 \n   利用外置命令SEE查找所有硬盘,并根据输入的条件自动生成菜单
clear
echo >输入待搜索后缀名,(点+后缀),如.gho 注:只输入.表示搜索无后缀文件
echo >搜索多种后缀,用" "并空格隔开,即搜索.ISO和.GHO要输".ISO .GHO"
echo >不需要路径,最好注意大小写,默认(回车)输入.GHO
set name= && set /p name=>input:
if not exist name set name=.GHO && echo Now use .GHO as default.
if not exist name set name=.GHO || echo [已设定搜索%name%后缀文件]
echo
echo >输入待搜索文件所在位置的已知文件名,如FONTS,将只搜索含FONT文件的磁盘
echo >需输入空格+路径,格式[空格]/[PATH]/[file],默认(回车)忽略此项条件
set luyin= && set /p luyin=>input:
if not exist luyin set luyin= && echo Now use 忽略 as default.
if not exist luyin set luyin= || echo [已设定只搜索含有%luyin%文件的分区]
echo
echo >搜索将从XX分区XX文件夹开始。格式(hd0,0)/ABC/BCD
echo >可不输入分区,但()/不能少,表示从当前分区开始搜索(回车默认)
set fenqu= && set /p fenqu=>input:
if not exist fenqu set fenqu=()/ && echo Now use ()/ as default.
if not exist fenqu set fenqu=()/ || echo [已设定从%fenqu%开始搜索]
echo
echo >将搜索几层目录?请输入数字,如输入5,搜索即5层目录
echo >默认(回车)只搜索2层目录,建议甭搜索太深,较慢
set numeral= && set /p numeral=>input:
if not exist numeral set numeral=2 && echo Now use 2 as default.
if not exist numeral set numeral=2 || echo [已设定搜索%numeral%层目录]
command SEE cmd=echo ext=%name% subdir=%numeral% devs="--devices=h%luyin%" root=%fenqu% title=列出%name%文件菜单 return="configfile (md)4+8"

[ 本帖最后由 tingyue-wu 于 2011-8-17 08:08 编辑 ]
作者: zxw    时间: 2011-8-17 08:35
标题: 回复 #16 chenall 的帖子
让devs参数作为FIND的参数,这个我知道没错。
  1. find %m.devs% call :生成文件列表
复制代码
我是指:find %m.devs% 与 call :生成文件列表这样组合会出错。
当然,你写成:
  1. find %m.devs% call :生成文件列表 || echo Unknow Error.
复制代码
"call :生成文件列表"这一句并没有真正执行。
m.devs的值默认为--set-root时,下面简单还原出错:



[ 本帖最后由 zxw 于 2011-8-17 08:43 编辑 ]
作者: chenall    时间: 2011-8-17 09:06
标题: 回复 #17 tingyue-wu 的帖子
1.关于标题居中的问题.
以后再改进...

2.CMD的参数,目前只是简单的把文件路径作为参数附加在指定的CMD后面.应付一般的应用,
如果你的应用比较复杂,可以考虑用批处理来取得这个参数.
以后也许会改进,可以指定参数的位置,这样会灵活.一些.
作者: chenall    时间: 2011-8-17 09:12
标题: 回复 #18 zxw 的帖子
这个没有错,这一句调用 :生成文件列表 时不需要任何参数,默认当前root

使用find时会自动设定root为当前find的磁盘.

你上面的错误其实并不是find命令的错,而是你写错了命令
if "%1"="" exit
当然了这个例子"%1"永远都是空的.所以后面的命令不会被执行.
作者: mygamexxx    时间: 2011-8-17 09:38
查找无扩展名的文件,比如当前根下查找文件名为ABC的文件,应如何设定参数?
作者: chenall    时间: 2011-8-17 09:43
标题: 回复 #21 mygamexxx 的帖子
???
是要查有包括abc文件的磁盘还是只要ABC文件.

如果是只要ABC文件,目前没有办法.
作者: tingyue-wu    时间: 2011-8-17 10:15
标题: 回复 #21 mygamexxx 的帖子
直接查找某文件是无效的,abc也好,abc.d也好,只能查找.+后缀名
作者: mygamexxx    时间: 2011-8-17 15:21
我所说的是文件名中包含ABC的无扩展名文件,那就是目前无法实现,明白了。谢谢!!!相当于用通配符查找文件名中包含ABC的无扩展名文件的位置。
因为11楼的第3点:新的ext参数只查找无扩展名的文件.如下,会查找无扩展名的文件.
让我的理解产生问题,以为可以对无扩展名的指定文件名进行。应该是理解为会查找所有无扩展名的任意名称的文件,无法指定文件名。

[ 本帖最后由 mygamexxx 于 2011-8-17 15:27 编辑 ]
作者: tingyue-wu    时间: 2011-8-17 19:10
标题: 回复 #22 chenall 的帖子
又发现一个bug

我查找无扩展名文件,查到63个

然后发现上下方向键只能在1-62个菜单间切换 第63个无法选中,用左右方向键才能选中

另外设定的返回命令菜单也不显示了。

估计有两个可能1、保存菜单的内存不够导致显示不全 2、批处理问题,超出一屏或两屏就会不显示返回菜单
作者: chenall    时间: 2011-8-21 08:25
自动生成的菜单默认情况下只有16个扇区的空间,8KB.
超过的就被截断了.
解决办法,如果你的菜单数量比较多,可以自定义菜单.加上参数
menu=菜单文件的位置.

比如
menu=(fd0)/file.lst

注:菜单文件必须是已经存在的,并且有足够的空间,已经被初始化.因为是直接使用>>写入菜单的.

如果你想直接使用内存地址也可以类似这样(就有10KB了)
echo > (md)0x200+20
再指定menu=(md)0x200+20
作者: tingyue-wu    时间: 2011-8-21 10:23
标题: 回复 #26 chenall 的帖子
我直接修改批处理也可以吧
set m.menu=(md)0x210+16 && echo -e default 1\ndebug off > (md)0x210+16

set m.menu=(md)0x200+20 && echo -e default 1\ndebug off > (md)0x200+20

已改 可以

只是和我前面的一个写入内存的菜单(md)0x200+16混淆了。又改了回来,呵

[ 本帖最后由 tingyue-wu 于 2011-8-21 10:35 编辑 ]
作者: chenall    时间: 2011-8-21 11:09
直接改批处理当然也可以了,但是使用参数的更灵活.

你可以在你的菜单前面加上一些东西,再调用,这样最终的菜单就会有你想要的东西.

下午有时间的话会更新完善一下.
作者: chenall    时间: 2011-8-21 12:28
再次更新了一下.如果没有什么问题,代码将不再变动.

新的版本cmd参数变化比较大,需要注意.



2011-08-21 (变化比较大,请注意看更新说明,新的版本使用起来更加灵活.)
[原创] GRUB4DOS 通用模块之文件选择模块[2011-08-21 更新]
作者: tingyue-wu    时间: 2011-8-21 20:51
标题: 回复 #29 chenall 的帖子
filpre参数 和ext一样支持 多种前缀吗?用""和空格来表示?

这个前缀是点(.)前面的完整前缀,还是只要前缀中包含的一个符号或者首个符号就行?(经测试 原来就是首个字符)

经测试 换了新的批处理文件,什么文件也搜不到(有前缀参数但是不输入内容,即忽略),也不显示返回菜单,设置的标题也没有(还是显示默认的)

如果只输入前缀,忽略后缀,结果同上

如果输入前缀w  后缀.iso  只能找到分区根目录上的一个wuyou.iso  但是二级目录的wxrs.iso就找不到了。

[ 本帖最后由 tingyue-wu 于 2011-8-21 21:37 编辑 ]
作者: chenall    时间: 2011-8-21 21:43
注意看说明
1.前辍只支持单级目录。

2.前辍就是文件名的开头部份字符(ls /filepre),和扩展名没有关系。

3.空的参数必须是""否则会出错。例子filpre="",你不可以直接filpre= 这个语法是错误的。

4.前辍只支持一个,不像EXT参数一像支持多个。

比如你可以指定前辍ABC

则就会列出指定ROOT目录下以ABC开头的符合条件的文件。

这个前辍的功能实现了前面mygamexxx 所提到的功能

原帖由 mygamexxx 于 2011-8-17 09:38 发表
查找无扩展名的文件,比如当前根下查找文件名为ABC的文件,应如何设定参数?


使用新版就可以实现参数如下

ext=. filpre=ABC root=()/ cmd="echo %1"

查找当前根目录()/下以ABC开头的无扩展名的文件。


再次提醒:请注意新版cmd参数的变化.

[ 本帖最后由 chenall 于 2011-8-21 21:46 编辑 ]
作者: tingyue-wu    时间: 2011-8-21 23:15
明白了 已经搞定  空的参数要"" 这个一直没注意 因为之前没有遇到过出错。学习了

另外我觉得filpre只支持单级目录的话 有点浪费
单级目录中出现同一个前缀的还是比较少的 关键是多级目录才容易被记错

所以建议filpre参数和subdir应该结合起来。


if exist m.filpre && set m.subdir=1改成if not exist m.filpre && set m.filpre="" 或删除

后发现可以检测多级目录了,但是路径也必须是 符合输入的前缀的 比如输入w 会列出以w开头的路径中w开头的文件,不是想要的效果(呵呵 不会改)

估计是还要改:生成文件列表 这个标签中的内容。

[ 本帖最后由 tingyue-wu 于 2011-8-22 08:55 编辑 ]
作者: chenall    时间: 2011-8-22 15:17
有需要的话下次再改一下.
作者: chenall    时间: 2011-8-22 20:14
最后的更新....

[原创] GRUB4DOS 通用模块之文件选择模块[2011-08-22 更新]


2011-08-22 (最终版)
作者: tingyue-wu    时间: 2011-8-22 20:30
支持更新 chenall真是勤快呀 十分感激 这是我们广大坛友的福音
作者: mygamexxx    时间: 2011-8-23 08:37
使用正常,呵呵,只是有一个问题,filpre= ext=.gho参数找不到文件,是否应该设定为查找所有.gho文件。filpre=c ext=.gho可以找到文件名c开头的.gho文件。

[ 本帖最后由 mygamexxx 于 2011-8-23 08:58 编辑 ]
作者: tingyue-wu    时间: 2011-8-23 09:13
标题: 回复 #36 mygamexxx 的帖子
filpre= ext=.gho 要写成filpre="" ext=.gho  参数空要用""才行 不然出错 之前我也遇到过
作者: mygamexxx    时间: 2011-8-23 09:21
谢谢,确实如此。接近完美。

[ 本帖最后由 mygamexxx 于 2011-8-23 09:25 编辑 ]
作者: mygamexxx    时间: 2011-8-23 09:50
自动生成的菜单是什么格式的,是否是UTF-8格式,如果要用UNIFONT显示搜索到的中文文件,应该怎么做。

[ 本帖最后由 mygamexxx 于 2011-8-23 10:46 编辑 ]
作者: chenall    时间: 2011-8-23 11:45
你可以试试加载UNIFONT字体看看能不能显示中文。理论上是可以的。
作者: chenall    时间: 2011-8-23 11:46
空的参数要么就不要写,要么就=""

这两个的效果的一样的,建议空的参数就不要加上去了。
作者: tingyue-wu    时间: 2011-8-23 11:47
标题: 回复 #39 mygamexxx 的帖子
可以显示中文的
作者: mygamexxx    时间: 2011-8-23 13:51
标题: 回复 #42 tingyue-wu 的帖子
如何显示,我写入加载UNIFONT的句子,无法显示中文。
::自动生成菜单
set ?_n=1
set m.info=File list menu for grub4dos by chenall.\n\t\t for more information please visit

http://chenall.net
if exist m.init && echo %m.init% >> %m.menu%
echo /boot/grub/unifont /boot/grub/U16.bin >> %m.menu%
echo title %title% %m.title% %title%\n\n\t%m.info% >> %m.menu%
echo pause %m.info% >> %m.menu%
echo -e $[0106] %m.info%
echo $[0102] Please wait ...
echo $[1105] Working......
root %m.root%

没办法,只好用gfxmenu,能显示中文。
echo gfxmenu /boot/grub/message1 >> %m.menu%

[ 本帖最后由 mygamexxx 于 2011-8-23 13:53 编辑 ]
作者: tingyue-wu    时间: 2011-8-23 14:53
我没改批处理文件 只是菜单里用了
unifont ()/BOOT/GRUB/FONTS

然后调用批处理 搜索出来的文件就是显示中文的
作者: mygamexxx    时间: 2011-8-23 15:06
标题: 回复 #44 tingyue-wu 的帖子
请发个你的UNIFONT 和FONTS,我试一下,难道我下载的有问题?
作者: tingyue-wu    时间: 2011-8-23 15:15
批处理保存编码是ansi格式吗?

我的字体文件是这里下载的http://bbs.wuyou.net/forum.php?mod=viewthread&tid=183722&extra=page%3D1

[ 本帖最后由 tingyue-wu 于 2011-8-23 15:17 编辑 ]
作者: mygamexxx    时间: 2011-8-23 15:18
原来UNIFONT下载的是旧版本,使用新版本正常。
作者: mygamexxx    时间: 2011-8-23 20:14
请教C大,grldr 的主菜单(比如menu.lst)调用一个批处理(比如1.bat)显示一个界面,该批处理使用的是VFONT显示中文,保存格式为ANSI。该批处理调用搜索文件的批处理(比如2.bat),搜索文件的批处理使用UNIFONT加载中文字体,返回主菜单时卸载,保存格式为UTF-8。搜索批处理返回的参数为返回主菜单使用configfile /menu.lst无法显示1.bat中设定的界面(可以确定加载了主菜单文件,只是无显示)。使用chainloader /grldr 可以显示1.bat中设定的界面。是什么原因?

[ 本帖最后由 mygamexxx 于 2011-8-23 20:19 编辑 ]
作者: chenall    时间: 2011-8-23 20:44
标题: 回复 #48 mygamexxx 的帖子
只要加载了字体就会进入图形模式,(卸载字体后还是在图形模式下)

而VFONT只能在控制台下才可以使用.

你可以注意看一下界面上的显示就知道了,一般情况下图形模式显示的速度会比较慢.

解决办法很简单,如果你的菜单需要使用VFONT则在加载VFONT之前加一句
terminal console
作者: mygamexxx    时间: 2011-8-28 20:25
c大,你的程序很好,但是无法搜索带点畸形目录下的.gho文件(比如cmd 下用md \back..\创建的目录),不知是否能支持。

[ 本帖最后由 mygamexxx 于 2011-8-28 20:27 编辑 ]
作者: chenall    时间: 2011-8-28 20:53
标题: 回复 #50 mygamexxx 的帖子
m.cmd       指定每个菜单要执行的命令  ( 必须的其它的都是可选参数.)
m.title        指定菜单标题
m.return    指定返回命令
m.menu     指定菜单位置(默认使用(md)0×210+16来存放菜单)
m.subdir    指定要查找的目录级数,默认1
m.devs      指定要查找的设备(find的参数)
m.init         指定菜单的初始化命令
m.ext         指定扩展名(用于过滤),多个扩展名用双引号每个扩展名之间用空格分隔
                 例: ext=".gho .txt"
m.root       指定根目录.(第一个被检查的目录)比如(hd0,4)/boot/或(hd0,5)
     注:该参数和m.devs参数配合使用时,将会只查找以上路径下的文件.例子:
     指定m.root=(hd0,4)/boot 或 /boot
     则,只会查找符合条件的磁盘/BOOT目录下的文件.
m.dirext     是否检测带扩展名的目录,设为任意值即启用,默认禁用,
                 除非有必要,否则不建议使用,启动这个参数会使得检测的速度变得很慢.
m.filpre   指定文件名前辍,过滤非以filpre参数开头的文件.(测试)
                 

加dirext参数试试,dirext=1
作者: mygamexxx    时间: 2011-8-28 21:17
标题: 回复 #51 chenall 的帖子
原来是我不会用,问题解决。谢谢C大!!!

[ 本帖最后由 mygamexxx 于 2011-8-28 21:27 编辑 ]




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3