wbadmin 备份所有本地驱动器

wbadmin 备份所有本地驱动器

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 中检查它:

wbadmin 命令的结果

可能需要改进的地方:与从驱动器号运行相比,驱动器 GUID 可能是一个更聪明的想法,因为这样不会备份未安装驱动器号的驱动器。因此,如果您在 NTFS 分区内安装了磁盘,或者驱动器由于某种原因没有驱动器号,它将被跳过。

相关内容