无忧启动论坛

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

[求助] 关于grub2的两个问题【问题已解决】

[复制链接]
跳转到指定楼层
1#
发表于 2020-4-8 16:54:11 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 青青草 于 2020-4-17 21:27 编辑

1、如果wim的文件名含有空格,利用正则表达式如何获取其文件名?
2、若要查找任意磁盘任意层次目录下wim文件,应如何书写脚本?
请高手们不吝赐教!
谢谢!
37#
 楼主| 发表于 2020-4-17 21:28:31 | 只看该作者
wintoflash 发表于 2020-4-17 18:58
注意加引号 或者 反斜杠转义。
wimboot @:boot.wim:(hd0,1)/abcd/test.wim
wimboot @:boot.wim:(hd0,1) ...

谢谢!问题已解决。
回复

使用道具 举报

36#
 楼主| 发表于 2020-4-17 21:25:32 | 只看该作者
my9823 发表于 2020-4-17 19:32
对正则表达式不是很懂,你看能不这样:
例如:(hd1.msdos2)/a/b/c/d/a b c.wim
能不能用正则获取文件名 ...

改成这样就可以了:
                for file in (${device})/X64/*; do                    
                      test -f ${file};                  
                   regexp -s filename ".*/(.*)" "${file}"
                   regexp -s ext_name '.*\.(.*)' "${file}"
                   regexp --set=name '^.*\/(.*)\..*$' "${file}";      
                        if regexp '^[wW][iI][mM]$' "${ext_name}"; then                    
                      funcGetSequence;  
                            menuentry "启动 ${name} (${device})" "${device}" "${filename}" {
                              set root=$2;
                              set filename_this="$3"
                              loopback wimboot (memdisk)/boot/grub/wimboot.gz
                              wimboot @:boot.wim:(${root})/X64/"${filename_this}" @:bootmgfw.efi:(wimboot)/bootmgfw.efi @:bcd:(wimboot)/bcd               @:boot.sdi:(wimboot)/boot.sdi
                      }
              ... ...
回复

使用道具 举报

35#
发表于 2020-4-17 19:32:05 | 只看该作者
对正则表达式不是很懂,你看能不这样:
例如:(hd1.msdos2)/a/b/c/d/a b c.wim
能不能用正则获取文件名a b c到一个变量filename,再把这个变量的空格替换成\,
前边的路径获取变量filepath,
扩展名ext_name变量,
然后组合成文件名在启动呢?

点评

改成这样就可以了: for file in (${device})/X64/*; do test -f ${file}; regexp -s filename ".*/(.*)" "${  详情 回复 发表于 2020-4-17 21:25
回复

使用道具 举报

34#
发表于 2020-4-17 18:58:20 | 只看该作者
青青草 发表于 2020-4-17 15:27
W大,你好!
再次请教一下:
               

注意加引号 或者 反斜杠转义。
wimboot @:boot.wim:(hd0,1)/abcd/test.wim
wimboot @:boot.wim:(hd0,1)/abcd/filename\ space.wim
wimboot "@:boot.wim:(hd0,1)/abcd/filename space.wim"

点评

谢谢!问题已解决。  详情 回复 发表于 2020-4-17 21:28
回复

使用道具 举报

33#
 楼主| 发表于 2020-4-17 15:41:58 | 只看该作者
江南一根葱 发表于 2020-4-17 15:34
一直好奇这个mane是啥

打错了,是name
回复

使用道具 举报

32#
发表于 2020-4-17 15:34:32 | 只看该作者
一直好奇这个mane是啥

点评

打错了,是name  详情 回复 发表于 2020-4-17 15:41
回复

使用道具 举报

31#
 楼主| 发表于 2020-4-17 15:27:00 | 只看该作者
本帖最后由 青青草 于 2020-4-17 18:56 编辑
wintoflash 发表于 2020-4-10 10:48
for file in ($device)/WIM/X64/*; do                  
        if [ -f "${file}" ]; then                    ...

W大,你好!
再次请教一下:
               
                 for file in (${device})/X64/*; do                    
                      test -f ${file};                  
                   regexp -s filename ".*/(.*)" "${file}"
                   regexp -s ext_name '.*\.(.*)' "${file}"
                   regexp --set=name '^.*\/(.*)\..*$' "${file}";      
                        if regexp '^[wW][iI][mM]$' "${ext_name}"; then                    
                      funcGetSequence;  
                            menuentry "启动 ${name} (${device})" "${device}" "${filename}" {
                              set root=$2;
                              set filename_this=$3
                              loopback wimboot (memdisk)/boot/grub/wimboot.gz
                              wimboot @:boot.wim:(${root})/X64/${filename_this} @:bootmgfw.efi:(wimboot)/bootmgfw.efi @:bcd:(wimboot)/bcd               @:boot.sdi:(wimboot)/boot.sdi
                      }
              ... ...
        该代码,不管WIM文件名是否含有空格,均可以找到。
对于文件名不含空格的WIM文件,可以显示,也可以启动。
对文件名含空格的WIM文件,可以显示,但启动时却显示:错误的文件(bad file)。
该如何修改代码,以解决此问题?
谢谢了!
已经解决了,无需解答。


点评

注意加引号 或者 反斜杠转义。 wimboot @:boot.wim:(hd0,1)/abcd/test.wim wimboot @:boot.wim:(hd0,1)/abcd/filename\ space.wim wimboot "@:boot.wim:(hd0,1)/abcd/filename space.wim"  详情 回复 发表于 2020-4-17 18:58
回复

使用道具 举报

30#
发表于 2020-4-11 18:39:11 | 只看该作者
青青草 发表于 2020-4-11 18:24
江大,你好!
          用你写的代码,确实可以找到文件名含空格的wim文件。
用下面的代码,却找不 ...

我是从aioboot那抄的,再小改了下
是不是这么理解,我那个脚本查找所有设备根下的wim文件,就是简单粗暴的
for file in (*)*.wim;
回复

使用道具 举报

29#
 楼主| 发表于 2020-4-11 18:24:24 | 只看该作者
本帖最后由 青青草 于 2020-4-11 18:27 编辑
江南一根葱 发表于 2020-4-10 22:11
找wim?我都是写个寒数

  江大,你好!
          用你写的代码,确实可以找到文件名含空格的wim文件。
用下面的代码,却找不到(文件名不含空格的wim文件可以找到),不知错在哪了?
特此请教。
谢谢!
for dev in (*); do        
                test -e ${dev};
            if test "$?" = "1"; then
               continue;
           fi;
          regexp --set=device '\((.*)\)' ${dev};
      for file in (${device})/WIM/X64/*; do                                         
                      test -f "${file}";     
            ...  ...

点评

我是从aioboot那抄的,再小改了下 是不是这么理解,我那个脚本查找所有设备根下的wim文件,就是简单粗暴的 for file in (*)*.wim;  详情 回复 发表于 2020-4-11 18:39
回复

使用道具 举报

28#
发表于 2020-4-10 23:38:54 | 只看该作者
本帖最后由 hilsonma 于 2020-4-11 00:15 编辑
江南一根葱 发表于 2020-4-10 22:11
找wim?我都是写个寒数

不好意思哈,错怪你了,是我没有挂图形。
现在挂上图形,可以找到含空格的文件名。
放在目录名含有空格的目录中,也可以找到。

而且我也明白了你以前说grub2搜索文件慢的意思,象你这个函数是搜索所有文件夹包括指定层次的子文件夹中的某类文件,这样跟everything比实在是太慢了。
不过我的目标不是搜索所有文件夹,我只在各分区中找指定文件夹里的文件,所以就会快些了,起码还可以接受。这样就可以将各类pe镜像放在一个文件夹,列自动菜单,速度也还可以接受。
回复

使用道具 举报

27#
发表于 2020-4-10 23:33:27 | 只看该作者
学习了
回复

使用道具 举报

26#
发表于 2020-4-10 23:06:29 | 只看该作者
江南一根葱 发表于 2020-4-10 22:11
找wim?我都是写个寒数

怎么我这里是这样:
把你的内容放到cong.cfg,然后在命令行执行,结果


回复

使用道具 举报

25#
发表于 2020-4-10 22:11:54 | 只看该作者
找wim?我都是写个寒数


function list {   
    echo "正在搜索\"$zhaowj\"中的$zhaotype文件,稍候... ..."
    for file in $zhaowj*.$zhaotype $zhaowj*/*.$zhaotype $zhaowj*/*/*.$zhaotype; do
    test -e $zhaowj;      
           if test $? = "1"; then     
    continue;
               fi
           if ! test -f "$file"; then continue;
                   fi
    regexp -s filename "$zhaowj/(.*)" "$file"
           if [ -z "$havefile" ]; then set havefile="1"; fi       
    set path=""; export path;
    menuentry "$file" --class $icon {
    export file=${1}; grubfm_open $file;
    }
    done
           if [ -z "$havefile" ]; then
    echo
    echo "在\"$zhaowj\"没有找到$zhaotype文件!"
    echo
    echo -n "ESC "
    sleep -i -v 1
    else
    menuentry "继续搜索" --class go-previous {
    configfile $prefix/search.sh;
    }
        menuentry "返回" --class go-previous {
    grubfm;
    }
    unset havefile
           fi
    unset filename       
    }


zhaowj=(*); set zhaotype=wim; set icon=wim;
list

点评

江大,你好! 用你写的代码,确实可以找到文件名含空格的wim文件。 用下面的代码,却找不到,不知错在哪了? 特此请教。 谢谢! for dev in (*); do test -e ${dev};  详情 回复 发表于 2020-4-11 18:24
不好意思哈,错怪你了,是我没有挂图形。 现在挂上图形,可以找到含空格的文件名。  详情 回复 发表于 2020-4-10 23:38
你有没有试过的呀,怎么我这里是这样: 把你的内容放到cong.cfg,然后在命令行执行,结果 [attachimg]415990[/attachimg]  详情 回复 发表于 2020-4-10 23:06
回复

使用道具 举报

24#
发表于 2020-4-10 15:09:05 | 只看该作者
青青草 发表于 2020-4-10 13:59
请参考:https://www.jb51.net/tools/zhengze.html
       其中的12、13、14、15

谢谢。知道什么是分组捕获和零宽断言了。
我连这些都不会,所以无法给你解答。
回复

使用道具 举报

23#
发表于 2020-4-10 15:03:51 | 只看该作者
青青草 发表于 2020-4-10 13:54
自己的wim文件,文件名不会有空格。退一步说,即使有,也可以改成没有的呀。
只是,一者,作为技术性探 ...

尝试过了,如果wim文件名带空格,我现在解决不了。
回复

使用道具 举报

22#
发表于 2020-4-10 14:31:34 | 只看该作者
那是因为以前区分大小写
回复

使用道具 举报

21#
 楼主| 发表于 2020-4-10 14:01:28 | 只看该作者
本帖最后由 青青草 于 2020-4-10 14:08 编辑
wintoflash 发表于 2020-4-10 13:58
为什么不用lua脚本?

LUA脚本可以解决这个问题么?
我对LUA脚本不是很熟悉。
前次你写的 getver.lua 中,
dlltable = {
      "(" .. device .. ")/windows/System32/Version.dll",
        "(" .. device .. ")/windows/System32/version.dll",
        "(" .. device .. ")/windows/system32/Version.dll",
        "(" .. device .. ")/Windows/system32/version.dll",
        "(" .. device .. ")/windows/System32/Version.dll",
        "(" .. device .. ")/windows/System32/version.dll",
        "(" .. device .. ")/windows/system32/Version.dll",
        "(" .. device .. ")/Windows/system32/Version.dll",
     }
用了8个的意义,我就不太理解。
回复

使用道具 举报

20#
 楼主| 发表于 2020-4-10 13:59:05 | 只看该作者
hilsonma 发表于 2020-4-9 19:32
你举一下分组捕获和零宽断言的例子,我不明白。

请参考:https://www.jb51.net/tools/zhengze.html
       其中的12、13、14、15

点评

谢谢。知道什么是分组捕获和零宽断言了。 我连这些都不会,所以无法给你解答。  详情 回复 发表于 2020-4-10 15:09
回复

使用道具 举报

19#
发表于 2020-4-10 13:58:06 | 只看该作者
为什么不用lua脚本?

点评

LUA脚本可以解决这个问题么?  详情 回复 发表于 2020-4-10 14:01
回复

使用道具 举报

18#
 楼主| 发表于 2020-4-10 13:54:29 | 只看该作者
hilsonma 发表于 2020-4-10 13:27
刚试了,文件夹名含空格,没有问题,因为这个问题我以前处理过。
wim文件名含空格,确实找不到,这个我 ...

自己的wim文件,文件名不会有空格。退一步说,即使有,也可以改成没有的呀。
只是,一者,作为技术性探讨;二者,提高启动盘通用性。

点评

尝试过了,如果wim文件名带空格,我现在解决不了。  详情 回复 发表于 2020-4-10 15:03
回复

使用道具 举报

17#
发表于 2020-4-10 13:27:05 | 只看该作者
青青草 发表于 2020-4-10 10:52
你分别试一下,(1)让wim文件名含有空格;
                      (2)让文件夹名含有空格;
你的配 ...

刚试了,文件夹名含空格,没有问题,因为这个问题我以前处理过。
wim文件名含空格,确实找不到,这个我以前没有试过,因为我不会让wim文件名含空格,我稍后再试试能不能让wim文件名含空格。



点评

自己的wim文件,文件名不会有空格。退一步说,即使有,也可以改成没有的呀。 只是,一者,作为技术性探讨;二者,提高启动盘通用性。  详情 回复 发表于 2020-4-10 13:54
回复

使用道具 举报

16#
 楼主| 发表于 2020-4-10 11:08:55 | 只看该作者
本帖最后由 青青草 于 2020-4-10 11:11 编辑
wintoflash 发表于 2020-4-10 10:48
for file in ($device)/WIM/X64/*; do                  
        if [ -f "${file}" ]; then                    ...

还是出错。
应该是for file in ($device)/WIM/X64/*; do 找不到含有空格文件名的文件。
shell脚本中是这样处理的:
OLDIFS=$IFS
IFS=$'\n'
for img in $list
do
      ......
done
IFS=$OLDIFS
使用的是$IFS这个变量.
grub2是否有类似变量?
回复

使用道具 举报

15#
 楼主| 发表于 2020-4-10 10:52:49 | 只看该作者
hilsonma 发表于 2020-4-8 22:27
可参考我这两个贴子:
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=419875
http://bbs.wuyou.n ...

你分别试一下,(1)让wim文件名含有空格;
                      (2)让文件夹名含有空格;
你的配置方案会怎么样?
可以吗?

点评

刚试了,文件夹名含空格,没有问题,因为这个问题我以前处理过。 wim文件名含空格,确实找不到,这个我以前没有试过,因为我不会让wim文件名含空格,我稍后再试试能不能让wim文件名含空格。 [attachimg]415956[/at  详情 回复 发表于 2020-4-10 13:27
回复

使用道具 举报

14#
发表于 2020-4-10 10:48:16 | 只看该作者
for file in ($device)/WIM/X64/*; do                  
        if [ -f "${file}" ]; then                                       
                regexp --set=pewim '^.*/(.*\.[wW][iI][mM]$)' "${file}";        
                regexp --set=pename '^.*/(.*)\.[wW][iI][mM]$' "${file}";

点评

W大,你好![/backcolor] 再次请教一下: [/backcolor] set czdz=(${device})/X64/*; for file in ${czdz}; do test -f ${file}  详情 回复 发表于 2020-4-17 15:27
还是出错。 应该是for file in ($device)/WIM/X64/*; do 找不到含有空格文件名的文件。 shell脚本中是这样处理的: OLDIFS=$IFS IFS=$'\n' for img in $list do ...... done IFS=$OLDIFS  详情 回复 发表于 2020-4-10 11:08
回复

使用道具 举报

13#
 楼主| 发表于 2020-4-10 10:46:04 | 只看该作者
hilsonma 发表于 2020-4-10 09:45
你是不是想要这样:
set czdz=($device)/WIM/X64/*;
for file in '$czdz'; do                  

for file in '$czdz'; do
这样书写,肯定出错的。
回复

使用道具 举报

12#
发表于 2020-4-10 09:45:23 | 只看该作者
本帖最后由 hilsonma 于 2020-4-10 10:02 编辑
青青草 发表于 2020-4-10 08:41
当文件名包含空格时,for循环就出问题了。要解决这个问题,需要从单词分隔符着手。而在bash中使用的是$IF ...

你是不是想要这样:
set czdz=($device)/WIM/X64/*;
for file in '$czdz'; do                  
        if test -f '${file}';                                       
                regexp --set=pewim '^.*/(.*\.[wW][iI][mM]$)' "$file";        
                regexp --set=pename '^.*/(.*)\.[wW][iI][mM]$' "$file";
                ...
        fi
done

点评

for file in '$czdz'; do 这样书写,肯定出错的。  详情 回复 发表于 2020-4-10 10:46
回复

使用道具 举报

11#
 楼主| 发表于 2020-4-10 08:41:36 | 只看该作者
hilsonma 发表于 2020-4-9 19:24
set czdz="($device)/WIM/X64/*"
是可以的。但在用 czdz 时也要加引号。为了应对类似情况,标准的变量写 ...

当文件名包含空格时,for循环就出问题了。要解决这个问题,需要从单词分隔符着手。而在bash中使用的是$IFS这个变量,在grub2中不知使用的是哪个变量?

点评

你是不是想要这样:  详情 回复 发表于 2020-4-10 09:45
回复

使用道具 举报

10#
发表于 2020-4-9 19:32:07 | 只看该作者
青青草 发表于 2020-4-9 16:08
另外,grub2的正则表达式似乎不支持分组捕获和零宽断言。

你举一下分组捕获和零宽断言的例子,我不明白。

点评

请参考:https://www.jb51.net/tools/zhengze.html  详情 回复 发表于 2020-4-10 13:59
回复

使用道具 举报

9#
发表于 2020-4-9 19:24:43 | 只看该作者
本帖最后由 hilsonma 于 2020-4-9 19:29 编辑
青青草 发表于 2020-4-9 16:08
另外,grub2的正则表达式似乎不支持分组捕获和零宽断言。

set czdz="($device)/WIM/X64/*"
是可以的。但在用 czdz 时也要加引号。为了应对类似情况,标准的变量写法应该是
"${czdz}"
用花括号表示变量名起止,用$声明这是变量,用双引号让引用的变量成为一个整体(如果没有双引号的话当变量内容有空格时就会被分割)。
容易发生的错误往往是引用变量时没想到变量中有空格导致引用的内容不完整,我自己就常有这样的错误,深有体会。

点评

当文件名包含空格时,for循环就出问题了。要解决这个问题,需要从单词分隔符着手。而在bash中使用的是$IFS这个变量,在grub2中不知使用的是哪个变量?  详情 回复 发表于 2020-4-10 08:41
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-26 10:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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