Backup VMware Server Guests

@ECHO OFF


::Backup of Virtual Hard Drives and Configuration Files
::Only tested on Server 2003 running VMware Server version 2.0.1 build-156745
::http://www.virtuatopia.com/index.php/Controlling_VMware_Virtual_Machines_from_the_Command_Line_with_vmrun

::For a list of running VMs and on the server run this from the VM Host
::"C:\Program Files\VMware\VMware Server\vmrun.exe" -T server -h https://localhost:8333/sdk -u ADMIN -p PASS list



:WARNING

echo By running the backup the guest server(s) will be shutdown

echo Are you sure you wish to continue?

timeout /T 30

cls



:: Header of Logfile

echo. >> "C:\IT\VM-Backup.log"

echo %date% >> "C:\IT\VM-Backup.log"



::Variables:

set bakloc="\\vmserver2\e$\BACKUP-VM1"

SET /A SRV=1

set vmrun="C:\Program Files\VMware\VMware Server\vmrun.exe"

set username=ADMIN

set password=PASS

set datastore=E:\Virtual Machines



:: Verify mapped Drive "V:\"

if not exist v: net use v: %bakloc%

if not exist v: echo Mapped Drive V:\ or link to %bakloc% not present >> "C:\IT\VM-Backup.log"

if not exist v: goto END



set overall=%time%

goto %SRV%



:1

set start=%time%

set SERVER=TEST1

SET VMGUEST="[VMSERVER1] TEST1/Windows Server 2003 Enterprise Edition.vmx"

Title Backup of %SERVER% in Progress

::if exist "V:\%server%" del "V:\%server%\*.*" /q

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% stop %VMGUEST% soft

timeout /T 120

xcopy "%datastore%\%SERVER%\*.vmdk" "V:\%SERVER%\" /C /R /Y

xcopy "%datastore%\%SERVER%\*.vmx" "V:\%SERVER%\" /C /R /Y

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% start %VMGUEST%

set finish=%time%

goto CON



:2

set start=%time%

set SERVER=TEST2

SET VMGUEST="[VMSERVER1] TEST2/Windows XP Professional.vmx"

Title Backup of %SERVER% in Progress

::if exist "V:\%server%" del "V:\%server%\*.*" /q

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% stop %VMGUEST% soft

timeout /T 120

xcopy "%datastore%\%SERVER%\*.vmdk" "V:\%SERVER%\" /C /R /Y

xcopy "%datastore%\%SERVER%\*.vmx" "V:\%SERVER%\" /C /R /Y

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% start %VMGUEST%

set finish=%time%

goto CON



:3

set start=%time%

set SERVER=TEST3

SET VMGUEST="[VMSERVER1] TEST3/Windows Server 2003 Enterprise Edition.vmx"

Title Backup of %SERVER% in Progress

::if exist "V:\%server%" del "V:\%server%\*.*" /q

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% stop %VMGUEST% soft

timeout /T 120

xcopy "%datastore%\%SERVER%\*.vmdk" "V:\%SERVER%\" /C /R /Y

xcopy "%datastore%\%SERVER%\*.vmx" "V:\%SERVER%\" /C /R /Y

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% start %VMGUEST%

set finish=%time%

goto CON



:4

set start=%time%

set SERVER=TEST4

SET VMGUEST="[VMSERVER1] TEST4/Windows Server 2003.vmx"

Title Backup of %SERVER% in Progress

::if exist "V:\%server%" del "V:\%server%\*.*" /q

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% stop %VMGUEST% soft

timeout /T 120

xcopy "%datastore%\%SERVER%\*.vmdk" "V:\%SERVER%\" /C /R /Y

xcopy "%datastore%\%SERVER%\*.vmx" "V:\%SERVER%\" /C /R /Y

%vmrun% -T server -h https://localhost:8333/sdk -u %username% -p %password% start %VMGUEST%

set finish=%time%

goto CON



:: Add new servers to the list above

:: Keep This Set Last but update the number!



:5

echo.

echo %start%

set start=%overall%

set finish=%time%

set SRV=0

set SERVER=done

goto CON



:CON

:: time conversion

set shh=%start:~0,2%

set smm=%start:~3,2%

set sss=%start:~6,2%

set sms=%start:~9,2%

if %shh% LSS 10 set shh=%shh:~1,1%

if %smm% LSS 10 set smm=%smm:~1,1%

if %sss% LSS 10 set sss=%sss:~1,1%

if %sms% LSS 10 set sms=%sms:~1,1%

SET /a Start100S=%shh%*360000+%smm%*6000+%sss%*100+%sms%

set fhh=%finish:~0,2%

set fmm=%finish:~3,2%

set fss=%finish:~6,2%

set fms=%finish:~9,2%

if %fhh% LSS 10 set fhh=%fhh:~1,1%

if %fmm% LSS 10 set fmm=%fmm:~1,1%

if %fss% LSS 10 set fss=%fss:~1,1%

if %fms% LSS 10 set fms=%fms:~1,1%

SET /a Finish100S=%fhh%*360000+%fmm%*6000+%fss%*100+%fms%



:: START midnight rollover. If so, add 1 day=8640000 1/100ths secs

IF %Finish100S% LSS %Start100S% SET /a Finish100S+=8640000

SET /a TookTime=%Finish100S%-%Start100S%



if %TookTime% LEQ 99 goto MILLI

if %TookTime:~0,-2% GEQ 3600 goto HRS

if %TookTime:~0,-2% GEQ 60 goto MINS

if %TookTime:~0,-2% GEQ 1 goto SECS

goto ERR0



:HRS

SET /A HRS=%TookTime:~0,-2%/3600

SET /A MINS=(%TookTime:~0,-2%-%HRS%*3600)/60

SET /A SECS=%TookTime:~0,-2%-(%HRS%*3600+%MINS%*60)

set ELAPSED=%HRS% Hours %MINS% Minutes %SECS%.%TookTime:~-2% Seconds

IF %SERVER% NEQ done echo %SERVER% elapsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SERVER% EQU done echo Total elaspsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SRV% EQU 0 goto END

SET /A SRV=%SRV%+1

goto %SRV%



:MINS

SET /A MINS=%TookTime:~0,-2%/60

SET /A SECS=%TookTime:~0,-2%-%MINS%*60

set ELAPSED=%MINS% Minutes %SECS%.%TookTime:~-2% Seconds

IF %SERVER% NEQ done echo %SERVER% elapsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SERVER% EQU done echo Total elaspsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SRV% EQU 0 goto END

SET /A SRV=%SRV%+1

goto %SRV%



:SECS

set ELAPSED=%TookTime:~0,-2%.%TookTime:~-2% Seconds

IF %SERVER% NEQ done echo %SERVER% elapsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SERVER% EQU done echo Total elaspsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SRV% EQU 0 goto END

SET /A SRV=%SRV%+1

goto %SRV%



:MILLI

set ELAPSED=.%TookTime:~-2% Seconds

IF %SERVER% NEQ done echo %SERVER% elapsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SERVER% EQU done echo Total elaspsed time: %ELAPSED% >> "C:\IT\VM-Backup.log"

IF %SRV% EQU 0 goto END

SET /A SRV=%SRV%+1

goto %SRV%



:ERR0

IF %SRV% EQU 0 goto END

SET /A SRV=%SRV%+1

goto %SRV%



:END

net use /del v: /y

exit