dos时代菜鸟 发表于 2022-11-7 14:00:48

cbg520 发表于 2022-11-7 10:17
很多pe的位置都不定

只要它是在 注册表里有痕迹的,就能找出来。如果是 本地 bcd 调用的,那 十有八九是没问题的。

D_M_GuYing 发表于 2022-11-7 14:03:51

dos时代菜鸟 发表于 2022-11-7 13:59
这你得先做个窗口。控件设计到窗口里。

比如

_SUB wim_setup
    。。。。
    List List,L20T55W150H20,,
    。。。。。。
_END
然后把得到的%lx%赋值给List

dos时代菜鸟 发表于 2022-11-7 14:05:57

本帖最后由 dos时代菜鸟 于 2022-11-7 14:08 编辑

特意弄了个 u盘,用 ultraiso 做了个pe 放进去,启动并没有出现 不能解析 reg 信息的问题,说明 reg 还是靠谱的。
那个分区 diskpart 是不能认成卷的,也就不能为其分配盘符,但是 pecmd show -check 指令可以强行为其分配上盘符。

我把注册表信息 改成不能识别,又把 对应分区卸载了,破迫使只能通过搜索来找,也是可以找到的。




dos时代菜鸟 发表于 2022-11-7 14:06:46

D_M_GuYing 发表于 2022-11-7 14:03
比如

_SUB wim_setup


对,变量 跟 上,用 call 调用窗口 就行了。

D_M_GuYing 发表于 2022-11-7 14:35:02

dos时代菜鸟 发表于 2022-11-7 14:06
对,变量 跟 上,用 call 调用窗口 就行了。

就是不知道怎么写呀,怎么不断的累加上去
@List=第一个%lx%|第二个%lx%|第三个%lx%|..........第N个%lx%

dos时代菜鸟 发表于 2022-11-7 14:41:12

本帖最后由 dos时代菜鸟 于 2022-11-7 14:43 编辑

D_M_GuYing 发表于 2022-11-7 14:35
就是不知道怎么写呀,怎么不断的累加上去
@List=第一个%lx%|第二个%lx%|第三个%lx%|..........第N个%lx%

就把下面一句话 放到窗口段sub 中。

List -hlist名字,      L左 T上W宽度H高度 ,事先包含了内容的变量,这个list变化时要做的动作
如:
envi list1=1|2|3|4|5|6
List -hList_name1,      L10 T10W100H20 ,%list1%,Call xyz

D_M_GuYing 发表于 2022-11-7 15:43:14

本帖最后由 D_M_GuYing 于 2022-11-7 17:44 编辑

dos时代菜鸟 发表于 2022-11-7 14:41
就把下面一句话 放到窗口段sub 中。

List -hlist名字,      L左 T上W宽度H高度 ,事先包含了 ...
明白了,,原来是要在窗口 CALL,而且赋值后,List自动就加了 分隔符了 “|”


浏览后CALL,空白处最先上去的是 2:PE外置程序,要是先显示 1:就OK了,谢谢了,这一阵跟你学了不少

CALL @wim_setup
_SUB wim_setup,W385H480,%bb%,,%SystemRoot%\system32\shell32.dll#8
    ..........................
    List List7,L20T55W250H30 ,,Call gomoun
    Call Find_index
_END

_Sub Find_index
    exec* &mess1=*cmd /cDism /Get-ImageInfo/ImageFile:"%WIMFILE%"
    forx *Nl mess1,lx,
    {
      mstr -delims::item,value=<1><2>%lx%
      Find $%item%=索引, mstr -trim index=%value%
      Find $%item%=名称,
      {
          mstr -trim name=%value%
          envi @List7=%index%:%name%
      }
    }
_END

D_M_GuYing 发表于 2022-11-7 19:30:43

找到了,
在搜索那里最后加个
ENVI @List7.isel=1
就选择第一个卷号了

D_M_GuYing 发表于 2022-11-9 07:38:57

恭喜恭喜
最新版本,基本上完美了!

U启后的定位非常准确了,只有一点小遗憾,还是把没用的ESP分区给分配盘符了(ESP里已经没有.WIM)

dos时代菜鸟 发表于 2022-11-9 08:24:37

本帖最后由 dos时代菜鸟 于 2022-11-9 08:34 编辑

D_M_GuYing 发表于 2022-11-9 07:38
恭喜恭喜
最新版本,基本上完美了!


有卸载环节呀,如果挂载的分区没有 目标,就再卸载掉。难道没有卸载掉?


D_M_GuYing 发表于 2022-11-9 09:12:19

dos时代菜鸟 发表于 2022-11-9 08:24
有卸载环节呀,如果挂载的分区没有 目标,就再卸载掉。难道没有卸载掉?

没卸载掉,我怕是我ESP分区存在 WEPE\WEPE64.wim,已经删除了整个ESP\WEP文件夹
重新U启,ESP分区还是上去了

D_M_GuYing 发表于 2022-11-9 09:13:44

dos时代菜鸟 发表于 2022-11-9 08:24
有卸载环节呀,如果挂载的分区没有 目标,就再卸载掉。难道没有卸载掉?

但,定位是准确的,也没有显示MSR分区,,这已经很好了,不影响大局

dos时代菜鸟 发表于 2022-11-9 09:46:20

本帖最后由 dos时代菜鸟 于 2022-11-9 09:47 编辑

D_M_GuYing 发表于 2022-11-9 09:12
没卸载掉,我怕是我ESP分区存在 WEPE\WEPE64.wim,已经删除了整个ESP\WEP文件夹
重新U启,ESP分区还是上 ...
能看到 esp 分区 挂载到 哪个盘符了么?

是否在 卸载之列?

如果用pecmd subj -盘符: 的方式 能否卸载掉。怀疑这个分区 有多个不同权限下分配的盘符。

D_M_GuYing 发表于 2022-11-9 10:14:05

dos时代菜鸟 发表于 2022-11-9 09:46
能看到 esp 分区 挂载到 哪个盘符了么?

是否在 卸载之列?


给分配了F盘,ESP分区只有引导文件,WEPE文件夹已删除
U启后


D_M_GuYing 发表于 2022-11-9 10:28:20

dos时代菜鸟 发表于 2022-11-9 09:46
能看到 esp 分区 挂载到 哪个盘符了么?

是否在 卸载之列?


刚才忘记测试了

subj -F:
可以卸载掉

dos时代菜鸟 发表于 2022-11-9 10:45:01

D_M_GuYing 发表于 2022-11-9 10:28
刚才忘记测试了

subj -F:

从图片看,esp 分区 是在 运行脚本前就 被挂载了的。进入脚本后,并没有挂载那个分区,自然也就不卸载了呀。

这种情况,跟脚本没啥关系了。

D_M_GuYing 发表于 2022-11-9 11:03:22

dos时代菜鸟 发表于 2022-11-9 10:45
从图片看,esp 分区 是在 运行脚本前就 被挂载了的。进入脚本后,并没有挂载那个分区,自然也就不卸载了 ...

这个问题我想过,也测试了,删除下面代码的时候,U启时,外置加不到,ESP,U启分区都没有分配,
加上下面代码后,就是上一个回复的图了,所以,排除了你说的可能

{ //未获取到 路径对应的硬盘/分区/盘符 信息
                envi. mess1=%mess1%\n 无法解析注册表中的 boot.wim 路径,或该路径已丢失.尝试逆序轮询搜索.
                fdrv &drvs01=*
                sed &drvs1=0,[ ],,%&drvs01%
                show -check -1:-1,1
                fdrv &drvs2=*
                sed &drvs2=0,[%&drvs1%],,%&drvs2%
                envi mess1=%mess1%\n 新分配的盘符 [%&drvs2%]
               
                //按硬盘分区序列给已有盘符排序
                call A_ltr
               
                envi mess1=%mess1%\n 分区盘符搜索序列 [%RD%][%FD%]
                forx * %RD% %FD%,&drvx1,
                ..............................................

dos时代菜鸟 发表于 2022-11-9 11:27:47

本帖最后由 dos时代菜鸟 于 2022-11-9 11:29 编辑

D_M_GuYing 发表于 2022-11-9 11:03
这个问题我想过,也测试了,删除下面代码的时候,U启时,外置加不到,ESP,U启分区都没有分配,
加上下 ...
难道 show -check -1:-1,1 这个命令有延迟?导致不能获取新加载的分区盘符?
可以添加两句话试试

                envi. mess1=%mess1%\n 无法解析注册表中的 boot.wim 路径,或该路径已丢失.尝试逆序轮询搜索.
                fdrv &drvs01=*
                sed &drvs1=0,[ ],,%&drvs01%
                show -check -1:-1,1
                wait 1000
                fdrv &drvs2=*
                mess手动打开我的电脑,看一下 是否有新的分区被加载了。\n[%&drvs1%] \n[%&drvs2%]

                sed &drvs2=0,[%&drvs1%],,%&drvs2%
                envi mess1=%mess1%\n 新分配的盘符 [%&drvs2%]
               
                //按硬盘分区序列给已有盘符排序
                call A_ltr
               
                envi mess1=%mess1%\n 分区盘符搜索序列 [%RD%][%FD%]
                forx * %RD% %FD%,&drvx1,

D_M_GuYing 发表于 2022-11-9 11:33:56

dos时代菜鸟 发表于 2022-11-9 10:45
从图片看,esp 分区 是在 运行脚本前就 被挂载了的。进入脚本后,并没有挂载那个分区,自然也就不卸载了 ...

不知道我上次的回复有没有表达清楚,再详细说下

我的PECMD.INI,查找外置就写搜索的那一部分,全部删除,U启后,ESP分区,U启分区都没有分配,那就是说,PECMD.INI中,没有ESP分配的代码
加上了,再U启,就分配ESP了,当然,定位WIM所在分区的是U启分区
_SUB wz
                envi. mess1=%mess1%\n 无法解析注册表中的 boot.wim 路径,或该路径已丢失.尝试逆序轮询搜索.
                fdrv &drvs01=*
                sed &drvs1=0,[ ],,%&drvs01%
                show -check -1:-1,1
                fdrv &drvs2=*
                sed &drvs2=0,[%&drvs1%],,%&drvs2%
                envi mess1=%mess1%\n 新分配的盘符 [%&drvs2%]
               
                //按硬盘分区序列给已有盘符排序
                call A_ltr//
               .................................................
_END



_SUB A_ltr
......................
_END

dos时代菜鸟 发表于 2022-11-9 11:56:22

D_M_GuYing 发表于 2022-11-9 11:33
不知道我上次的回复有没有表达清楚,再详细说下

我的PECMD.INI,查找外置就写搜索的那一部分,全部删 ...
我是说 资源管理器里不看到那个盘符,不代表那个分区没有盘符。

fdrv drvs=*
mess [%drvs%]
看有f盘么? 有可能是 另一个权限下给分配了 f 盘符,在 show 指令一折腾,给显示出来了。

这个就不好办了。

D_M_GuYing 发表于 2022-11-9 12:16:22

本帖最后由 D_M_GuYing 于 2022-11-9 12:18 编辑

dos时代菜鸟 发表于 2022-11-9 11:27
难道 show -check -1:-1,1 这个命令有延迟?导致不能获取新加载的分区盘符?
可以添加两句话试试


加入后,启动到桌面前,如图

启动到桌面后,问题依旧

D_M_GuYing 发表于 2022-11-9 12:35:46

十分对不起,是我自己不够严谨,看在我一顿折腾的份上,原谅我吧
这回,好像咱们俩都不用再折腾了,基本上解决了所有问题,是我的PECMD.INI中,没有加上红色部分,SO SORRY!

                envi wzPath=%&drvx1%WEPE\WEPE.INI
                sed &drvs2=0,[%&drvx1%],,%&drvs2%
                exit forx
            }
      }
      envi mess1=%mess1%\n 卸载无需挂载的分区 [%&drvs2%]
      forx * %&drvs2%,&drvx1,subj -%&drvx1%:
    }

dos时代菜鸟 发表于 2022-11-9 12:39:24

D_M_GuYing 发表于 2022-11-9 12:35
十分对不起,是我自己不够严谨,看在我一顿折腾的份上,原谅我吧
这回,好像咱们俩都不用再折腾了,基本上 ...

没关系,从来也没怪你呀。哈哈哈。

D_M_GuYing 发表于 2022-11-9 13:24:09

dos时代菜鸟 发表于 2022-11-9 12:39
没关系,从来也没怪你呀。哈哈哈。
很能感觉到你的心情,虽然一通儿的折腾,又被我凭空添了些不必要的麻烦,但最后解决或者解惑了,心情大好,跟喝了一壶老酒似的,,,

再最后麻烦一件事儿,我PECMD.INI中的红色部分,主要是我想要分配第一个可用盘符,但你的脚本分配的是最后一个可用盘符,不知道我这么改是否严谨,好象之前你说过,这个命令分配盘符,在有些特殊情况下,有点不靠谱。


我不是学这个专业的,PECMD.EXE全靠自己看着帮助慢慢的学,这阵儿子跟你学到了很多,再次感谢!!

_SUB FINDFZ
    REGI .HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions,&sso
    forx * %&sso% ,&p0,
    {
      envi &&item0=
      mstr &&item0=0,7,%&p0%
      Find $"%&item0%"="RDPATH=" ,
      {
            mstr &p0=8,0,%&p0%            
            mstr -delims:\ value1=<1>%&p0%
      }
    }
    Find $"%value1%"<>"",
    {
      sed *ni &str2=0,[()0123456789], ,%value1%
      mstr &type1=<3>%&str2%%
      ifex '%&type1%'='cdrom',
      {
            FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
            ENVI wzPath=%STPATH%\WEPE\WEPE.INI
      }!
      {
            part -drv list volume\ArcName\%value1%,&part_info
            ifex '%&part_info%'<>'',
            {
                mstr &disk,&part,<r=<2><3><8>%&part_info%
                ENVI wzPath=%<r%\WEPE\WEPE.INI
                Find $"%<r%"="",
                {
                  fdrv -idlec &drvs=*:
                  mstr &drvx=<1>%&drvs%
                  DISK %&drvx%,%&disk%,%&part%,1
                  ENVI wzPath=%&drvx%\WEPE\WEPE.INI
                }   
            }!
            {
                fdrv &drvs01=*
                sed &drvs1=0,[ ],,%&drvs01%
                show -check -1:-1,1
                fdrv &drvs2=*
                sed &drvs2=0,[%&drvs1%],,%&drvs2%
                call A_ltr
                forx * %RD% %FD%,&drvx1,
                {
                  ifex "%&drvx1%WEPE\WEPE.INI",
                  {
                        envi wzPath=%&drvx1%WEPE\WEPE.INI
                        sed &drvs2=0,[%&drvx1%],,%&drvs2%
                        exit forx
                  }
                }
                forx * %&drvs2%,&drvx1,subj -%&drvx1%:
                }
            }
      }
    }
_END

dos时代菜鸟 发表于 2022-11-9 14:37:17

D_M_GuYing 发表于 2022-11-9 13:24
很能感觉到你的心情,虽然一通儿的折腾,又被我凭空添了些不必要的麻烦,但最后解决或者解惑了,心情大好 ...

你这个就是取第一个空间盘符分配的
                  fdrv -idlec &drvs=*:
                  mstr &drvx=<1>%&drvs%
                  DISK %&drvx%,%&disk%,%&part%,1


如果是下面这个,就是用最后一个空闲盘符
                  fdrv -idlec &drvs=*:
                  mstr &drvx=<-1>%&drvs%
                   DISK %&drvx%,%&disk%,%&part%,1

紫色部分
                   DISK %&drvx%,%&disk%,%&part%,1
DISK [变量名],硬盘号,分区号                                                               ┃
┃    │    │※"硬盘号"不为空值,"分区号"也不为空值时,根据"变量名"的格式按以下三种情况处理:            ┃
┃    │5.1 │DISK   ,硬盘号,分区号                                                                     ┃
┃    │    │1、"变量名"为空值时,则卸载该硬盘分区分配的盘符卷,见示例7;                              ┃
┃    │5.2 │DISK 盘符卷,硬盘号,分区号,[功能号]                                                      ┃
┃    │    │2、"变量名"为盘符卷时(如 E: 或 E:\),为硬盘分区分配指定的盘符卷,"功能号"省略或为0时,若为┃
┃    │    │隐藏分区则不分配盘符卷,"功能号"为非0时不管是否为隐藏分区均分配盘符卷,见示例8;          ┃
┃    │5.3 │DISK 变量名,硬盘号,分区号                                                               ┃
┃    │    │3、"变量名"不为空值,且不符合盘符形式时,将该分区的盘符赋值给指定的"变量名",见示例

D_M_GuYing 发表于 2022-11-9 14:59:58

dos时代菜鸟 发表于 2022-11-9 14:37
你这个就是取第一个空间盘符分配的
                  fdrv -idlec &drvs=*:
                  ms ...

哦,那我这个是用对了??
那就好

D_M_GuYing 发表于 2022-11-10 07:21:19

我搜索光驱部分用的是FORM

       ifex '%&type1%'='cdrom',
      {
            FORX \Setup\安装WinPE.CMD,STPATH,0,
            {
                FDRV wzDrive=%STPATH%
                FORM DriveType=%wzDrive%
                FIND $%DriveType%=DRIVE_CDROM,ENVI wzPath=%wzDrive%WEPE\WEPE.INI
            }
      }

dos时代菜鸟 发表于 2022-11-10 08:11:08

D_M_GuYing 发表于 2022-11-10 07:21
我搜索光驱部分用的是FORM

       ifex '%&type1%'='cdrom',


我是用 part 找出 有盘符的光驱,也没几个,逐个判断下,效率上也不耽误。

泮安宁 发表于 2022-11-20 11:19:10

如果wim是在隐藏分区被启动的,不分配盘符的话,还能找出wim的位置吗

dos时代菜鸟 发表于 2022-11-20 13:24:40

泮安宁 发表于 2022-11-20 11:19
如果wim是在隐藏分区被启动的,不分配盘符的话,还能找出wim的位置吗

可以,而且可以给分配盘符,
前提是 用 bcd 启动的,在注册表中 有 记录。
页: 1 2 3 4 [5] 6
查看完整版本: 确定当前pe 对应的 boot.wim 位置,基本解决