【windows】开机自启一键自动挂载vhdx(支持bitlocker加密)虚拟磁盘并直接在命令行解锁bitlocker,自动提权管理员身份运行bat脚本&&vhdx虚拟磁盘文件压缩代码

本文详细介绍了如何使用bat脚本在Windows系统中自动挂载虚拟硬盘,包括不同版本的脚本,如使用diskpart进行挂载,以及增强安全性(BitLocker加密)和便携性的方法。作者分享了从简单版本到包含密码输入和自动弹出的完整解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

脚本代码下面自取,建议用第三版或第五版代码,复制进记事本,记事本后缀修改为bat文件,把这个文件放到同vhdx文件的目录下即可双击运行

为什么要用虚拟磁盘:

1、用来给某些软件拉屎用。你们使用一些国产软件的时候,是否碰到过他们在你的磁盘根目录里乱拉屎(乱创建文件夹)的现象,这些软件专挑容量最大的磁盘去拉屎,正好windows的虚拟磁盘最大可以设置到64TB辣么大

2、无敌的安全性。一些重要的资料放在用bitlocker加密后的虚拟磁盘,平常磁盘不挂载到系统,在资源管理器里看不到这个磁盘,就算虚拟磁盘挂载,有bitlocker也不可能进入磁盘。

3、便携性。使用只需要双击挂载即可当作正常的磁盘来使用,没有任何区别,配上开机自动挂载脚本,那就完全不用管拉。不挂载之前就和普通文件一样,可以随时整体复制移动走,也方便到处备份

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

跑题了。。

自动挂载虚拟磁盘脚本代码:

如何自动挂载虚拟磁盘?用diskpart工具。先用命令创建diskpart使用的挂载磁盘指令文件,用diskpart执行这个文件里的指令。

第一版:简单版

echo select vdisk "C:\文件路径\文件名.vhdx" > temp_diskpart_script.txt
echo attach vdisk >> temp_diskpart_script.txt

:: 运行diskpart来执行临时脚本
diskpart /s temp_diskpart_script.txt

:: 删除临时脚本文件
del temp_diskpart_script.txt

这是第一版,需要邮件以管理员权限运行(麻烦),另外实测脚本文件放在和虚拟磁盘同目录下才不会出现挂载没反应的bug,所以有了第二版

第二版:自动寻找当前目录下的磁盘挂载

setlocal enabledelayedexpansion

:: 寻找当前目录中的后缀为 .vhdx 的文件
set "search_dir=%~dp0"
set "extension=.vhdx"
set "vhdx_file="

for %%f in ("%search_dir%*%extension%") do (
    set "vhdx_file=%%~nxf"
    goto :MountDisk
)

:MountDisk
if not defined vhdx_file (
    echo 未找到后缀为 .vhdx 的文件
    goto :End
)

set DiskFile=%vhdx_file%
set DiskLabel=MyVirtualDisk

:: 创建一个包含diskpart命令的临时脚本文件
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo attach vdisk >> temp_diskpart_script.txt

:: 运行diskpart来执行临时脚本
diskpart /s temp_diskpart_script.txt

:: 删除临时脚本文件
del temp_diskpart_script.txt

echo 磁盘已挂载到 %DiskLabel%

:End
endlocal

bat文件放到和虚拟磁盘同目录下,脚本检测当前目录中的虚拟磁盘文件,检测到,直接跳转挂载命令,这里设了个for循环,这个目录下的所有虚拟磁盘文件都会被挂载

那么还有需要右键以管理员权限运行的麻烦事,直接加上我的上一篇发的cmd提权代码,完整可用版的bat脚本就出来了:

第三版:无需以管理员身份运行,直接双击就能用

@echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"



setlocal enabledelayedexpansion

:: 寻找当前目录中的后缀为 .vhdx 的文件
set "search_dir=%~dp0"
set "extension=.vhdx"
set "vhdx_file="

for %%f in ("%search_dir%*%extension%") do (
    set "vhdx_file=%%~nxf"
    goto :MountDisk
)

:MountDisk
if not defined vhdx_file (
    echo 未找到后缀为 .vhdx 的文件
    goto :End
)

set DiskFile=%vhdx_file%
set DiskLabel=MyVirtualDisk

:: 创建一个包含diskpart命令的临时脚本文件
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo attach vdisk >> temp_diskpart_script.txt

:: 运行diskpart来执行临时脚本
diskpart /s temp_diskpart_script.txt

:: 删除临时脚本文件
del temp_diskpart_script.txt

echo 磁盘已挂载到 %DiskLabel%

:End
endlocal

↑↑↑↑↑↑↑↑↑这个版本适合直接放在开机启动文件夹里或者任务计划程序中让系统开机自动挂载磁盘

代码写到这,既然为了安全性,在挂载后让命令行先不消失,等待我在命令行按任意键后自动弹出虚拟磁盘

第四版:添加自动弹出磁盘代码

@echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"




setlocal enabledelayedexpansion

:: 寻找当前目录中的后缀为 .vhdx 的文件
set "search_dir=%~dp0"
set "extension=.vhdx"
set "vhdx_file="

for %%f in ("%search_dir%*%extension%") do (
    set "vhdx_file=%%~nxf"
    goto :MountDisk
)

:MountDisk
if not defined vhdx_file (
    echo 未找到后缀为 .vhdx 的文件
    goto :End
)

set DiskFile=%vhdx_file%
set DiskLabel=MyVirtualDisk

:: 创建一个包含diskpart命令的临时脚本文件
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo attach vdisk >> temp_diskpart_script.txt

:: 运行diskpart来执行临时脚本
diskpart /s temp_diskpart_script.txt

:: 删除临时脚本文件
del temp_diskpart_script.txt

echo 磁盘已挂载到 %DiskLabel%

:: 等待用户输入
pause

:: 卸载(弹出)虚拟磁盘
echo 卸载虚拟磁盘 %DiskLabel%
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo detach vdisk >> temp_diskpart_script.txt
diskpart /s temp_diskpart_script.txt
del temp_diskpart_script.txt

echo 虚拟磁盘已从 %DiskLabel% 已卸载

:End
endlocal

如果虚拟磁盘带BitLocker,可以在执行脚本的终端中输入密码然后解锁BitLocker再自动打开这个虚拟磁盘,代码如下

第五版 完整版:一键自动挂载,输入密码解锁BitLocker,自动弹出

@echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"




setlocal enabledelayedexpansion

:: 寻找当前目录中的后缀为 .vhdx 的文件
set "search_dir=%~dp0"
set "extension=.vhdx"
set "vhdx_file="

for %%f in ("%search_dir%*%extension%") do (
    set "vhdx_file=%%~nxf"
    goto :MountDisk
)

:MountDisk
if not defined vhdx_file (
    echo 未找到后缀为 .vhdx 的文件
    goto :End
)

set DiskFile=%vhdx_file%
set DiskLabel=MyVirtualDisk

:: 创建一个包含diskpart命令的临时脚本文件
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo attach vdisk >> temp_diskpart_script.txt

:: 运行diskpart来执行临时脚本
diskpart /s temp_diskpart_script.txt

:: 删除临时脚本文件
del temp_diskpart_script.txt

echo 磁盘已挂载到 %DiskLabel%


:: 输入 BitLocker 密码
echo 输入解锁这个隐藏在电脑里的秘密磁盘
manage-bde -unlock X: -password

:: 打开磁盘
start X:\


:: 等待用户输入
echo 按任意键拔掉这个非常非常非常牛逼的磁盘
pause

:: 卸载(弹出)虚拟磁盘
echo 卸载虚拟磁盘 %DiskLabel%
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo detach vdisk >> temp_diskpart_script.txt
diskpart /s temp_diskpart_script.txt
del temp_diskpart_script.txt

echo 虚拟磁盘已从 %DiskLabel% 已卸载

:End
endlocal

完。

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

附加一点另外的东西:

虚拟磁盘中删除了文件以后(回收站也清掉的那种)vhdx虚拟磁盘文件并不会变小,所以需要用到hyper-v中的清理虚拟磁盘的功能,带提权代码的代码如下,bat脚本放虚拟磁盘文件目录里就能直接运行。可以把这个代码加到开机自动挂载虚拟磁盘的bat的前面。?

清理压缩虚拟磁盘

echo 提权ing
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
echo 提权完成emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
::↑提权


setlocal enabledelayedexpansion

:: 寻找当前目录中的后缀为 .vhdx 的文件
set "search_dir=%~dp0"
set "extension=.vhdx"
set "vhdx_file="

for %%f in ("%search_dir%*%extension%") do (
    set "vhdx_file=%%~nxf"
    goto :MountDisk
)

:MountDisk
if not defined vhdx_file (
    echo 未找到后缀为 .vhdx 的文件
    goto :End
)

set DiskFile=%vhdx_file%
set DiskLabel=MyVirtualDisk


:: 创建一个包含diskpart命令的临时脚本文件
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo attach vdisk readonly >> temp_diskpart_script.txt

:: 运行diskpart来执行临时脚本
diskpart /s temp_diskpart_script.txt

:: 删除临时脚本文件
del temp_diskpart_script.txt

echo 磁盘已挂载(只读)到 %DiskLabel%

:: 创建 PowerShell 脚本文件
echo Optimize-VHD -Path "%~dp0%DiskFile%" -Mode Full > OptimizeVHD.ps1

:: 运行 PowerShell 脚本
powershell -ExecutionPolicy Bypass -File OptimizeVHD.ps1

:: 删除 PowerShell 脚本文件
del OptimizeVHD.ps1

:: 卸载(弹出)虚拟磁盘
echo 卸载虚拟磁盘 %DiskLabel%
echo select vdisk file="%~dp0%DiskFile%" > temp_diskpart_script.txt
echo detach vdisk >> temp_diskpart_script.txt
diskpart /s temp_diskpart_script.txt
del temp_diskpart_script.txt

echo 虚拟磁盘 %DiskLabel% 已成功压缩回收空间并卸载

:End
endlocal

没了

我写这个文章的目的是为了记录自己在日常使用电脑中,为了更方便的使用windows系统而折腾研究出来的小技巧,很多时候想在系统中实现一些自动化功能通过bat文件来实现真的很方便,bat脚本运行的时候代码在黑框框里滚动的样子也确实b格拉满,当然,不喜欢黑框框也可以让它不显示黑框框。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值