无忧启动论坛

标题: BAT+diskpart脚本快速创建差分(2024-02更新) [打印本页]

作者: 心零    时间: 2020-2-22 20:30
标题: BAT+diskpart脚本快速创建差分(2024-02更新)
本帖最后由 心零 于 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
复制代码




作者: hilsonma    时间: 2020-2-22 21:14
本帖最后由 hilsonma 于 2020-2-22 21:16 编辑

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

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

这样,只有输入1234才会进入相应的选择项,没有输入或其他输入都会退出脚本。(goto不存在的标签会退出脚本,等同于goto:eof)
作者: 心零    时间: 2020-2-22 22:20
hilsonma 发表于 2020-2-22 21:14
原脚本当输入不是234eE时会等同于选择1

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

感谢指点!
作者: kkkssc    时间: 2020-2-23 03:18
给力!
作者: ghg123456    时间: 2020-2-26 22:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: xman00    时间: 2020-2-26 23:21
目测给力
作者: cbl    时间: 2020-3-3 16:21

作者: 心零    时间: 2024-2-16 13:31
上班了上班了,一年又过了!
作者: tilltotell007    时间: 2024-2-20 13:17
感谢分享
作者: fcknwj    时间: 2024-2-23 23:20
学习了,谢谢楼主分享
作者: fanchenwen    时间: 2024-2-24 00:20
试了一下,无法工作,输入父vhdx名之后回车,闪退了。
作者: 心零    时间: 2024-2-24 04:44
fanchenwen 发表于 2024-2-24 00:20
试了一下,无法工作,输入父vhdx名之后回车,闪退了。

确实如此,测试时只用VHD,没用VHDX文件
已修改!
作者: wang1126    时间: 2024-3-3 11:17
学习了,谢谢楼主
作者: Monkeydance    时间: 2024-3-3 12:38
感谢分享
作者: 紧急追踪    时间: 2024-3-9 20:19
感谢分享
作者: liaoliang    时间: 2024-10-22 11:29
vhd隐藏无法找到(小问题)。还是谢谢楼主分享。
作者: therfer    时间: 2024-11-6 20:32
好好
作者: cqh    时间: 2024-11-11 19:58
学习




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3