|
磁盘分区显示与隐藏工具- @ECHO OFF
- Title 磁盘分区显示与隐藏工具 (支持MBR和GPT)
- mode con lines=36 cols=74
- color 1f
- setlocal enabledelayedexpansion
- :: 设置临时目录
- set "TEMPDIR=%TEMP%\DiskPartTool"
- if not exist "%TEMPDIR%" mkdir "%TEMPDIR%"
- :: 获取管理员权限
- >NUL 2>&1 REG.exe query "HKU\S-1-5-19" || (
- ECHO SET UAC = CreateObject^("Shell.Application"^) > "%TEMPDIR%\Getadmin.vbs"
- ECHO UAC.ShellExecute "%~f0", "%*", "", "runas", 1 >> "%TEMPDIR%\Getadmin.vbs"
- CSCRIPT //Nologo "%TEMPDIR%\Getadmin.vbs"
- DEL /f /q "%TEMPDIR%\Getadmin.vbs" 2>NUL
- Exit /B
- )
- :MAIN_MENU
- cls
- echo.
- echo 当前磁盘列表:
- echo list disk > "%TEMPDIR%\DiskPart.txt"
- echo exit >> "%TEMPDIR%\DiskPart.txt"
- diskpart /s "%TEMPDIR%\DiskPart.txt" | find /v "Copyright" | find /v "DiskPart" | find /v "计算机上" | find /v "退出" > "%TEMPDIR%\DiskList.txt"
- :: 显示磁盘列表(过滤无关行)
- type "%TEMPDIR%\DiskList.txt"
- :GET_DISK_NUMBER
- echo.
- set "choiceDisk="
- set /p "choiceDisk=请输入要操作的磁盘编号:"
- if not defined choiceDisk goto GET_DISK_NUMBER
- :: 检查输入是否全为数字
- set "isValid=1"
- for /f "delims=0123456789" %%c in ("%choiceDisk%") do set "isValid=0"
- if "%isValid%"=="0" (
- echo 错误:请输入有效的数字!
- goto GET_DISK_NUMBER
- )
- :: 检查磁盘是否存在
- set "diskFound=0"
- for /f "tokens=1,2,3,4,5,6,7,8*" %%a in ('type "%TEMPDIR%\DiskList.txt"') do (
- if "%%a"=="磁盘" (
- set "diskNum=%%b"
- if "!diskNum!"=="%choiceDisk%" (
- set "diskFound=1"
- if "%%h"=="*" (
- set "isGPT=1"
- ) else (
- set "isGPT=0"
- )
- )
- )
- )
- if "%diskFound%"=="0" (
- echo 错误:磁盘 %choiceDisk% 不存在!
- goto GET_DISK_NUMBER
- )
- :: 获取分区列表
- echo select disk %choiceDisk% > "%TEMPDIR%\DiskPart.txt"
- echo list partition >> "%TEMPDIR%\DiskPart.txt"
- echo exit >> "%TEMPDIR%\DiskPart.txt"
- diskpart /s "%TEMPDIR%\DiskPart.txt"
- :GET_PARTITION_NUMBER
- echo.
- set /p "partitionNum=请输入要操作的分区编号:"
- if not defined partitionNum goto GET_PARTITION_NUMBER
- :: 检查输入是否全为数字
- set "isValid=1"
- for /f "delims=0123456789" %%c in ("%partitionNum%") do set "isValid=0"
- if "%isValid%"=="0" (
- echo 错误:请输入有效的数字!
- goto GET_PARTITION_NUMBER
- )
- if "%isGPT%"=="1" (
- goto GPT_OPERATION
- ) else (
- goto MBR_OPERATION
- )
- :GPT_OPERATION
- :: 定义GUID常量
- set "HIDE_GUID=dfd3c88e-b098-4f5a-a6a4-2a3a5a5d5b5b"
- set "SHOW_GUID=ebd0a0a2-b9e5-4433-87c0-68b6b72699c7"
- :: 获取分区详细信息
- (
- echo select disk !choiceDisk!
- echo select partition !partitionNum!
- echo detail partition
- echo exit
- ) > %TEMPDIR%\check_status.txt
- set "IS_HIDDEN=0"
- set "LETTER="
- for /f "tokens=1,2 delims=: " %%A in ('diskpart /s %TEMPDIR%\check_status.txt') do (
- if "%%A"=="字母" set "LETTER=%%B"
- if "%%A"=="类型" if "%%B"=="%HIDE_GUID%" set "IS_HIDDEN=1"
- )
- del %TEMPDIR%\check_status.txt
- :: 根据状态提示用户
- if !IS_HIDDEN! equ 1 (
- echo.
- echo 该分区当前状态: 已隐藏
- set "OPERATION=显示"
- set "GUID=!SHOW_GUID!"
- set "ACTION_DESC=显示该分区"
- ) else (
- echo.
- echo 该分区当前状态: 已显示
- if defined LETTER echo 当前盘符: !LETTER!
- set "OPERATION=隐藏"
- set "GUID=!HIDE_GUID!"
- set "ACTION_DESC=隐藏该分区"
- )
- :: 确认操作
- echo.
- echo 即将执行操作:
- echo - 磁盘: !choiceDisk!
- echo - 分区: !partitionNum!
- echo - 操作: !ACTION_DESC!
- echo.
- set /p "CONFIRM=确认执行(Y/N)? "
- if /i "!CONFIRM!" neq "Y" (
- echo 操作已取消
- pause
- goto MAIN_MENU
- )
- :: 执行操作
- (
- echo select disk !choiceDisk!
- echo select partition !partitionNum!
-
- if "!OPERATION!"=="隐藏" (
- if defined LETTER echo remove letter=!LETTER!
- echo set id=!GUID!
- ) else (
- echo set id=!GUID!
- echo assign
- )
- echo exit
- ) > %TEMPDIR%\operation.txt
- diskpart /s %TEMPDIR%\operation.txt
- del %TEMPDIR%\operation.txt
- :: 显示结果
- echo.
- if "!OPERATION!"=="隐藏" (
- if defined LETTER (
- echo 成功:分区 !partitionNum! 已隐藏(移除盘符 !LETTER!)
- ) else (
- echo 成功:分区 !partitionNum! 已隐藏(无盘符可移除)
- )
- ) else (
- echo 成功:分区 !partitionNum! 已显示
- )
- echo.
- echo 注意:如果分区未立即显示/隐藏,请尝试刷新资源管理器(F5)或重启计算机
- echo.
- pause
- goto MAIN_MENU
-
- :MBR_OPERATION
- :: 获取分区详细信息
- (
- echo select disk !choiceDisk!
- echo select partition !partitionNum!
- echo detail partition
- echo exit
- ) > "%TEMPDIR%\check_status.txt"
- diskpart /s "%TEMPDIR%\check_status.txt" > "%TEMPDIR%\PartInfo.txt"
- :: 提取分区类型ID
- set "id="
- for /f "tokens=2 delims=:" %%a in ('type "%TEMPDIR%\PartInfo.txt" ^| find "类型 :"') do (
- for /f "tokens=1" %%b in ("%%a") do (
- set "id=%%b"
- )
- )
- if not defined id (
- echo 无法获取分区ID!
- pause
- goto MAIN_MENU
- )
- :: 根据ID判断操作
- if "%id:~0,1%"=="1" (
- set operation=显示
- set newId=0%id:~1,1%
- ) else if "%id:~0,1%"=="0" (
- set operation=隐藏
- set newId=1%id:~1,1%
- ) else (
- echo 分区%partitionNum%的ID类型为: %id%
- pause
- goto MAIN_MENU
- )
- :CONFIRM_OPERATION
- echo.
- set /p "choice=确定%operation%分区%partitionNum%?(Y/N): "
- if /i "%choice%"=="N" goto MAIN_MENU
- if /i not "%choice%"=="Y" goto CONFIRM_OPERATION
- :: 执行操作
- (
- echo select disk %choiceDisk%
- echo select partition %partitionNum%
- echo set id=%newId%
- echo exit
- ) > "%TEMPDIR%\DiskPart.txt"
- diskpart /s "%TEMPDIR%\DiskPart.txt"
- echo.
- echo 分区%partitionNum%已成功%operation%!
- echo.
- pause
- goto MAIN_MENU
复制代码 |
|