脚本代码下面自取,建议用第三版或第五版代码,复制进记事本,记事本后缀修改为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格拉满,当然,不喜欢黑框框也可以让它不显示黑框框。