Using WSH to create an off-line backup of a FrontPage-enabled Web Site

As the old adage says, "Necessity is the mother of invention." With that in mind, I had a friend drop by my office the other day and ask me a question that started me on another quest for code.

What he asked me was whether there was a way where he could create an off-line backup of his web site. Of course, there are whole sections of the industry these days that are devoted to such things, but he wanted a simple way to create a backup on his home or work computer of his web site that is hosted at an ISP. Some time ago I wrote a FrontPage VBA macro for another friend that could be used to automate publishing, but only from within the FrontPage application itself. Since the FrontPage application exists as a COM object, I theorized that I could rewrite the code from the macro into a Windows Script Host (WSH) application that should do the trick. The code that you see below is the results of my little 'experiment'.

Usage Notes:

  • To use this script, you need to have a copy of FrontPage installed on the computer where you run the script.
  • In the script code you will need to update the source web site's URL and destination folder, as well as the user name and password to use when opening the source web site.
  • The WSH script will create a folder under "c:\backups" that will contain a folder named for your web site, and then it will create folders underneath the web site folder that are a concatenation of the current date and time. (This allows automating or manually re-running the script several times.)

Once you have taken the above items into account, copy & paste the script code into Notepad and save it to your computer with a "*.vbs" file extension. To execute the code, just double-click the script. The script will pop-up a message box when it has finished publishing a copy of the web site to your computer.

Option Explicit

' --------------------------------------------------
'
' Declare our constants.
'
' --------------------------------------------------

Const fpPublishAddToExistingWeb = 2
Const fpPublishCopySubwebs = 4
Const fpPublishLogInTempDir = 8
Const fpPublishCopyAllFiles = 64

' --------------------------------------------------
'
' This section defines the publishing variables.
'
' --------------------------------------------------

Dim strSourceUrl, strDestinationFolder
Dim strUsername, strPassword
Dim strBackupDate, strBackupTime

strBackupDate = Cstr(Year(Date())) & _
    Right("00" & Cstr(Month(Date())),2) & _
    Right("00" & Cstr(Day(Date())),2)
strBackupTime = Right("00" & Cstr(Hour(Time())),2) & _
    Right("00" & Cstr(Minute(Time())),2) & _
    Right("00" & Cstr(Second(Time())),2)

strSourceUrl = "https://www.example.com/"
strDestinationFolder = "c:\Backups\www.example.com\" & _
    strBackupDate & "_" & strBackupTime

strUsername = "server\administrator"
strPassword = "Password1"

' --------------------------------------------------
'
' This section checks to see if FrontPage is
' installed, and exits if it is not installed.
'
' --------------------------------------------------

' wait 10 seconds to "debounce" the server
WScript.Sleep 10000

' get a FrontPage Application object
Dim objFP: Set objFP = WScript.CreateObject("FrontPage.Application")

' exit if the object does not exist
If Err.Number = -2147352567 Then WScript.Quit

' --------------------------------------------------
'
' This section publishes the webs.
'
' --------------------------------------------------

' sanitize the publishing path
strDestinationFolder = CleanPath(strDestinationFolder)

' only continue the path can actually be created
If MakePath(strDestinationFolder) = True Then

    ' open the root web on the source
    objFP.Webs.Open strSourceUrl, strUsername, strPassword

    ' publish the root web to the destination
    objFP.ActiveWeb.Publish strDestinationFolder, _
        fpPublishAddToExistingWeb + fpPublishCopySubwebs + fpPublishCopyAllFiles + fpPublishLogInTempDir

    ' close the root web
    objFP.ActiveWeb.Close

End If

' --------------------------------------------------
'
' This section cleans up and exits.
'
' --------------------------------------------------

Set objFP = Nothing
WScript.Quit

' ----------------------------------------
'
' This function builds a path
'
' PASS: File path to construct
' RETURN: TRUE/FALSE for success/failure
'
' ----------------------------------------

Function MakePath(tmpText)
    On Error Resume Next
    Dim tx,ty,tz
    Dim tmpFSO
    Dim blnTempStatus
    Set tmpFSO = WScript.CreateObject("Scripting.FileSystemObject")
    blnTempStatus = True
    ty = Split(tmpText,"\")
    For tx = 0 To UBound(ty)
        tz = tz & ty(tx) & "\"
        If tmpFSO.FolderExists(tz) = False Then
            tmpFSO.CreateFolder(tz)
            If Err.Number <> 0 Then blnTempStatus = False
        End If
    Next
    MakePath = blnTempStatus
End Function

' ----------------------------------------
'
' This function sanitizes a path for valid characters
'
' PASS: File path to construct
' RETURN: New path
'
' ----------------------------------------

Function CleanPath(tmpText)
    On Error Resume Next
    Const tmpValid = "\.-1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    Dim tx,ty,tz
    For tx = 1 To Len(tmpText)
        ty = Mid(tmpText,tx,1)
        If (InStr(tmpValid,ty)>0) Or (tx=2 and ty=":") Then
            tz = tz & ty
        Else
            tz = tz & "_"
        End If
    Next
    CleanPath = tz
End Function

Happy coding!


Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/

Comments are closed