标题: [文件操作] [分享]批处理利用微软官方工具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”- @echo off
- @rem 利用微软官方的光盘镜像生成工具oscdimg把指定的目录做成标准光盘镜像文件。
- @rem 指定的文件夹名称用作镜像标签名称,因此指定的文件夹名称总长度不得超过32个字符
- @rem 指定的文件夹名称用作镜像文件名称
- @rem 当指定文件夹时,则以文件夹原样做镜像
- @rem 当指定文件时,则以文件的最后修改时间做为镜像文件中所有文件(夹)的时间
- @rem 如当前文件夹下有etfsboot.com或efisys.bin时,则做成可启动的光盘镜像,当2文件同时存在时,则efisys.bin优先(只实现单启动)
- @rem 由于本脚本工作机制的限定,本脚本在指定工作文件夹为根文件夹时不工作
- @rem 当指定的路径当中出现特殊字符时(如:( ) !& $ ^ 等等),本脚本可能会崩溃
- setlocal enableextensions enabledelayedexpansion
- @rem 提取本脚本文件夹,path0
- set "path0=%~dp0"
- set "path0=%path0:"=%"
- @rem 如果%path0%不是根目录,则删除最后的反斜杠“\”
- if /i "[%path0:~-1,1%]"=="[\]" if /i not "[%path0:~-2,1%]"=="[:]" set "path0=%path0:~0,-1%"
- @rem 设置常用参数
- set "Cdimage_par= -h -c -u2 -o -oc -m "
- set "Dir_a=%~a1"
- if not defined Dir_a (
- echo;参数%*不符合本脚本的要求,请按任意键退出脚本
- call :EndBatch
- )else if /i "[%Dir_a:~0,1%]"=="[d]" (
- @rem 指定待做光盘镜像的文件夹
- call set "Specific_path=%~f1"
- if "[!Specific_path:~-2,1!]"=="[:]" (
- echo;当前指定待做光盘镜像的文件夹为%~d1%~p1;本脚本不适用于根文件夹,请按任意键退出脚本
- call :EndBatch
- )
- @rem 撤销时间参数定义
- call set "Files_Time="
- ) else (
- @rem 指定待做光盘镜像的文件夹
- call set "Specific_path=%~d1%~p1"
- if "[!Specific_path:~-2,1!]"=="[:]" (
- echo;当前指定待做光盘镜像的文件夹为%~d1%~p1;本脚本不适用于根文件夹,请按任意键退出脚本
- call :EndBatch
- )
- call set "Specific_path=!Specific_path:~0,-1!"
- @rem 提取文件名,用于提取时间参数
- call set "Specific_file=%~n1%~x1
- @rem 提取时间参数,存在于Files_Time
- for /f "usebackq tokens=1-6 delims=,/: " %%a in (`forfiles /p "!Specific_path!" /m "!Specific_file!" /c "cmd /c echo @fdate,@ftime"`) do (
- set tm=%%b
- set tm=0!tm!
- set tm=!tm:~-2!
- set td=%%c
- set td=0!td!
- set td=!td:~-2!
- set th=%%d
- set th=0!th!
- set th=!th:~-2!
- set "Files_Time= -t!tm!/!td!/%%a,!th!:%%e:%%f"
- )
- )
- @rem 提取文件夹名,用于光盘标签、光盘文件名
- call :Dir_split "%Specific_path%" Dir_err Dir_err Dir_n Dir_x Dir_err Dir_err Dir_err Dir_err
- @rem 设置光盘标签
- set "Cdimage_Label= -l"%Dir_n%%Dir_x%""
- @rem 指定光盘文件名称
- set "Cdimage_iso="%Specific_path%.iso""
- @rem 测试"%Specific_path%\etfsboot.com"是否为有效文件
- set "bootFile=%Specific_path%\etfsboot.com"
- call :Check_File "%bootFile%" FileCheck
- @rem 如有效则设置为启动文件为"%bootFile%"(Legacy:默认启动文件etfsboot.com)(单启动)
- if "[%FileCheck%]"=="[IsFile]" set "Cdimage_par=%Cdimage_par:~0,11%-b"%bootFile%"%Cdimage_par:~-11%"
- @rem 测试"%Specific_path%\efisys.bin"是否为有效文件
- set "bootFile=%Specific_path%\efisys.bin"
- call :Check_File "%bootFile%" FileCheck
- @rem 如有效则设置为启动文件为"%bootFile%"(UEFI:默认启动文件efisys.bin),具有优先权,将覆盖Legacy启动项
- if "[%FileCheck%]"=="[IsFile]" set "Cdimage_par=%Cdimage_par:~0,11%-b"%bootFile%"%Cdimage_par:~-11%"
-
- @rem 如果指定待做光盘镜像的文件夹与本脚本为同一文件夹,则撤销path0定义
- if "%Specific_path%"=="%path0%" set "path0="
-
- @rem 添加文件查询路径(主要为%~dp0及%~dp1)
- if defined path0 echo;%path%|find.exe /i "%path0%;">nul 2>&1 || path %path0%;%path%
- if defined Specific_path echo;%path%|find.exe /i "%Specific_path%;">nul 2>&1 || path %Specific_path%;%path%
-
- cd /d "%Specific_path%"
-
- @rem 测试oscdimg.exe或cdimage.exe文件路径(采用where.exe命令处置)
- set "FilePath="
- for /f "usebackq tokens=*" %%i in (`"where oscdimg.exe cdimage.exe" 2^>nul`) do (
- if not defined FilePath (
- set "Dir_a=%%~ai"
- if defined Dir_a if not "[!Dir_a:~0,1!]"=="[d]" set "FilePath=%%~fi"
- )
- )
- if not defined FilePath echo;&&echo;镜像制作指令“oscdimg.exe”不存在(或其路径含本脚本不支持的字符)&&echo;请按任意键退出脚本&&goto :EndBatch
- set "oscdimg_path=%FilePath%"
-
- @rem 命令行展示
- @rem echo;"%oscdimg_path%"%Cdimage_Label%%Files_Time%%Cdimage_par%"%Specific_path%" %Cdimage_iso%
- @rem echo;测试结束;请按任意键退出脚本&&goto :EndBatch
- @rem 执行
- "%oscdimg_path%"%Cdimage_Label%%Files_Time%%Cdimage_par%"%Specific_path%" %Cdimage_iso%
- @rem 退出
- :EndBatch
- endlocal
- echo;
- echo;Please press any key to exit.
- pause>nul
- exit
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- :Check_File <FilePath> [FileCheck]
- :: 功能:拆分输入路径为:盘符、路径、文件名、扩展名
- :: 参数:%1 输入:全路径
- :: %2 输出:状态(IsFile文件,IsFolder文件夹,false非文件/夹)
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- setlocal ENABLEEXTENSIONS
- set "Dir_a=%~a1"
- if not defined Dir_a (set "a=false") else (if "%Dir_a:~0,1%"=="d" (set "a=IsFolder") else (set "a=IsFile"))
- endlocal&set "%2=%a%"&goto :EOF
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- :Dir_split %Dir_i% Dir_d Dir_p Dir_n Dir_x Dir_a Dir_f Dir_z Dir_t
- :: 功能:拆分输入路径为:盘符、路径、文件名、扩展名
- :: 参数:%1 输入全路径
- :: %2 输出:盘符
- :: %3 输出:路径
- :: %4 输出:文件名
- :: %5 输出:扩展名
- :: %6 输出:属性(IsFile文件,IsFolder文件夹,false非文件/夹)
- :: %7 输出:合格的路径名
- :: %8 输出:文件大小
- :: %9 输出:日期/时间(准确到分钟。秒钟数据获取:forfiles /p "%路径%" /m "%文件%" /c "cmd /c echo @fdate,@ftime" )
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- setlocal enableExtensions
- set "Dir_a=%~a1"
- if not defined Dir_a (set "a=false") else (if "%Dir_a:~0,1%"=="d" (set "a=IsFolder") else (set "a=IsFile"))
- 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
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- endlocal
- exit
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |