心零 发表于 2020-2-22 20:30:15

BAT+diskpart脚本快速创建差分(2024-02更新)

本帖最后由 心零 于 2024-2-24 04:55 编辑

2024-02-24
又是过年闲着也是闲着,于是折腾了更新了下VHD差分的生成。
此脚本用法简单(注意,只能在系统或PE下运行,XP不行!)
1.先输入盘符搜索VHD文件
2.把找到文件名复制,然后按B开始差分


@echo off
setlocal enabledelayedexpansion

:InputDrive
cls
set /p "drive1=请输入要搜索的盘符(如:D): "
set "drive=%drive1%:"
if not defined drive goto InputDrive
if not "%drive:~-1%"=="\" set "drive=%drive%\"

set "extension=*.vhd;*.vhdx"
set "depth=10"
set "counter=0"
set "tempFile=%temp%\foundFiles.txt"

if exist "%tempFile%" del "%tempFile%"

call :ListFiles "%drive%" "%extension%" "%depth%" "%tempFile%"

if exist "%tempFile%" (
    echo 找到的 VHD/VHDX 文件:
    for /f "delims=" %%F in (%tempFile%) do (
      set /a "counter+=1"
      echo !counter!. %%F
    )
) else (
    echo 未找到包含 VHD/VHDX 文件的目录。
)

del "%tempFile%"

:AskForMore
echo.
echo 是否搜索其他磁盘或开始操作VHD文件?
echo A. 重新开始搜索
echo B. 开始差分文件。
echo C. 退出   
set /p "choice=请输入选项(不区分大小写): "

:: Convert the user's choice to uppercase for case-insensitive comparison
for %%i in ("%choice%") do set "choice=%%~nxi"

if /i "%choice%"=="A" goto InputDrive
if /i "%choice%"=="B" goto CreateDiffVHD
if /i "%choice%"=="C" goto EndScript   

:CreateDiffVHD
:: 提示用户输入父VHD文件的完整路径(包括文件名)
set /p "parent_vhd_path=请输入父VHD文件的完整路径(包括文件名): "
echo 您输入的路径是: "%parent_vhd_path%"

:: 检查输入是否为空
if "%parent_vhd_path%"=="" (
    echo 错误: 没有输入父VHD文件的路径。
    exit /b 1
)

:: 检查父VHD文件是否存在
if not exist "%parent_vhd_path%" (
    echo 错误: 父VHD文件不存在。
    exit /b 1
)

:: 提取父VHD文件的目录、文件名和扩展名
for %%F in ("%parent_vhd_path%") do (
    set "parent_dir=%%~dpF"
    set "parent_filename=%%~nF"
    set "parent_ext=%%~xF"
)

:: 去除目录变量中的尾随反斜杠
if not "!parent_dir:~-1!"=="\" (
    set "parent_dir=!parent_dir!\"
)


:: 根据扩展名设置子VHD文件的路径
if /i "!parent_ext!"==".vhd" (
    set "child_vhd_path=!parent_dir!!parent_filename!_bak.vhd"
) else if /i "!parent_ext!"==".vhdx" (
    set "child_vhd_path=!parent_dir!!parent_filename!_bak.vhdx"
) else (
    echo 错误: 不支持的VHD文件类型。
    exit /b 1
)


:: 定义临时文件的路径
set "temp_txt=%temp%\temp_diskpart_script.txt"

:: 将diskpart命令写入临时文件
(
    echo create vdisk file="!child_vhd_path!" parent="!parent_vhd_path!"
) > "%temp_txt%"

:: 使用diskpart执行临时文件中的命令
echo 正在执行diskpart命令...
diskpart /s "%temp_txt%"

:: 检查diskpart命令是否成功执行
if %errorlevel% neq 0 (
    echo 错误: 创建差分VHD失败。
    exit /b 1
)

:: 删除临时文件
del "%temp_txt%"

echo 差分VHD文件已成功创建在 "!child_vhd_path!"
echo 按任意键打开包含差分VHD文件的文件夹
pause

:: 打开包含差分VHD文件的文件夹
start "" "!parent_dir!"

endlocal

:ListFiles
set "currentDir=%~1"
set "filter=%~2"
set "level=%~3"
set "outputFile=%~4"

if "%level%"=="0" exit /b

for /r "%currentDir%" %%a in (%filter%) do (
    echo %%~fa>> "%outputFile%"
)

if %level% LSS %depth% (
    for /d %%d in ("%currentDir%*") do (
      if /i not "%%~fd"=="%currentDir%" call :ListFiles "%%~fd" "%filter%" "%level%" "%outputFile%"
    )
)

exit /b

:EndScript
endlocal
exit /b


hilsonma 发表于 2020-2-22 21:14:46

本帖最后由 hilsonma 于 2020-2-22 21:16 编辑

原脚本当输入不是234eE时会等同于选择1

可以将21至25行合并成一行来避免这个问题:
goto:MENU%choice%

这样,只有输入1234才会进入相应的选择项,没有输入或其他输入都会退出脚本。(goto不存在的标签会退出脚本,等同于goto:eof)

心零 发表于 2020-2-22 22:20:46

hilsonma 发表于 2020-2-22 21:14
原脚本当输入不是234eE时会等同于选择1

可以将21至25行合并成一行来避免这个问题:


感谢指点!

kkkssc 发表于 2020-2-23 03:18:40

给力!

ghg123456 发表于 2020-2-26 22:59:12

xman00 发表于 2020-2-26 23:21:09

目测给力

cbl 发表于 2020-3-3 16:21:39

心零 发表于 2024-2-16 13:31:57

上班了上班了,一年又过了!

tilltotell007 发表于 2024-2-20 13:17:58

感谢分享

fcknwj 发表于 2024-2-23 23:20:42

学习了,谢谢楼主分享

fanchenwen 发表于 2024-2-24 00:20:15

试了一下,无法工作,输入父vhdx名之后回车,闪退了。

心零 发表于 2024-2-24 04:44:03

fanchenwen 发表于 2024-2-24 00:20
试了一下,无法工作,输入父vhdx名之后回车,闪退了。

确实如此,测试时只用VHD,没用VHDX文件
已修改!

wang1126 发表于 2024-3-3 11:17:50

学习了,谢谢楼主

Monkeydance 发表于 2024-3-3 12:38:51

感谢分享

紧急追踪 发表于 2024-3-9 20:19:49

感谢分享
页: [1]
查看完整版本: BAT+diskpart脚本快速创建差分(2024-02更新)