磁盘分区显示与隐藏的bat命令行批处理脚本

迅恒数据中心
@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

分类:安全公告 百度收录 必应收录