问题: 想用PECMD.ini挂载WIM来源盘到Y:
20天前 203

最近想更新自己的Win10PE,就去下载了个PE之后用DISM++改成自己想要的模样。

桌面、文件浏览器改显示大图标、开始列放左边等等都很容易。把设定改好,搜出设定的注册表位置、导出后,注入boot.wim就变成PE开机的预设了。这些我都已经实现了。

但我现在在模仿、改造原作者挂载Wim(来源)盘的方法。挂载了Wim盘,才能把放在Wim外面(但同盘)的驱动、程序载进来。

他就是用这个LetterSwap - Github

LetterSwap.exe /auto /SetLetter Y:\PE.ini /Log %Temp%\LetterSwap.log

/Log以及后面部分就是记录吧,不用看。”PE.ini“ 就是扫描目标。Y:\就是发现目标后配上的盘号。他这样一行码就搞好了,但我不满意,为何?

我个人习惯把boot.wim放ESP盘,因为系统SSD盘快、方便,而且现在系统灾难大多限在Windows以内。想重装,转boot到ESP里的PE Wim就够了。

ESP 一般不挂载,而且就算挂载了,LetterSwap也换不了它的盘号。我不清楚运作原理,我猜测像是它在注册表里[HKLM\MountedDevices]里找不到ESP盘,因为ESP盘不用一般格式写在里面,有些时候根本没写在里面。那我就想能不能用PECMD.ini 写几段码做到呢?但我写代码完全外行,就是很需要、方便自己的时候,写过几行。那就问AI吧🤣。

就发现了 OpenCode在输出的IFEX里放了ELSE 、然后现在,"FORX *"用{}嵌套 或 加"次数"就会失效。😳

ENVI &&Count=0
ENVI &&Outer=1 3
ENVI &&Inner=1 3 5
FORX * %Outer%,outerVar, FORX * %Inner%,innerVar, CALC &&Count=%Count%+1
MESS Count=%Count%\nOuter=%Outer% Inner=%Inner%

 PECMD视窗执行后,显示

Count=6
Outer=1 3 Inner=1 3 5

第一层2次 X 第二层3次 = 6次,对!

那我嵌个套试试?

ENVI &&Count=0
ENVI &&Outer=1 3
ENVI &&Inner=1 3 5
FORX * %Outer%,outerVar, {FORX * %Inner%,innerVar, CALC &&Count=%Count%+1}
MESS Count=%Count%\nOuter=%Outer% Inner=%Inner%

 PECMD视窗执行后,显示

Count=0
Outer=1 3 Inner=1 3 5

只不过加了对{},就不行了。

不过这些都是题外话。主题是挂载WIM盘到Y:。

先扫ESP,扫到头一个就挂载,然后就停了,不再扫。如果扫了所有硬盘的ESP都没找到目标档案,然后才开始扫USB/DVD盘。一样是扫到头一个就挂载,然后就停了。求教!先行谢过!

奖励
收藏
点赞
分享
最新回复 (4)
  • avatar image
    Taccess 19天前
    楼主   2

    经过不断试错,和问AI,就得出以下代码。 看上去挺好的了,但还是不行:

     

    _SUB MountESP

    // Tracking flag: 0 = Y: is free, 1 = Y: has been claimed by a flagged ESP

    ENVI &IsYMounted=0

     

    // STAGE 1: Scan physical hardware slots sequentially to safely handle all ESPs

    FORX * 0 1 2 3 4 5 6 7 8 9, &DiskID,

    {

    ENVI &PartID=1

    part list part %DiskID%#%PartID%, &partinfo

    MSTR &TGUID=<2>%partinfo%

     

    // Single-line execution via CALL to bypass multi-line limitations

    IFEX %TGUID%=c12a7328-f81f-11d2-ba4b-00a0c93ec93b, CALL ProcessESP

    }

     

    // STAGE 2: LETTERSWAP HAND-OFF (Runs only if Y: is not mounted)

        IFEX %IsYMounted%=0, EXEC =!%WinDir%\System32\LetterSwap.exe /auto /SetLetter Y:\PE.ini /Log %Temp%\LetterSwap.log

        IFEX Y:\PE.ini, TEAM ENVI WimDrive=Y: | ENVI &IsYMounted=1

    _END

    _SUB ProcessESP

    SHOW - %DiskID%:%PartID%

    SHOW %DiskID%:%PartID%, T

    ENVI &WaitShowESP=0

    LOOP %WaitShowESP%<8, {IFEX T:\, EXIT,! WAIT 250}

        

    // Logic Gate 1: Flag file exists AND Y: is not yet taken

    IFEX [T:\PE.ini & %IsYMounted%=0], TEAM SHOW - %DiskID%:%PartID% | SHOW %DiskID%:%PartID%, Y | ENVI WimDrive=Y: | ENVI &IsYMounted=1 | EXIT

     

    // Logic Gate 2: Backup processing (if file is missing OR Y: is already claimed)

    // Note: The script only hits this line if the previous EXIT didn't trigger

    SHOW - %DiskID%:%PartID%

    ENVI &LetterAssigned=0

    FORX * W V U T S R Q P O N M L, &BackupLetter, {IFEX [%LetterAssigned%=0 & ! %BackupLetter%:\], TEAM SHOW %DiskID%:%PartID%, %BackupLetter% | ENVI &LetterAssigned=1 }

    _END

     

    IFEX %TGUID%=c12a7328-f81f-11d2-ba4b-00a0c93ec93b, CALL ProcessESP

    这行在log里看到,call是call了,但我后来在_SUB ProcessESP里,开首加了句"Mess S1aStart",从来就没弹窗过,就是说CALL了但没工作。问题出在哪里?

    最后于 18天前 被Taccess编辑 ,原因:
  • avatar image
    Archimage 19天前

    你至于这么费劲么,把.wim文件放到ESP分区里面,用 “BootICEx64”修改BCD文件就能直接UEFI启动了。

    https://pan.xunlei.com/s/VNAY3RpICYzlFiiC2c5wyznqA1?pwd=6bh8#
  • avatar image
    Taccess 18天前
    楼主   4
    Archimage 你至于这么费劲么,把.wim文件放到ESP分区里面,用 “BootICEx64”修改BCD文件就能直接UEFI启动了。

    对呀,我就是这样做的,然后任何WIM包以外的依附程序、驱动就不见了,因为ESP是自带隐形属性的。

    但我花了挺长时間,学会了叫AI自动用PECMD LOAD、自动看log,试错的时间也缩了挺多。最后我弄好了!在虚拟机里弄双硬盘、双ESP试了、出来用自己电脑也试了。成功了,分享下!


    Win来源的硬盘ESP/USB储存/光盘自动挂到Y:+所有ESP自动挂载

     

    这段码,以扫描一个档案为目标,可以是依附在WIM外的驱动/程序/设置档等。先扫ESP,扫到任何一个ESP有,就挂在Y:。如果没扫到,就从W开始倒数上去,没占用的字母就挂载。(如有)其他ESP也是,从W开始挂载。然后因为USB储存在Windows也是當成DISK的,所以其实这段码也可以把USB也扫瞄,但我懒,就照推给LetterSwap就算了。(如果)最后真的所有硬盘ESP都没扫到,剩下才到USB和光盘就交给LetterSwap了。

     

    _SUB MountESP
    TEXT
    TEXT Initializing Hiren's BootCD PE...\n> Mounting WIM Source L59 T39 $20
    ENVI &IsYMounted=0
     
    // STAGE 1: Nested Scan Disks>Part1 sequentially
     
    FORX * 0 1 2 3 4 5 6 7 8 9, &DiskID,
    //盘号0-9每个重复以下程序一次
    {
    //查DISK详情,遇空DISK就退出整个FORX
    part list disk %DiskID%, &diskinfo
    IFEX |%diskinfo%=, EXIT FORX
    ENVI &PartID=1
    //查分区详情
    part list part %DiskID%#%PartID%, &partinfo
    //核实GUID,是ESP才继续
    LPOS &espPos=C12A7328,,%partinfo%
    FIND |%espPos%=5, CALL ProcessESP
    }
    //上面用CALL,尽量避免FORX嵌套,将整段码嵌套在SUB里
     
    //LETTERSWAP 程序用来扫光盘,还是挺方便的,但不能用来与ESP换盘位
    // 整段码最后Y:还没被占用才运行它(Runs only if Y: is still not mounted)
        IFEX |%IsYMounted%=0, EXEC =%WinDir%\System32\LetterSwap.exe /auto /SetLetter Y:\PE.ini /Log %Temp%\LetterSwap.log
    // No "!" after EXEC to keep it conditional, otherwise it runs no matter what
    WAIT 2000
        IFEX Y:\PE.ini, TEAM ENVI WimDrive=Y: | ENVI &IsYMounted=1
     
    _END
     
    _SUB ProcessESP
    SHOW - %DiskID%:%PartID%
    //暂时挂载在T:
    SHOW %DiskID%:%PartID%, T
     
    ENVI &RetryCount=0
    LOOP #%&RetryCount%<3,
    {
    IFEX T:\, ENVI &FoundT=1
    IFEX %&FoundT%=1, EXIT LOOP
    WAIT 500
    CALC &RetryCount=%&RetryCount%+1
    }
    以上是等待挂载成功
     
    // Logic Gate 1: Flag file found & Y: isn't taken
    //(扫到PE.ini、Y:没被挂载) 双条件同时成立,就挂到Y:
    IFEX [T:\PE.ini & |%IsYMounted%=0], TEAM SHOW - %DiskID%:%PartID% | SHOW %DiskID%:%PartID%, Y | ENVI WimDrive=Y: | ENVI &IsYMounted=1 | EXIT
     
    //上面没触发的ESP/USB,就下来这里从W开始倒数往上挂载
    // Logic Gate 2: File not found OR Y: is taken
    // Note: The script only hits this line if the previous EXIT didn't trigger
    SHOW - %DiskID%:%PartID%
    ENVI &LetterAssigned=0
    FORX * W V U T S R Q P O N M L, &BackupLetter, {IFEX [|%LetterAssigned%=0 & ! %BackupLetter%:\], TEAM SHOW %DiskID%:%PartID%, %BackupLetter% | ENVI &LetterAssigned=1 }
     
    _END
     
    有兴趣、合适就拿去用吧!
    最后于 18天前 被Taccess编辑 ,原因:
  • avatar image
    忧心居士 14天前

    还是没看懂多少,感觉是不是搞复杂了,也许有更简单的办法。

返回