无忧启动论坛

标题: VHD挂载后如何确定盘符 [打印本页]

作者: freesoft00    时间: 2024-11-9 21:24
标题: VHD挂载后如何确定盘符
diskpart创建一个vhd磁盘,然后分区格式化,然后assign letter=v可以指定盘符


如果是现成的vhd文件,直接批处理加载
SELECT VDISK FILE="c:\test\test.vhd"
attach vdisk(此时盘符就已经加载了)
assign letter=v(在用assign指定盘符就不起作用了)




因为我需要加载vhd,确定这个盘符比如是e,比如是g,或者指定为我指定的盘符,比如是v,
这样好后续执行这个盘符中的程序,比如v:\test.exe

作者: 窄口牛    时间: 2024-11-9 21:59
大概率得先删除现在的盘符,再分配新的盘符。
作者: 527104427    时间: 2024-11-9 22:00
用PECMD吧


set^ ForceLocal=1
set^ EnviMode=1
set file0=C:\test\test.vhd
fdrv -rsort drv0=*:
forx *v drv0,drv,
{
        part list dep %drv%,file
        find *file=file0,
        {
                exec %drv%\test.exe
                exit
        }












作者: freesoft00    时间: 2024-11-9 22:18
本帖最后由 freesoft00 于 2024-11-9 22:22 编辑
527104427 发表于 2024-11-9 22:00
用PECMD吧

好的多谢!我在windows下面用,无所谓,pecmd也可以,ahk也可以,批处理也可以,只要能达到效果就行。
我现在是尽量少用vbs,一个是自己不懂,第二是新windows禁用了
我测试一下效果
我其实是封装系统部署进系统后加载vhd虚拟磁盘,然后安装里面的软件


我目前使用的软件安装器是比较古老的xp实在的软件安装器,只能一个一个的软件安装。
等待的时间比较长,其实有些软件是可以同时安装的,就像现在的驱动安装工具是多线程同时安装。
但是有些软件是不能同时安装的,比如微软的一下msi程序,还有其它一些。这个就单独的一个一个安装

作者: baby1277    时间: 2024-11-9 22:27
本帖最后由 baby1277 于 2024-11-10 09:49 编辑

@echo off
:: 挂载VHD前列举所有盘符来创建临时文件夹
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i: md temp\%%i
:: 挂载VHD磁盘
echo SELECT VDISK FILE="c:\test\test.vhd" >mount1.txt
echo attach vdisk >>mount1.txt
diskpart /s mount1.txt >nul 2>nul
:: 挂载VHD后列举所有盘符来创建临时文件夹,能成功创建文件夹就是新增的VHD盘符。
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i: md temp\%%i 2>nul&& set pan=%%i
:: 运行指定程序
start ""  "%pan%:\test.exe"
:: 删除临时文件
del /f /q mount1.txt
rd /s /q temp
pause

作者: hlowld    时间: 2024-11-9 22:34
::获取挂载前的盘符列表
for /f "tokens=1-4" %%a in ('wmic logicaldisk get caption') do (
    set "preMountDisks=!preMountDisks! %%a"
)
::挂载
(
echo select vdisk file="xx.vhdx"
echo attach vdisk
) | diskpart >nul 2>nul
::获取挂载后的盘符列表
for /f "tokens=1-4" %%a in ('wmic logicaldisk get caption') do (
    set "postMountDisks=!postMountDisks! %%a"
)
::比较前后盘符列表,得到挂载后的新盘符
set "newDriveLetter="
for %%a in (!postMountDisks!) do (
    set "found=false"
    for %%# in (!preMountDisks!) do if /i "%%#"=="%a" set "found=true"
    if "!found!"=="false" set "newDriveLetter=%%a"
)
echo New drive letter is: %newDriveLetter%

之前也考虑过这个问题,写了这个可用,但wmic快要被弃用了,pecmd应该是兼容性更好的方案
作者: szwp    时间: 2024-11-9 22:50
多区多盘符
作者: freesoft00    时间: 2024-11-9 23:06
hlowld 发表于 2024-11-9 22:34
::获取挂载前的盘符列表
for /f "tokens=1-4" %%a in ('wmic logicaldisk get caption') do (
    set "p ...

这个问题原来好像是在论坛中请教过,dos菜鸟 兄弟好像是给过答案,思路就是先列一下盘符,挂载后再列一下盘符,新增加的就是vhd的,好像是没有用wmic,因为太早了忘记了。也不记得原来问过没有了。
作者: freesoft00    时间: 2024-11-9 23:12
szwp 发表于 2024-11-9 22:50
多区多盘符

嗯,是有这个问题,但是因为vhd是自己创建的,所以一般是单分区,多分区了自己给自己找麻烦了

一开始我使用iso作为软件库的存放文件,但是有时候在安装win7的时候会遇到比较尴尬的局面,它默认不支持iso的挂载,而我要安装的软件比如winrar还在iso中,这样我就需要在U盘中备一个winrar或者imdisk好安装这个后解压缩iso再安装里面的软件。而U盘没有写保护有时候带着exe程序插来插去的容易中毒。

所以现象干脆改成vhd算了。win7也可以加载,win10也可以加载。

我是创建了一个开机批处理,部署后进入到桌面批处理加载vhd,然后调用其中的软件安装器再安装软件和驱动
作者: 527104427    时间: 2024-11-9 23:52
freesoft00 发表于 2024-11-9 22:18
好的多谢!我在windows下面用,无所谓,pecmd也可以,ahk也可以,批处理也可以,只要能达到效果就行。
...



这样的话,用PECMD挂载更快,找盘符也更快更精准,也不用diskpart了,启动太慢。

set^ ForceLocal=1
set^ EnviMode=1
set file0=C:\test\test.vhd
moun-vhd %file0%,,,ret
mstr* * disk,err=<1*>ret
ifex $%err%=0,
{
        part list part %disk%,part0
        sed -ex part0=0,[-\@\=][0-9+]*[ ]*,,part0
        forx *v part0,part,
        {
                part -iv=8 list part %disk%:%part%,drv
                find *<>drv,
                {
                        exec =%drv%\test1.exe
                        exec =%drv%\test2.exe
                        exec =%drv%\test3.exe
                        exec =%drv%\test4.exe
                        exec =%drv%\test5.exe
                        exec =%drv%\test6.exe
                }
        }
}
exit







作者: freesoft00    时间: 2024-11-10 02:47
527104427 发表于 2024-11-9 23:52
这样的话,用PECMD挂载更快,找盘符也更快更精准,也不用diskpart了,启动太慢。

set^ ForceLocal ...

测试可以
作者: wang1126    时间: 2024-11-10 06:47
谢谢10楼分享
作者: nttwqz    时间: 2024-11-10 09:00
楼主想的过于复杂了,只需在vhd内建立一个特定名称的文件(夹/路径),然后去遍历就好。
作者: fruds9981    时间: 2024-11-10 09:49
标记以方便后续学习
作者: freesoft00    时间: 2024-11-10 10:09
hlowld 发表于 2024-11-9 22:34
::获取挂载前的盘符列表
for /f "tokens=1-4" %%a in ('wmic logicaldisk get caption') do (
    set "p ...

代码测试也ok,开始没成功,忘记加变量延迟了,加了后可以了
作者: freesoft00    时间: 2024-11-10 10:09
nttwqz 发表于 2024-11-10 09:00
楼主想的过于复杂了,只需在vhd内建立一个特定名称的文件(夹/路径),然后去遍历就好。

嗯,这样也可以。
作者: szwp    时间: 2024-11-10 10:12
freesoft00 发表于 2024-11-9 23:12
嗯,是有这个问题,但是因为vhd是自己创建的,所以一般是单分区,多分区了自己给自己找麻烦了

一开始 ...

挂载wim不需盘符,玩diskpart可试list part或list vol,特定vhd可设置特定卷标
作者: freesoft00    时间: 2024-11-10 10:27
szwp 发表于 2024-11-10 10:12
挂载wim不需盘符,玩diskpart可试list part或list vol,特定vhd可设置特定卷标

搜索卷标也是一个办法。
没有选择wim是因为,默认它没有gui窗口,命令行加载没有问题,有时候懒了,在系统中vhd直接在磁盘管理器中挂载不用输入命令了。软件盘有时候会单独用,所以不都是命令行调用所以现在了vhd
作者: slore    时间: 2024-11-10 14:07
正常系统?
那费劲什么pecmd代码。。。
1行代码的事。

https://learn.microsoft.com/en-u ... indowsserver2022-ps

Example 3
PowerShell
  1. PS C:\> Mount-VHD -Path c:\test\testvhdx -PassThru | Get-Disk | Get-Partition | Get-Volume
复制代码


Attaches a virtual hard disk to the system where the path to the virtual hard disk file is c:\test\testvhdx.vhdx, and gets the volumes associated with it.
作者: guong    时间: 2024-11-10 15:51
来了解下了
作者: szwp    时间: 2024-11-10 16:30
freesoft00 发表于 2024-11-10 10:27
搜索卷标也是一个办法。
没有选择wim是因为,默认它没有gui窗口,命令行加载没有问题,有时候懒了,在系 ...

办法太多了,适合自己的自己试
作者: liuyixin0302    时间: 2024-11-10 17:02
路过 。。。
作者: 489432757    时间: 2024-11-10 17:07
slore 发表于 2024-11-10 14:07
正常系统?
那费劲什么pecmd代码。。。
1行代码的事。

win7和xp能一行ps命令搞成吗?
大佬你貌似歧视pecmd啊,不管白猫黑猫,能逮老鼠就是好猫嘛,不知道为什么要捧一贬一,实在是不懂,搞技术的不都是有容乃大吗?
作者: slore    时间: 2024-11-10 17:42
489432757 发表于 2024-11-10 17:07
win7和xp能一行ps命令搞成吗?
大佬你貌似歧视pecmd啊,不管白猫黑猫,能逮老鼠就是好猫嘛,不知道为什么 ...

>win7和xp能一行ps命令搞成吗?

xp的时候还没VHD吧,WIN7也许可以吧,都是10年不用的系统了,自己要用的话得测试一下。
powershell也有单独的安装包。

>大佬你貌似歧视pecmd啊

在PE做初始化,写小工具还行,正常系统选择多了去了。
pecmd好用么?题主又没限定必须pecmd来做,不是么。

工欲善其事,必先利其器啊。
在适合的场景选择合适的工具。pecmd的代码24行,powershell的代码1行,意思也很明确,
正常系统上不用费劲写pecmd代码,直接用系统自带powershell有什么问题?

没有歧视pecmd,只是觉得它不好用。pecmd的代码编写不费劲么? 事实不能讲么。
这有什么一捧一贬。pecmd都成信仰了么。对我来说不过是个工具,好用工具,不好工具,
方便工具罢了。
作者: 489432757    时间: 2024-11-10 18:00
slore 发表于 2024-11-10 17:42
>win7和xp能一行ps命令搞成吗?

xp的时候还没VHD吧,WIN7也许可以吧,都是10年不用的系统了,自己要用 ...

了解。
我的信仰是什么,我自己都不清楚。
但我挺好奇的,想知道你此时此刻的心理状态。
技术我方面我是小白,此生也无望成为你一样的大佬,研究技术不行,那就换个方向吧,研究一下大佬们的心理状态
作者: nttwqz    时间: 2024-11-10 18:23
我看了一下,attach vdisk有个NODRIVELETTER参数,可以不分配盘符。

先确定空闲盘符
然后连接虚拟磁盘
选择分区,你自己的虚拟磁盘文件,哪些分区需要分配盘符,可事先确定,不用判断
assign分配你指定的空闲盘符
重复操作分配其它分区盘符

至于7-11是否全部有这个参数,你得自己测试。
作者: captain_g    时间: 2024-11-10 19:20
以前也遇到楼主的问题,后来在论坛找到了解决方法,亲测成功的!

大致命令是这样的(懒得改了,批处理中拷贝的一行),主要是为了说明问题:

cmd /c "echo select vdisk file="%a%" & echo attach vdisk & echo sel par 1 & echo assign letter=%ltr_av%" |diskpart.exe

最关键的地方是: 先要 sel par 1 然后再 assign letter

我的vhd是单分区的,没试过多分区的情形
作者: szwp    时间: 2024-11-10 19:27
可以培养不用盘符访问的习惯
作者: freesoft00    时间: 2024-11-10 20:33
本帖最后由 freesoft00 于 2024-11-10 21:53 编辑
captain_g 发表于 2024-11-10 19:20
以前也遇到楼主的问题,后来在论坛找到了解决方法,亲测成功的!

大致命令是这样的(懒得改了,批处理中 ...

好,应该就是少了一条指令sel par 1
作者: freesoft00    时间: 2024-11-10 20:36
slore 发表于 2024-11-10 17:42
>win7和xp能一行ps命令搞成吗?

xp的时候还没VHD吧,WIN7也许可以吧,都是10年不用的系统了,自己要用 ...

ps倒也不是问题,因为我封装的是win10,加载后自动调用。所以ps也不是问题。


并不是xp、win7、win10多种环境,其它的win7单独用我可以单独磁盘管理手动加载。
而xp系统已经好几年没有安装过了,现在大部分起步都是win10了,win7都装的少了
作者: szwp    时间: 2024-11-11 07:42
freesoft00 发表于 2024-11-10 20:33
好,应该就是少了一条指令sel par 1

练习lis par,不选择分区分配不了,多看错误信息
作者: szwp    时间: 2024-11-11 08:40
hlowld 发表于 2024-11-9 22:34
::获取挂载前的盘符列表
for /f "tokens=1-4" %%a in ('wmic logicaldisk get caption') do (
    set "p ...

试试这个还能用么

fsutil fsinfo drives
作者: 孟仁飞    时间: 2024-11-11 09:26
学习
作者: liuyixin0302    时间: 2024-11-11 12:56
路过学习
作者: ppll2030    时间: 2024-11-11 13:22
不管是新创建,还是现有的,都可以直接指定盘符加载。
(echo Select vdisk file="c:\test\test.vhd" & echo attach vdisk & echo select partition 1 & echo assign letter=V) | diskpart
作者: cqh    时间: 2024-11-11 13:34
学习




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