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
包括全部备份时使用本地驱动器吗?
答案1
这是自动避开 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
,因此可以使用语法将其修剪为前 2 个字符 (C:) :~0,2
。
答案2
而从 wmi 查找驱动器列表的解决方案会更好。如果你知道你只有 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%
答案3
经过一番折腾(我讨厌 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
。它通过检查字符来检查每一行是否实际上是有效的驱动器号(因为输出包含一些我们不需要的详细信息):
。
然后,它会检查驱动器是否是,D:
因为在我的情况下,这些都是光驱,当指定时会导致错误wbadmin
并跳过它们。
然后,检查字符串中是否有内容。如果有,则添加逗号 ( ,
)。如果字符串为空,则不执行任何操作。
然后,它将驱动器号附加到变量。
然后,它执行wbadmin
:
wbadmin enable backup
- 指定我们要设置 Windows 备份计划-addtarget:\\enetsbackup1\Backups
- 我想备份到网络位置,因此在这里指定它。-schedule:23:00
- 我希望每晚 11 点运行备份-systemState
- 我希望裸机恢复中包含系统状态-allCritical
- 我想要包含所有关键系统驱动器(这很重要,因为上面的脚本只构建可见的驱动器号。可能存在需要备份才能启动没有驱动器号的服务器的分区)-vssFull
- 这是仅有的我们正在此服务器上进行备份,因此告诉 Windows 备份重置存档位。-user:[email protected]
- 这是域中备份操作员组成员的帐户(并且也需要属于当地的备份操作员组也是如此。这是微软的一份非常糟糕的文档)-password:1234password
- 备份服务帐户的密码-quiet
- 不要发出任何提示。我将在组策略中将其作为启动脚本运行,因此提示不好。-include:!_TEMPVAR!
- 这是最关键的部分。它指定应备份哪些驱动器,并包括我们之前收集的驱动器字符串。
为了确认它是否有效,请在 GUI 中检查它:
可能需要改进的地方:与从驱动器号运行相比,驱动器 GUID 可能是一个更聪明的想法,因为这样不会备份未安装驱动器号的驱动器。因此,如果您在 NTFS 分区内安装了磁盘,或者驱动器由于某种原因没有驱动器号,它将被跳过。