さまざまなServer2008R2サーバーに展開できるすべてのwbadmin
スクリプトにワンサイズで収まるものを見つけようとしています。
私が抱えている問題は、すべてのサーバーに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
にallローカルドライブを含めるように指示する方法はありますか?
これは、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
構文を使用して最初の2文字(C :)にトリミングできます。
たくさんのいじくり回した後(私は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
-すべての重要なシステムドライブを含めたい(上記のスクリプトはvisibleドライブ文字のみをビルドするため、これは重要です。パーティションが存在する可能性があります。ドライブ文字のないサーバーを起動するには、バックアップが必要です)-vssFull
-これは、このサーバーで実行しているonlyバックアップなので、アーカイブビットをリセットするようにWindowsバックアップに指示します。-user:[email protected]
-これは、ドメインのBackup Operatorsグループのメンバーであるアカウントです(また、local BackupOperatorsグループにも含まれている必要があります。これはMicrosoftによる文書化が非常に不十分です。 )-password:1234password
-バックアップサービスアカウントのパスワード-quiet
-プロンプトを表示しません。これをグループポリシーの起動スクリプトとして実行するので、プロンプトは良くありません。-include:!_TEMPVAR!
-これは最も重要な部分です。バックアップするドライブを指定し、以前に収集したドライブの文字列を含みます。そして、それが機能していることを確認するために、GUIでそれをチェックします:
おそらく改善できること:ドライブ文字から実行する代わりに、ドライブGUIDは、このがドライブをバックアップしないため、より賢明なアイデアかもしれません。ドライブ文字でマウントされていません。したがって、NTFSパーティション内にディスクをマウントした場合、または何らかの理由でドライブにドライブ文字がない場合は、スキップされます。
一方、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%