[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]用批处理完成右键加载VHD文件的另类方法

本帖最后由 大地 于 2024-6-24 20:58 编辑

[已解决]用批处理完成右键加载VHD文件的另类方法
谢谢大佬!!

首选是大佬的功劳,谢谢大佬

现在把它重新整理一下,以作备用。
=========================================================================
①   reg文件:(成功的右键菜单)

Windows Registry Editor Version 5.00


[HKEY_CLASSES_ROOT\*\shell\KLoadvhd1]
@="右键加载VHD √"
"Icon"="C:\\PET00LSS\\Allother\\RightMenu\\disk131.ico"

[HKEY_CLASSES_ROOT\*\shell\KLoadvhd1\command]
@="\"C:\\PET00LSS\\Allother\\RightMenu\\RightLoadVHD.bat\" %1"



[HKEY_CLASSES_ROOT\*\shell\LKillvhd1]
@="右键卸载VHD ×"
"Icon"="C:\\PET00LSS\\Allother\\RightMenu\\disk131.ico"

[HKEY_CLASSES_ROOT\*\shell\LKillvhd1\command]
@="\"C:\\PET00LSS\\Allother\\RightMenu\\RightkillVHD.bat\" %1

==========================================================================

②   右键加载VHD,  RightLoadVHD.bat
@echo off
@echo off
color 2f
cls
mode con:cols=70 lines=40
cls

set "_comline_= echo Select vdisk file=%1 & echo attach vdisk & echo select partition 1 & echo assign letter=Y"
(%_comline_%) | diskpart
exit /b

=========================================================================

③   右键卸载VHD,RightkillVHD.bat
@echo off
color 2f
cls
mode con:cols=70 lines=40
cls

set "_comline_= echo Select vdisk file=%1 & 以echo detach vdisk"
(%_comline_%) | diskpart
exit /b


=========================================================================

以下是自动批处理加载卸载加载卸载加载卸载
批处理一键加载及卸载VHD.bat

@echo off
@echo off
color 2f
cls
mode con:cols=70 lines=40
cls
:ne1是退出卸载VHD
::one2是加载VHD,反复点击本批处理,是加载退出加载退出...
::把本批处理放在与VHD文件同一目录下


cd /d %~dp0

if exist "Y:\" goto one1
if not exist "Y:\" goto one2

:one1
@echo off

for /f "tokens=*" %%i in ('dir /s /b *.vhd') do (
echo %%i
Set file="%%i"
)
set "_comline_= echo Select vdisk file=%file% & echo detach vdisk"
(%_comline_%) | diskpart
exit /b


:one2
@echo off

for /f "tokens=*" %%i in ('dir /s /b *.vhd') do (
echo %%i
Set file="%%i"
)
set "_comline_= echo Select vdisk file=%file% & echo attach vdisk & echo select partition 1 & echo assign letter=Y"
(%_comline_%) | diskpart
exit /b


===============================================================

需要更多的要求参照以下7楼、8楼、10楼等多位大佬的优秀代码去研发拓展
我也是在不断向他们学习中.........

再次谢谢大佬们!

.....................
====================================================================

思路:
在任意文件夹中任意文件名的VHD文件

①A.bat内容:
  1. cd /d %~dp0
  2. dir /b *.vhd>111.txt
复制代码
在111.txt中获取VHD的文件名


②B.bat内容:
  1. @echo off
  2. echo %CD%>222.txt
复制代码
在222.txt中获取VHD的文件所在完整路径


③renvol.txt内容:
  1. Select vdisk file="C:\VHD\TooL.VHD"
  2. attach vdisk
  3. select partition 1
  4. assign letter=Y
  5. exit
复制代码
④变更
把renvol.txt中的TooL.VHD文件名替换成上面111.txt中获取的VHD文件名
把renvol.txt中的 C:\VHD 路径替换成上面222.txt中获取的VHD文件完整路径名

⑤加载VHD
  1. @echo off
  2. diskpart /s renvol.txt
  3. exit
复制代码
请大佬能不能把上面的语句合并成一个单个的批处理文件名,这样我就能制作右键菜单了(只要把批处理转成EXE就行了)

缺陷:A:如果文件夹中存在多个VHD怎么办,最好是鼠标点击的VHD文件生成它对应的文件名及它的完整路径
         B:我是指定生成的Y盘,如果已存在Y盘 不知该怎么处理了,啊。
         C:不知道这个右键思路可行吗?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. set "_comline_= echo Select vdisk file=%1 & echo attach vdisk & echo select partition 1 & echo assign letter=Y"
  3. (%_comline_%) | diskpart
复制代码
1

评分人数

TOP

回复 2# newswan


    厉害了,我就没看懂楼主要做什么

QQ 20147578

TOP

回复 3# czjt1234


经常有看不懂的题目

TOP

本帖最后由 大地 于 2024-6-21 22:40 编辑

回复 2# newswan


    @echo off

set "_comline_= echo Select vdisk file="D:\VHD\TooLs.VHD" & echo attach vdisk & echo select partition 1 & echo assign letter=Y"
(%_comline_%) | diskpart

谢谢大佬  上面命令是成功的,但因D:\VHD\TooLs.VHD名称的不确定性及路径地址的不确定性,我改成了下面还是不行,哪里搞错了,请大佬再修改一下,谢谢

for /f "tokens=*" %%i in ('dir /s /b *.vhd') do (
echo %%i

set "_comline_= echo Select vdisk file="%%i" & echo attach vdisk & echo select partition 1 & echo assign letter=Y"
(%_comline_%) | diskpart

)
exit /b

((主要把本批处理命令文件放在VHD旁边 ,直接点击批处理就能加载VHD文件,不需要其它软件或管理工具中去挂载了))

TOP

将2楼代码保存为bat
然后直接添加右键的注册表就行了
(注册表中带上参数调用上面的bat,bat中%1会自动变成路径地址,路径中的空格跟特殊字符自己自行处理)

TOP

本帖最后由 newswan 于 2024-6-21 23:33 编辑
  1. for /f "tokens=*" %%i in ('dir /s /b *.vhd') do (
  2. echo %%i
  3. Set file="%%i"
  4. )
  5. set "_comline_= echo Select vdisk file=%file% & echo attach vdisk & echo select partition 1 & echo assign letter=Y"
  6. (%_comline_%) | diskpart
复制代码

TOP

回复 5# 大地

改成这样试试。

不过如果同级目录或子目录下有多个vhd,这命令会一次性全部加载。
  1. @echo off
  2. for /f "delims=" %%i in ('dir /s /b *.vhd') do (call :vhd "%%i")
  3. exit
  4. :vhd
  5. set "_comline_= echo Select vdisk file="%~1" & echo attach vdisk & echo select partition 1 & echo assign letter=Y"
  6. (%_comline_%) | diskpart
复制代码

TOP

回复 8# ppll2030

因为挂载的盘符已经定位在Y盘,所以无法同时挂载多个VHD,只是测试好像挂载最后一个VHD。 要同时挂载多个VHD,可能还得设个变量。

TOP

本帖最后由 aloha20200628 于 2024-6-22 11:35 编辑

回复 1# 大地

给一个多对策版本...
一》用 yzxwvuts... 逆序适配第一个空盘符
二》若命令行指定或直接拖入一个挂载文件给本批,则跳转[main]处理完成
三》否则搜索当前目录(包含子目录)中全部*.vhd文件,若发现多个(>1)则须指定其中一个序号确认,若未发现任何挂载文件则直接退出本批
四》如需删除renvol.txt,抹去代码第18行首 REM 关键字即可
  1. @echo off &setlocal enabledelayedexpansion
  2. set "d=yzxwvutsrqponmlkjihgfed"
  3. :[next]
  4. if exist "!d:~,1!:\" (set "d=!d:~1!" & goto[next])
  5. set "_d=!d:~,1!"&set/a "n=0,k=1"
  6. if exist "%~1" (set "_1=%~1" & goto[main])
  7. for /r %%F in (*.vhd) do (set/a "n+=1"&set "_!n!=%%F")
  8. if !n! gtr 1 (
  9. for /L %%k in (1,1,!n!) do echo,%%k: !_%%k!
  10. set/p "k=用行首序号指定一个挂载文件:"
  11. ) else if !n! equ 0 (endlocal&exit/b)
  12. :[main]
  13. echo,Select vdisk file="!_%k%!">"renvol.txt"
  14. (for %%s in (
  15. "attach vdisk", "select partition 1", "assign letter=!_d!", "exit") do (echo,%%~s)
  16. )>>"renvol.txt"
  17. diskpart /s "renvol.txt"
  18. REM del /q "renvol.txt"
  19. endlocal&pause&exit/b
复制代码

TOP

回复 10# aloha20200628

谢谢大神,语句代码有点深奥,慢慢去学习。

TOP

如果完整设计一下,多个 vhd ,一个 vhd 中 多个分区,分区有 efi msr ntfs ,哪些要分配盘符,盘符怎么分配?

TOP

回复 9# 大地


    你试一下就知道了。Y被占用了。也会自动分配的

TOP

返回列表