无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 6812|回复: 14
打印 上一主题 下一主题

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

  [复制链接]
跳转到指定楼层
1#
发表于 2020-2-22 20:30:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 心零 于 2024-2-24 04:55 编辑

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


  1. @echo off  
  2. setlocal enabledelayedexpansion  
  3.   
  4. :InputDrive  
  5. cls  
  6. set /p "drive1=请输入要搜索的盘符(如:D): "  
  7. set "drive=%drive1%:"  
  8. if not defined drive goto InputDrive  
  9. if not "%drive:~-1%"=="" set "drive=%drive%"  
  10.   
  11. set "extension=*.vhd;*.vhdx"  
  12. set "depth=10"  
  13. set "counter=0"  
  14. set "tempFile=%temp%\foundFiles.txt"  
  15.   
  16. if exist "%tempFile%" del "%tempFile%"  
  17.   
  18. call :ListFiles "%drive%" "%extension%" "%depth%" "%tempFile%"  
  19.   
  20. if exist "%tempFile%" (  
  21.     echo 找到的 VHD/VHDX 文件:  
  22.     for /f "delims=" %%F in (%tempFile%) do (  
  23.         set /a "counter+=1"  
  24.         echo !counter!. %%F  
  25.     )  
  26. ) else (  
  27.     echo 未找到包含 VHD/VHDX 文件的目录。  
  28. )  
  29.   
  30. del "%tempFile%"  
  31.   
  32. :AskForMore  
  33. echo.  
  34. echo 是否搜索其他磁盘或开始操作VHD文件?  
  35. echo A. 重新开始搜索  
  36. echo B. 开始差分文件。
  37. echo C. 退出   
  38. set /p "choice=请输入选项(不区分大小写): "  
  39.   
  40. :: Convert the user's choice to uppercase for case-insensitive comparison  
  41. for %%i in ("%choice%") do set "choice=%%~nxi"  
  42.   
  43. if /i "%choice%"=="A" goto InputDrive  
  44. if /i "%choice%"=="B" goto CreateDiffVHD
  45. if /i "%choice%"=="C" goto EndScript   
  46.   
  47. :CreateDiffVHD
  48. :: 提示用户输入父VHD文件的完整路径(包括文件名)  
  49. set /p "parent_vhd_path=请输入父VHD文件的完整路径(包括文件名): "  
  50. echo 您输入的路径是: "%parent_vhd_path%"  
  51.   
  52. :: 检查输入是否为空  
  53. if "%parent_vhd_path%"=="" (  
  54.     echo 错误: 没有输入父VHD文件的路径。  
  55.     exit /b 1  
  56. )  
  57.   
  58. :: 检查父VHD文件是否存在  
  59. if not exist "%parent_vhd_path%" (  
  60.     echo 错误: 父VHD文件不存在。  
  61.     exit /b 1  
  62. )  
  63.   
  64. :: 提取父VHD文件的目录、文件名和扩展名  
  65. for %%F in ("%parent_vhd_path%") do (  
  66.     set "parent_dir=%%~dpF"  
  67.     set "parent_filename=%%~nF"  
  68.     set "parent_ext=%%~xF"  
  69. )  
  70.   
  71. :: 去除目录变量中的尾随反斜杠  
  72. if not "!parent_dir:~-1!"=="" (  
  73.     set "parent_dir=!parent_dir!"  
  74. )  
  75.   
  76.   
  77. :: 根据扩展名设置子VHD文件的路径  
  78. if /i "!parent_ext!"==".vhd" (  
  79.     set "child_vhd_path=!parent_dir!!parent_filename!_bak.vhd"  
  80. ) else if /i "!parent_ext!"==".vhdx" (  
  81.     set "child_vhd_path=!parent_dir!!parent_filename!_bak.vhdx"  
  82. ) else (  
  83.     echo 错误: 不支持的VHD文件类型。  
  84.     exit /b 1  
  85. )  
  86.   
  87.   
  88. :: 定义临时文件的路径  
  89. set "temp_txt=%temp%\temp_diskpart_script.txt"  
  90.   
  91. :: 将diskpart命令写入临时文件  
  92. (  
  93.     echo create vdisk file="!child_vhd_path!" parent="!parent_vhd_path!"  
  94. ) > "%temp_txt%"  
  95.   
  96. :: 使用diskpart执行临时文件中的命令  
  97. echo 正在执行diskpart命令...  
  98. diskpart /s "%temp_txt%"  
  99.   
  100. :: 检查diskpart命令是否成功执行  
  101. if %errorlevel% neq 0 (  
  102.     echo 错误: 创建差分VHD失败。  
  103.     exit /b 1  
  104. )  
  105.   
  106. :: 删除临时文件  
  107. del "%temp_txt%"  
  108.   
  109. echo 差分VHD文件已成功创建在 "!child_vhd_path!"  
  110. echo 按任意键打开包含差分VHD文件的文件夹  
  111. pause  
  112.   
  113. :: 打开包含差分VHD文件的文件夹  
  114. start "" "!parent_dir!"  
  115.   
  116. endlocal
  117.   
  118. :ListFiles  
  119. set "currentDir=%~1"  
  120. set "filter=%~2"  
  121. set "level=%~3"  
  122. set "outputFile=%~4"  
  123.   
  124. if "%level%"=="0" exit /b  
  125.   
  126. for /r "%currentDir%" %%a in (%filter%) do (  
  127.     echo %%~fa>> "%outputFile%"  
  128. )  
  129.   
  130. if %level% LSS %depth% (  
  131.     for /d %%d in ("%currentDir%*") do (  
  132.         if /i not "%%~fd"=="%currentDir%" call :ListFiles "%%~fd" "%filter%" "%level%" "%outputFile%"  
  133.     )  
  134. )  
  135.   
  136. exit /b  
  137.   
  138. :EndScript  
  139. endlocal  
  140. exit /b
复制代码



2#
发表于 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
回复

使用道具 举报

3#
 楼主| 发表于 2020-2-22 22:20:46 | 只看该作者
hilsonma 发表于 2020-2-22 21:14
原脚本当输入不是234eE时会等同于选择1

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

感谢指点!
回复

使用道具 举报

4#
发表于 2020-2-23 03:18:40 | 只看该作者
给力!
回复

使用道具 举报

5#
发表于 2020-2-26 22:59:12 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
发表于 2020-2-26 23:21:09 | 只看该作者
目测给力
回复

使用道具 举报

7#
发表于 2020-3-3 16:21:39 来自手机 | 只看该作者
回复

使用道具 举报

8#
 楼主| 发表于 2024-2-16 13:31:57 | 只看该作者
上班了上班了,一年又过了!
回复

使用道具 举报

9#
发表于 2024-2-20 13:17:58 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

10#
发表于 2024-2-23 23:20:42 | 只看该作者
学习了,谢谢楼主分享
回复

使用道具 举报

11#
发表于 2024-2-24 00:20:15 | 只看该作者
试了一下,无法工作,输入父vhdx名之后回车,闪退了。

点评

确实如此,测试时只用VHD,没用VHDX文件 已修改!  详情 回复 发表于 2024-2-24 04:44
回复

使用道具 举报

12#
 楼主| 发表于 2024-2-24 04:44:03 | 只看该作者
fanchenwen 发表于 2024-2-24 00:20
试了一下,无法工作,输入父vhdx名之后回车,闪退了。

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

使用道具 举报

13#
发表于 2024-3-3 11:17:50 | 只看该作者
学习了,谢谢楼主
回复

使用道具 举报

14#
发表于 2024-3-3 12:38:51 | 只看该作者
感谢分享
回复

使用道具 举报

15#
发表于 2024-3-9 20:19:49 | 只看该作者
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-23 23:31

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表