Board logo

标题: [文件操作] [分享]批处理利用微软官方工具oscdimg自动生成光盘iso镜像 [打印本页]

作者: hfxiang    时间: 2022-6-27 09:34     标题: [分享]批处理利用微软官方工具oscdimg自动生成光盘iso镜像

oscdimg.exe虽然是微软官方工具,但Windows默认不自带(在Windows SDK或Kit中有),单独下载推荐地址: http://bcn.bathome.net/s/tool/index.html?key=oscdimg
示例:
oscdimg.cmd "D:\SoftWare"                --以“D:\SoftWare”文件夹原样做iso镜像
oscdimg.cmd "D:\SoftWare\test.txt"        --以test.txt的修改时间为准作为“D:\SoftWare”文件夹做镜像后所有文件的统一时间

将以下文字以 ANSI 的格式保存为 “oscdimg.cmd”
  1. @echo off
  2. @rem 利用微软官方的光盘镜像生成工具oscdimg把指定的目录做成标准光盘镜像文件。
  3. @rem 指定的文件夹名称用作镜像标签名称,因此指定的文件夹名称总长度不得超过32个字符
  4. @rem 指定的文件夹名称用作镜像文件名称
  5. @rem 当指定文件夹时,则以文件夹原样做镜像
  6. @rem 当指定文件时,则以文件的最后修改时间做为镜像文件中所有文件(夹)的时间
  7. @rem 如当前文件夹下有etfsboot.com或efisys.bin时,则做成可启动的光盘镜像,当2文件同时存在时,则efisys.bin优先(只实现单启动)
  8. @rem 由于本脚本工作机制的限定,本脚本在指定工作文件夹为根文件夹时不工作
  9. @rem 当指定的路径当中出现特殊字符时(如:( ) !& $ ^ 等等),本脚本可能会崩溃
  10. setlocal enableextensions enabledelayedexpansion
  11. @rem 提取本脚本文件夹,path0
  12. set "path0=%~dp0"
  13. set "path0=%path0:"=%"
  14. @rem 如果%path0%不是根目录,则删除最后的反斜杠“\”
  15. if /i "[%path0:~-1,1%]"=="[\]" if /i not "[%path0:~-2,1%]"=="[:]" set "path0=%path0:~0,-1%"
  16. @rem 设置常用参数
  17. set "Cdimage_par= -h -c -u2 -o -oc -m "
  18. set "Dir_a=%~a1"
  19. if not defined Dir_a (
  20. echo;参数%*不符合本脚本的要求,请按任意键退出脚本
  21. call :EndBatch
  22. )else if /i "[%Dir_a:~0,1%]"=="[d]" (
  23. @rem 指定待做光盘镜像的文件夹
  24. call set "Specific_path=%~f1"
  25. if "[!Specific_path:~-2,1!]"=="[:]" (
  26. echo;当前指定待做光盘镜像的文件夹为%~d1%~p1;本脚本不适用于根文件夹,请按任意键退出脚本
  27. call :EndBatch
  28. )
  29. @rem 撤销时间参数定义
  30. call set "Files_Time="
  31. ) else (
  32. @rem 指定待做光盘镜像的文件夹
  33. call set "Specific_path=%~d1%~p1"
  34. if "[!Specific_path:~-2,1!]"=="[:]" (
  35. echo;当前指定待做光盘镜像的文件夹为%~d1%~p1;本脚本不适用于根文件夹,请按任意键退出脚本
  36. call :EndBatch
  37. )
  38. call set "Specific_path=!Specific_path:~0,-1!"
  39. @rem 提取文件名,用于提取时间参数
  40. call set "Specific_file=%~n1%~x1
  41. @rem 提取时间参数,存在于Files_Time
  42. for /f "usebackq tokens=1-6 delims=,/: " %%a in (`forfiles /p "!Specific_path!" /m "!Specific_file!" /c "cmd /c echo @fdate,@ftime"`) do (
  43. set tm=%%b
  44. set tm=0!tm!
  45. set tm=!tm:~-2!
  46. set td=%%c
  47. set td=0!td!
  48. set td=!td:~-2!
  49. set th=%%d
  50. set th=0!th!
  51. set th=!th:~-2!
  52. set "Files_Time= -t!tm!/!td!/%%a,!th!:%%e:%%f"
  53. )
  54. )
  55. @rem 提取文件夹名,用于光盘标签、光盘文件名
  56. call :Dir_split "%Specific_path%" Dir_err Dir_err Dir_n Dir_x Dir_err Dir_err Dir_err Dir_err
  57. @rem 设置光盘标签
  58. set "Cdimage_Label= -l"%Dir_n%%Dir_x%""
  59. @rem 指定光盘文件名称
  60. set "Cdimage_iso="%Specific_path%.iso""
  61. @rem 测试"%Specific_path%\etfsboot.com"是否为有效文件
  62. set "bootFile=%Specific_path%\etfsboot.com"
  63. call :Check_File "%bootFile%" FileCheck
  64. @rem 如有效则设置为启动文件为"%bootFile%"(Legacy:默认启动文件etfsboot.com)(单启动)
  65. if "[%FileCheck%]"=="[IsFile]" set "Cdimage_par=%Cdimage_par:~0,11%-b"%bootFile%"%Cdimage_par:~-11%"
  66. @rem 测试"%Specific_path%\efisys.bin"是否为有效文件
  67. set "bootFile=%Specific_path%\efisys.bin"
  68. call :Check_File "%bootFile%" FileCheck
  69. @rem 如有效则设置为启动文件为"%bootFile%"(UEFI:默认启动文件efisys.bin),具有优先权,将覆盖Legacy启动项
  70. if "[%FileCheck%]"=="[IsFile]" set "Cdimage_par=%Cdimage_par:~0,11%-b"%bootFile%"%Cdimage_par:~-11%"
  71. @rem 如果指定待做光盘镜像的文件夹与本脚本为同一文件夹,则撤销path0定义
  72. if "%Specific_path%"=="%path0%" set "path0="
  73. @rem 添加文件查询路径(主要为%~dp0及%~dp1)
  74. if defined path0 echo;%path%|find.exe /i "%path0%;">nul 2>&1 || path %path0%;%path%
  75. if defined Specific_path echo;%path%|find.exe /i "%Specific_path%;">nul 2>&1 || path %Specific_path%;%path%
  76. cd /d "%Specific_path%"
  77. @rem 测试oscdimg.exe或cdimage.exe文件路径(采用where.exe命令处置)
  78. set "FilePath="
  79. for /f "usebackq tokens=*" %%i in (`"where oscdimg.exe cdimage.exe" 2^>nul`) do (
  80. if not defined FilePath (
  81. set "Dir_a=%%~ai"
  82. if defined Dir_a if not "[!Dir_a:~0,1!]"=="[d]" set "FilePath=%%~fi"
  83. )
  84. )
  85. if not defined FilePath echo;&&echo;镜像制作指令“oscdimg.exe”不存在(或其路径含本脚本不支持的字符)&&echo;请按任意键退出脚本&&goto :EndBatch
  86. set "oscdimg_path=%FilePath%"
  87. @rem 命令行展示
  88. @rem echo;"%oscdimg_path%"%Cdimage_Label%%Files_Time%%Cdimage_par%"%Specific_path%" %Cdimage_iso%
  89. @rem echo;测试结束;请按任意键退出脚本&&goto :EndBatch
  90. @rem 执行
  91. "%oscdimg_path%"%Cdimage_Label%%Files_Time%%Cdimage_par%"%Specific_path%" %Cdimage_iso%
  92. @rem 退出
  93. :EndBatch
  94. endlocal
  95. echo;
  96. echo;Please press any key to exit.
  97. pause>nul
  98. exit
  99. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  100. :Check_File <FilePath> [FileCheck]
  101. :: 功能:拆分输入路径为:盘符、路径、文件名、扩展名
  102. :: 参数:%1 输入:全路径
  103. ::       %2 输出:状态(IsFile文件,IsFolder文件夹,false非文件/夹)
  104. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  105. setlocal ENABLEEXTENSIONS
  106. set "Dir_a=%~a1"
  107. if not defined Dir_a (set "a=false") else (if "%Dir_a:~0,1%"=="d" (set "a=IsFolder") else (set "a=IsFile"))
  108. endlocal&set "%2=%a%"&goto :EOF
  109. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  110. :Dir_split %Dir_i% Dir_d Dir_p Dir_n Dir_x Dir_a Dir_f Dir_z Dir_t
  111. :: 功能:拆分输入路径为:盘符、路径、文件名、扩展名
  112. :: 参数:%1 输入全路径
  113. ::       %2 输出:盘符
  114. ::       %3 输出:路径
  115. ::       %4 输出:文件名
  116. ::       %5 输出:扩展名
  117. ::       %6 输出:属性(IsFile文件,IsFolder文件夹,false非文件/夹)
  118. ::       %7 输出:合格的路径名
  119. ::       %8 输出:文件大小
  120. ::       %9 输出:日期/时间(准确到分钟。秒钟数据获取:forfiles /p "%路径%" /m "%文件%" /c "cmd /c echo @fdate,@ftime" )
  121. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  122. setlocal enableExtensions
  123. set "Dir_a=%~a1"
  124. if not defined Dir_a (set "a=false") else (if "%Dir_a:~0,1%"=="d" (set "a=IsFolder") else (set "a=IsFile"))
  125. endlocal&set "%2=%~d1"&set "%3=%~p1"&set "%4=%~n1"&set "%5=%~x1"&set "%6=%a%"&set "%7=%~f1"&set "%8=%~z1"&set "%9=%~t1"&goto :EOF
  126. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  127. endlocal
  128. exit
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2