无忧启动论坛

标题: 求一个在挂载完ESP分区后能够自动显示出ESP分区的盘符的批处理 [打印本页]

作者: 有阴也有阳    时间: 2017-12-22 11:23
标题: 求一个在挂载完ESP分区后能够自动显示出ESP分区的盘符的批处理
本帖最后由 有阴也有阳 于 2017-12-24 16:08 编辑

        挂载ESP分区的批处理已有:

@echo off
echo 正在挂载ESP分区……
FOR /F "usebackq tokens=2 delims= " %%i in (` echo list disk ^|diskpart ^| find "磁盘" `) do (
        echo select disk=%%i>%temp%\t.txt
        echo list partition>>%temp%\t.txt
        FOR /F "usebackq tokens=2 delims= " %%j in (` diskpart /s %temp%\t.txt ^| find "系统" `) do (
                echo select disk=%%i>%temp%\t.txt
                echo select partition=%%j>>%temp%\t.txt
                echo assign>>%temp%\t.txt
                diskpart /s %temp%\t.txt>nul
        ) )
pause

        下面就是剩下在后面加上一句什么命令能够显示出挂载的ESP分区的盘符,再在后面加上一句什么命令能够打开PE桌面上的

“计算机”,谢谢!!!

        特别说明:此批处理取自本论坛网友comzhongwy的帖子:

        《[原创] ESP分区挂载文件管理_1.3.0_2017.1.27_支持win7.win8.win10》

        http://bbs.wuyou.net/forum.php?mod=viewthread&tid=385400

        版权属于原作者,感谢网友comzhongwy的分享,谢谢!!!


        在众网友的热心帮助下,几易其稿,终于弄得将就了,咱这业余爱好也就只有这样的水平,下面先上几张效果图:

        1.



        2.



        3.



        4.



        5.



        6.




        “挂载ESP分区.bat”的内容如下:

    @echo off
echo 正在挂载ESP分区……
FOR /F "usebackq tokens=2 delims= " %%i in (` echo list disk ^|diskpart ^| find "磁盘" `) do (
        echo select disk=%%i>%temp%\t.txt
        echo list partition>>%temp%\t.txt
        FOR /F "usebackq tokens=2 delims= " %%j in (` diskpart /s %temp%\t.txt ^| find "系统" `) do (
                echo select disk=%%i>%temp%\t.txt
                echo select partition=%%j>>%temp%\t.txt
                echo assign>>%temp%\t.txt
                diskpart /s %temp%\t.txt>nul
        ) )
echo;
echo;    1.请按下任意键来打开Diskgeniu-s以查看ESP分区所挂载的盘符,按下后请
echo;
echo;先耐心地等待几秒钟来等候Diskgeniu-s窗口的打开。
echo;
pause
@if not exist "%programw6432%" (call 运行U盘里32位的DG分区.bat) else call 运行U盘里64位的DG分区.bat
echo;
echo;    2.请再按下任意键来打开PE的“计算机窗口”以查看ESP分区......   
echo;
pause
start "" ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
exit


        用这个“挂载ESP分区.bat(——nttwqz网友原创,我只是略作改动)”也行:

@echo off
title 查找活动分区及ESP分区
rem 需要diskpart支持
rem 自动请求以管理员权限运行
set vbs="%temp%\getadmin.vbs"
reg query HKU\S-1-5-20>nul 2>nul || echo CreateObject^("Shell.Application"^).ShellExecute "%~f0", "%*", "", "runas", 1 > %vbs% && cscript //b %vbs% && exit /b & del %vbs% /f /q>nul 2>nul

::设置是否为无盘符的活动分区或EFI分区分配盘符(一般重启会消失),开启:y

set auto=y

setlocal enabledelayedexpansion
echo;正在处理,请稍候...
rem 列表磁盘并判断是否是GPT磁盘
set dptmp="%temp%\diskpart.tmp"
echo list disk | diskpart >%dptmp%
set n=0
for /f "tokens=2,3*" %%a in ('type %dptmp% ^| find /i "B "') do (
        set /a n+=1
        set disk-!n!=%%a
        rem 判断是否是GPT磁盘
        set "var=%%b%%c"
        set "var=!var:~-1!
        if "!var!"=="*" (set "gpt-!n!=Yes") else (set "gpt-!n!=No")
)

for /l %%a in (1,1,!n!) do (
        rem 判断GPT磁盘的ESP分区
        if /i "!gpt-%%a!"=="yes" (
                for /f "tokens=2" %%b in ('(echo sel disk !disk-%%a! ^&^& echo list part^) ^| diskpart ^| find /i"B "') do (
                        if not defined boot-%%a call :findbootpartition %%a %%b "c12a7328-f81f-11d2-ba4b-00a0c93ec93b"
                )
        ) else (
        rem 判断MBR磁盘的活动分区
                for /f "tokens=2" %%c in ('(echo sel disk !disk-%%a! ^&^& echo list part^) ^| diskpart ^| find /i"B " ^| find /i /v "扩展的" ^| find /i /v "逻辑"') do (
                        if not defined boot-%%a call :findbootpartition %%a %%c "活动: 是"
                )
        )
        rem 确定ESP分区及活动分区盘符
        if not "!boot-%%a!"=="未找到" (
                (echo sel disk !disk-%%a!
                echo sel part !boot-%%a!
                echo detail part)>%dptmp%
                for /f "tokens=4" %%d in ('diskpart /s %dptmp% ^| find "*"') do (
                        if exist "%%d:\" (set "ltr-%%a=%%d:") else (
                                set "ltr-%%a=无盘符"
                                rem 当变量auto值为y时自动分配盘符
                                if /i "%auto%"=="y" (
                                        (echo sel disk !disk-%%a!
                                        echo sel part !boot-%%a!
                                        echo assign
                                        echo detail part)>"%temp%\diskpart-ltr.tmp"
                                        for /f "tokens=4" %%e in ('diskpart /s "%temp%\diskpart-ltr.tmp" ^| find "*"') do (
                                                if exist "%%e:\" (set "ltr-%%a=%%e:") else (set "ltr-%%a=无法分配")
                                        )
                                )
                        )
                )
        )
)
rem 清理临时文件
del /f /q %dptmp% >nul 2>nul
del /f /q "%temp%\diskpart-ltr.tmp" >nul 2>nul

cls
echo;序号        磁盘        分区        盘符        GPT
echo;------------------------------------------
for /l %%a in (1,1,!n!) do if not "!boot-%%a!"=="未找到" echo;%%a.        !disk-%%a!        !boot-%%a!        !ltr-%%a!        !gpt-%%a!
echo;
echo;       请耐心等待一会儿,等看清ESP分区的盘符后再按下任意键打开“计算机
echo;
echo;窗口”查看ESP分区。
echo;
pause
start "" ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
echo;
echo;       最后请按下任意键退出CMD程序。
echo;
pause

:findbootpartition
        (echo sel disk !disk-%1!
        echo sel part %2
        echo detail part)>%dptmp%
        diskpart /s %dptmp% | find /i "%~3" >nul 2>&1
        if !errorlevel!==0 (set "boot-%1=%2") else (set "boot-%1=未找到")
goto :eof


        Diskgeniu-s有bug:

        在PE里给新硬盘的新分的区分配盘符时,无法给新分的ESP分区分配盘符,分配给ESP分区的盘符被强行分配给了给MSR分区,只有在重启电脑后

才能给新分的ESP分区分配盘符,在这种情况下第2个bat检测出来的ESP分区的所在分区即为GPT硬盘的第2分区,而不是GPT硬盘的第1分区,详见16

楼:

正常情况:



异常情况:




        注意:在个别PE里面,在PE的“计算机窗口”被打开后里面没有显示出被挂载的ESP分区,要点击一下右键——点击一下“刷新”,才能显示出来所挂

载的ESP分区,例如:在微PE  V2.0中就是这样。


        最后感谢众网友的热心帮助,谢谢!!!        
        


作者: nttwqz    时间: 2017-12-22 12:21
本帖最后由 nttwqz 于 2017-12-22 12:47 编辑

我写的不是有现成的脚本?

算了,手机传不了附件,你自己去这儿找吧

http://bbs.wuyou.net/forum.php?m ... p;extra=&page=4
作者: chishingchan    时间: 2017-12-22 13:41
凡是批处理需要生成文件再处理的批处理属次品!虽然最终是完成任务。
作者: feiyike    时间: 2017-12-22 13:58
本帖最后由 feiyike 于 2017-12-22 14:01 编辑


echo assign letter=R>>%temp%\t.txt   //分配指定驱动器号

%SystemRoot%\explorer.exe   ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
作者: lintrainwy    时间: 2017-12-22 14:04
chishingchan 发表于 2017-12-22 13:41
凡是批处理需要生成文件再处理的批处理属次品!虽然最终是完成任务。

主要还是批处理功能太弱了点,不生成文件也是可以的,但是代价是代码变得复杂,每个人需求不同
作者: lintrainwy    时间: 2017-12-22 14:06
如果添加了 explorer 的话,可以用这个打开计算机窗口,参数是逗号:

  1. explorer ,
复制代码

作者: 有阴也有阳    时间: 2017-12-22 15:30
comzhongwy 发表于 2017-12-22 14:06
如果添加了 explorer 的话,可以用这个打开计算机窗口,参数是逗号:

这个在系统里面能够正常地执行,在PE里面却不能打开计算机窗口。
作者: nttwqz    时间: 2017-12-22 19:09
这还用得着结合?

看起来都能挂载的好吧

::设置是否为无盘符的活动分区或EFI分区分配盘符(一般重启会消失),开启:y

set auto=y
上面加个y就会自动分配盘符了

还有个命令可以挂载,不知道WinPE下是否能用
mountvol z: /s
作者: captain_g    时间: 2017-12-22 20:25
楼主可以换一个思路,首先找系统中尚未使用的盘符;

然后直接指定使用这个盘符挂载ESP分区;
作者: 有阴也有阳    时间: 2017-12-22 20:48
本帖最后由 有阴也有阳 于 2017-12-22 20:53 编辑
nttwqz 发表于 2017-12-22 19:09
这还用得着结合?

看起来都能挂载的好吧


mountvol z: /s   ——在微PE  1.2版中不可用,在微PE  2.0版中可用。

我用的那个挂载bat在微PE  1.2版中也可用。

你讲的这个方法我有空再试试。

谢谢指点!!!
作者: 有阴也有阳    时间: 2017-12-22 21:18
nttwqz 发表于 2017-12-22 19:09
这还用得着结合?

看起来都能挂载的好吧

试了一下果然能够自动分配盘符,谢谢!!!
作者: nttwqz    时间: 2017-12-23 08:08
本帖最后由 nttwqz 于 2017-12-23 12:04 编辑
有阴也有阳 发表于 2017-12-22 21:18
试了一下果然能够自动分配盘符,谢谢!!!


既然换成了微PE2.0,mountvol可用,那仅仅挂载esp分区就非常简单了。
  1. @for %%a in (z y w v u t s r q p o n m l k j i h g f e d) do if not exist %%a:\ mountvol %%a: /s && exit
复制代码

作者: 有阴也有阳    时间: 2017-12-23 11:17
feiyike 发表于 2017-12-22 13:58
echo assign letter=R>>%temp%\t.txt   //分配指定驱动器号

%SystemRoot%\explorer.exe   ::{20D04FE0 ...

echo assign letter=R>>%temp%\t.txt   //分配指定驱动器号

——经测试无法显示所挂载的ESP分区的盘符。

                                                谢谢!!!
作者: nttwqz    时间: 2017-12-23 12:50
楼主能不能说一下,ESP分区怎么辨识错误,是位置显示错了?还是识别成了别的不是ESP的分区?ESP分区的识别,是根据分区类型ID来分辨的。

“查找活动及ESP分区_diskpart_find”批处理基于diskpart实现,除了硬盘(也就是最终显示的序号)是从1人工分配的,这是为了更加直观,实际的硬盘显示在第二列,分区显示在第三列,这个都是来自diskpart,我没有修改设定,不一定按顺序,比如我的硬盘就只有0和2,没有1。

最终的序号也并一定按顺序和从1开始,比如你电脑有4块磁盘,像下面这样,那么最终会显示2、4,不是1、2,这是更容易区分启动分区在哪个磁盘

1. 无启动分区
2. 有启动分区
3. 无启动分区
4. 有启动分区


作者: 有阴也有阳    时间: 2017-12-23 13:34
nttwqz 发表于 2017-12-23 12:50
楼主能不能说一下,ESP分区怎么辨识错误,是位置显示错了?还是识别成了别的不是ESP的分区?ESP分区的识别 ...

等我有空给你截个图,一目了然,比用文字说方便。
作者: 有阴也有阳    时间: 2017-12-23 14:10
本帖最后由 有阴也有阳 于 2017-12-24 13:37 编辑
nttwqz 发表于 2017-12-23 12:50
楼主能不能说一下,ESP分区怎么辨识错误,是位置显示错了?还是识别成了别的不是ESP的分区?ESP分区的识别 ...


        bat是正确的,是DG自身有bug:

        1.



        2.



        3.



        4.



        5.


作者: nttwqz    时间: 2017-12-23 15:50
有阴也有阳 发表于 2017-12-23 14:10
1.



你还没明白,我是以Diskpart里面的为标准,不是以DG为标准。即使你DG里面显示的是在第1,到了Diskpart里面显示的是3,就是3不是1,第三方软件显示的分区位置跟我没有关系。

所以你要测试批处理是否错误,应该管理员进入cmd
输入
diskpart
sel disk 0
list part
然后对比一下是否错误,然后截图给我。
作者: 834772509    时间: 2017-12-23 19:20
这么麻烦,论坛搜索:findesp
作者: 有阴也有阳    时间: 2017-12-24 13:39
nttwqz 发表于 2017-12-23 15:50
你还没明白,我是以Diskpart里面的为标准,不是以DG为标准。即使你DG里面显示的是在第1,到了Diskpart里 ...

        bat是正确的,是DG自身有bug,详见第16楼。
作者: feiyike    时间: 2017-12-24 14:26
有阴也有阳 发表于 2017-12-23 11:17
echo assign letter=R>>%temp%\t.txt   //分配指定驱动器号

——经测试无法显示所挂载的ESP分区的盘符 ...


  FOR /F "usebackq tokens=2 delims= " %%i in (` echo list disk ^|diskpart ^| find "磁盘" `) do (
         echo select disk=%%i>%temp%\t.txt
         echo list partition>>%temp%\t.txt
         FOR /F "usebackq tokens=2 delims= " %%j in (` diskpart /s %temp%\t.txt ^| find "系统" `) do (
                 echo select disk=%%i>%temp%\t.txt
                 echo select partition=%%j>>%temp%\t.txt
                 echo assign letter="Q">>%temp%\t.txt
                 diskpart /s %temp%\t.txt>nul
         ) )
pause



FOR /F "usebackq tokens=3 delims= " %%i in (` echo list vol ^|diskpart ^| find "系统" `) do (
         echo %%i
         )  

二选一
作者: feiyike    时间: 2017-12-24 14:34
有阴也有阳 发表于 2017-12-23 11:17
echo assign letter=R>>%temp%\t.txt   //分配指定驱动器号

——经测试无法显示所挂载的ESP分区的盘符 ...

都指定盘符了,还显示什么啊
作者: lintrainwy    时间: 2017-12-26 15:49
新工具

Window引导修复&挂载ESP分区&引导分区文件管理(Legacy+UEFI)
作者: 有阴也有阳    时间: 2017-12-26 16:27
comzhongwy 发表于 2017-12-26 15:49
新工具

Window引导修复&挂载ESP分区&引导分区文件管理(Legacy+UEFI)

谢谢!!!已经下载试用。
作者: 有阴也有阳    时间: 2017-12-26 16:27
comzhongwy 发表于 2017-12-26 15:49
新工具

Window引导修复&挂载ESP分区&引导分区文件管理(Legacy+UEFI)

谢谢!!!已经下载试用。




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