昨天分享了一個自動備份 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