none
[分享]自動創建 IFM 安裝介質的批處理脚本 RRS feed

  • 常规讨论

  • 昨天分享了一個自動備份 System State 核心文件的批處理脚本,今天我對脚本稍稍進行了一下修改,把它變成了自動創建完整 IFM 介質的批處理脚本。因爲 ntdsutil 在返回創建成功與否信息時,處理的不是很好,如果在國際化環境中,可能不能正確解析。所以這個脚本祇是依原樣輸出結果。

    此外因爲是簡單修改,所以這個脚本祇支持創建完整的 IFM 介質,如需創建適用於 RODC 的 IFM 介質,請自行修改。

    以下爲完整代碼

    @echo off
    
    echo.
    echo 自动创建完整 IFM 介质
    
    set root=%cd%
    
    pushd %cd%
    echo.
    echo 获取用于存储备份的模板 VHD 文件完全限定路径
    set vhd=%1
    if not defined vhd (goto notArg)
    
    for /f "tokens=*" %%n in ('echo %1') do (
    	set vhd=%%~fn
    )
    
    dir "%vhd%" /a-d/b 2> nul 1> nul
    if %errorlevel% neq 0 (goto errPath)
    
    echo.
    echo 获取用于创建备份的临时目录
    set tmpDir=%2
    if not defined tmpDir (goto errTempDir)
    
    for /f "tokens=*" %%n in ('echo %tmpDir%') do (
    	set tmpDir=%%~fn
    )
    
    dir "%tmpDir%" /ad/b 2> nul 1> nul
    if %errorlevel% neq 0 (goto errPath)
    
    echo.
    echo 设置虚拟磁盘卷标
    set sysLabel=%3
    if not defined sysLabel (goto errLabel)
    for /f "tokens=*" %%n in ('echo %sysLabel%') do set sysLabel=%%~n
    
    echo.
    echo 设置虚拟磁盘大小
    set spaceSize=%4
    if not defined spaceSize (goto errSize)
    for /f "tokens=*" %%n in ('echo %spaceSize%') do set spaceSize=%%~n
    
    set vhdEntry=%tmpDir%\%random%_%random%_%random%_%random%
    set vhdScript=%vhdEntry%.txt
    set vhdTemp=%vhdEntry%.vhd
    
    echo.
    echo 复制模板 VHD 文件
    echo create vdisk file="%vhdTemp%" source="%vhd%" type=expandable > "%vhdScript%"
    diskpart -s "%vhdScript%" > nul
    if %errorlevel% neq 0 (goto errCopying)
    
    echo.
    echo 开始挂载 VHD
    echo select vdisk file="%vhdTemp%" > "%vhdScript%"
    echo attach vdisk >> "%vhdScript%"
    
    diskpart -s "%vhdScript%" > nul
    if %errorlevel% neq 0 (goto errMounting)
    
    echo.
    echo 创建挂载用临时目录
    mkdir "%vhdEntry%"
    if %errorlevel% neq 0 (goto errDir)
    
    echo.
    echo 挂载虚拟磁盘到临时目录
    echo list volume > "%vhdScript%"
    
    timeout -t 5 -nobreak > nul
    
    set volumeId=
    for /f "tokens=2" %%n in ('diskpart -s "%vhdScript%" ^| find /i "%sysLabel%" ^| find "%spaceSize%"') do (
    	set volumeId=%%n
    )
    
    if not defined volumeId (goto errVol) 
    
    echo select volume %volumeId% > "%vhdScript%"
    echo assign mount="%vhdEntry%"  >> "%vhdScript%"
    
    diskpart -s "%vhdScript%" > nul
    
    echo.
    echo 成功挂载虚拟磁盘到临时目录 "%vhdEntry%"
    
    echo 使用机器名在目标磁盘创建存放目录
    for /f "tokens=*" %%h in ('hostname') do set folder=%%h
    
    echo.
    echo 开始创建 Active Directory 的完整 IFM 介质
    
    ntdsutil "activate instance ntds" ifm "create sysvol full \"%vhdEntry%\%folder%\"" quit quit
    
    echo 完成创建完整 IFM 介质 %snapshot%
    
    echo.
    echo 卸载虚拟磁盘
    
    echo select vdisk file="%vhdTemp%" > "%vhdScript%"
    echo detach vdisk >> "%vhdScript%"
    
    diskpart -s "%vhdScript%" > nul
    if %errorlevel% neq 0 (goto errUnmounting)
    
    popd
    
    echo. 删除挂载目录 "%vhdEntry%"
    rmdir "%vhdEntry%" 2> nul
    
    del "%vhdScript%" /a/f/q 2> nul
    
    goto exit
    
    :notArg
    echo.
    echo copyright 2013 repl
    echo 自动创建完整 IFM 介质的批处理脚本。
    echo 在进行备份前需要创建一个足够大的已格式化为 NTFS 的 VHD 文件作为存储模板。
    echo 处于备份可靠的考虑,不建议使用差分方式备份,而是以模板为源创建一个副本。
    echo 模板 VHD 必须设置作为唯一标识的卷标。
    echo 同时必须提供由 diskpart list volume 命令返回的容量大小。
    echo 此脚本需要这两个参数来确定挂载的虚拟磁盘。
    echo.
    echo useage: auto_backup_system_state templateVHD tempDir label size
    echo		templateVHD 作为模板的 VHD 完全限定路径。
    echo		tempDir	备份文件所需的临时目录完全限定路径。
    echo		label	通过 diskpart list volume 命令返回的虚拟磁盘卷标。
    echo		size	通过 diskpart list volume 命令返回的虚拟磁盘容量大小,
    echo 		不包含单位。
    net helpmsg 87
    popd
    exit /b 87
    
    :errTempDir
    net helpmsg 29
    popd
    exit /b 29
    
    :errLabel
    net helpmsg 12
    popd
    exit /b 12
    
    :errSize
    net helpmsg 14
    popd
    exit /b 14
    
    :errData
    net helpmsg 13
    popd
    exit /b 13
    
    :errPath
    net helpmsg 3
    popd
    exit /b 3
    
    :errDev
    net helpmsg 20
    popd
    exit /b 20
    
    :errCopying
    net helpmsg 8
    popd
    exit /b 8
    
    :errMounting
    net helpmsg 22
    popd
    exit /b 22
    
    :errDir
    net helpmsg 1
    popd
    exit /b 1
    
    :errVol
    net helpmsg 6
    popd
    exit /b 6
    
    :errSnapshot
    net helpmsg 24
    popd
    exit /b 24
    
    :errSysMounting
    net helpmsg 26
    popd
    exit /b 26
    
    :errUnmounting
    net helpmsg 31
    popd
    exit /b 31
    
    :exit
    net helpmsg 0
    cd /d "%root%"
    exit /b 0
    


    以上爲完整代碼


    Folding@Home


    • 已编辑 repl 2013年12月23日 12:51
    2013年12月23日 12:50

全部回复