如何获取最近挂载的VHD中系统分区的盘符
如何获取最近挂载的VHD中系统分区的盘符
我懂你的困扰——挂载Windows镜像的VHD后,总会先出现那个50MB左右的微软保留分区,抢了第一个盘符,而你真正需要的是后面那个装着系统的大分区盘符。用分区大小筛选确实是个可行的思路,不过你写的代码还需要调整下,我帮你优化得更准确好用:
方法一:通过分区大小筛选(简单直接)
直接在PowerShell环节就把小分区过滤掉,不用在批处理循环里做判断,效率更高也更不容易出错:
FOR /f "usebackq tokens=*" %%a in (`powershell -c "GET-DISKIMAGE %VIRTUAL_MACHINE_PATH% | GET-DISK | GET-PARTITION | GET-VOLUME | Where-Object { $_.Size -gt 1GB } | Select-Object -ExpandProperty DriveLetter"`) DO SET VIRTUAL_DISK_LETTER=%%a echo %VIRTUAL_DISK_LETTER%
- 这里用
Where-Object { $_.Size -gt 1GB }直接筛掉小于1GB的分区,毕竟微软保留分区只有50MB左右,系统分区肯定远大于这个值 - 加上
tokens=*是为了避免盘符前后的空格影响变量赋值 - 如果你觉得1GB的阈值不合适,可以改成
500MB或者具体字节数,PowerShell支持KB、MB、GB、TB这些单位缩写
方法二:通过系统文件夹判断(更精准)
如果担心分区大小判断可能误判(比如某些精简系统分区比较小),可以直接检查分区里是否有Windows文件夹,这个方法更稳妥:
FOR /f "usebackq tokens=*" %%a in (`powershell -c "GET-DISKIMAGE %VIRTUAL_MACHINE_PATH% | GET-DISK | GET-PARTITION | GET-VOLUME | ForEach-Object { if (Test-Path (Join-Path $_.DriveLetter ':' '\Windows')) { $_.DriveLetter } }"`) DO SET VIRTUAL_DISK_LETTER=%%a echo %VIRTUAL_DISK_LETTER%
这个逻辑会遍历所有挂载的分区,找到包含\Windows文件夹的那个,直接返回它的盘符,完全不会错判。
备注:内容来源于stack exchange,提问作者qloq
相关产品推荐
相关产品推荐

