最近想更新自己的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=6Outer=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%
Count=0Outer=1 3 Inner=1 3 5
只不过加了对{},就不行了。
不过这些都是题外话。主题是挂载WIM盘到Y:。
先扫ESP,扫到头一个就挂载,然后就停了,不再扫。如果扫了所有硬盘的ESP都没找到目标档案,然后才开始扫USB/DVD盘。一样是扫到头一个就挂载,然后就停了。求教!先行谢过!
经过不断试错,和问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
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 }
这行在log里看到,call是call了,但我后来在_SUB ProcessESP里,开首加了句"Mess S1aStart",从来就没弹窗过,就是说CALL了但没工作。问题出在哪里?
你至于这么费劲么,把.wim文件放到ESP分区里面,用 “BootICEx64”修改BCD文件就能直接UEFI启动了。
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了。
还是没看懂多少,感觉是不是搞复杂了,也许有更简单的办法。