我试图find一个适合所有的wbadmin
脚本,我可以部署到各种Server 2008 R2服务器。
我遇到的问题是,虽然所有的服务器都有一个C :,有些有E :,有一个E:和一个F:有的只有一个F :.
以下命令:
wbadmin enable backup -addtarget:\\backup1\Backups -schedule:23:00 -systemState -allCritical -vssFull -user:[email protected] -password:ladidada -quiet
只备份C:我看不到在wbadmin
中备份所有本地驱动器的任何选项。 当然,如果我尝试用机枪射击问题(通过添加-include:c:,d:,e:,f:
…等),那么我们得到ERROR - The path specified by 'g:' was not found
。
请不要告诉我,我必须让所有的本地驱动器,这样做。 有没有办法告诉wbadmin
备份时包括所有本地驱动器?
这是一个自动避免CD / DVD的变化。 它故意仅备份硬盘驱动器。
@echo off SETLOCAL ENABLEEXTENSIONS SETLOCAL ENABLEDELAYEDEXPANSION set remotebackup=\\backupserver\path for /F "usebackq eol=: skip=1 tokens=1" %%a in ( `wmic logicaldisk where "drivetype=3" get deviceid` ) do ( set "_drive=%%a:" set "_HDL=!_HDL!!_drive:~0,2!," ) if "%_HDL:~-1%"=="," (set _HDL=%_HDL:~0,-1%) if "%_HDL:~-2%"==",:" (set _HDL=%_HDL:~0,-2%) echo Found: %_HDL% wbadmin start backup -backuptarget:%remotebackup% -include:!_HDL! -allCritical -vssCopy -quiet -systemState
这构成了一个计划任务的一部分,这就是使用wbadmin start
而不是wbadmin enable
。
这里感兴趣的位是"drivetype=3"
并使用usebackq
(必需)。
马克的代码有助于跟踪这一点。
if语句删除最后一个逗号或逗号和冒号(如果存在)。 想不到一个更简单的方法来做到这一点。 %%a
被复制到_drive
因此可以使用:~0,2
_drive
将其修剪为前2个字符(C :)。
而从wmi中查找驱动器列表的解决scheme会更好。 如果你知道你只有e:f:和g:那么这将工作正常
set wbinclude= if exist e:\*.* set wbinclude=e:\ if exist f:\*.* set wbinclude=%wbinclude% f:\ if exist g:\*.* set wbinclude=%wbinclude% f:\ if not "%wbinclude%"=="" set wbinclude=-includes %wbinclude% echo wbadmin enable backup -addtarget:\\backup1\Backups -schedule:23:00 -systemState -allCritical -vssFull -user:[email protected] -password:ladidada -quiet %wbinclude%
在一堆垃圾(我讨厌DOS配料)之后,我想出了以下内容。 它似乎运作良好:
@echo off SETLOCAL ENABLEEXTENSIONS SETLOCAL ENABLEDELAYEDEXPANSION FOR /f %%I IN ( 'wmic volume get driveletter' ) DO ( ECHO %%I | FIND ":" IF ERRORLEVEL 1 ( echo Failed: %%I ) ELSE ( ECHO %%I | FIND "D:" IF ERRORLEVEL 1 ( IF NOT [!_TEMPVAR!]==[] SET _TEMPVAR=!_TEMPVAR!, SET _TEMPVAR=!_TEMPVAR!%%I ) ELSE ( echo Skipping CD-ROM ) ) ) wbadmin enable backup -addtarget:\\backupserver\Backups -schedule:23:00 -systemState -allCritical -vssFull -user:[email protected] -password:1234password -quiet -include:!_TEMPVAR!
解剖是:
该批的第一部分查找来自wmic volume get driveletter
所有驱动器号wmic volume get driveletter
。 它通过检查:
字符来检查每行是否是一个有效的驱动器号(因为输出包含一些我们不需要的详细信息)。
然后,它检查驱动器是否是D:
就像我的情况一样,这些都是光驱,当在wbadmin
指定时会导致错误并跳过它们。
然后,检查string是否包含内容。 如果有,则后缀为逗号( ,
)。 如果string是空白的,它什么也不做。
然后,它会将该驱动器号附加到该variables。
它执行wbadmin
:
wbadmin enable backup
– 指定我们要设置Windows备份计划 -addtarget:\\enetsbackup1\Backups
– 我想备份到一个networking位置,所以我在这里指定它。 -schedule:23:00
– 我希望备份在晚上11点运行 -systemState
– 我想包含裸机还原的系统状态 -allCritical
– 我希望包含所有关键系统驱动器(这很重要,因为上面的脚本只能生成可见的驱动器盘符,可能有些分区需要备份才能启动没有驱动器盘符的服务器) -vssFull
– 这是我们在此服务器上执行的唯一备份,因此请告诉Windows备份重置存档位。 -user:[email protected]
– 这是该域中备份操作员组的成员帐户(也需要在本地备份操作员组中,这是微软很差的文档) -password:1234password
– 备份服务帐户的密码 -quiet
– 不要做任何提示。 我将在组策略中将其作为启动脚本运行,因此提示很糟糕。 -include:!_TEMPVAR!
– 这是最关键的部分。 它指定应备份哪些驱动器,并包括我们之前收集的驱动器的string。 只是为了确认它的工作,在GUI中检查它:
事情可能会改善:不用从驱动器盘符运行,驱动器GUID可能是一个更聪明的想法,因为这不会备份没有安装盘符的驱动器 。 所以,如果您在NTFS分区中安装了磁盘,或者由于某种原因驱动器没有驱动器盘符,则会被跳过。