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 contants.
'
' **************************************************

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 = "http://www.example.com/"
strDestinationFolder = "c:\Backups\www.example.com\" & _
  strBackupDate & "_" & strBackupTime

strUsername = "servera\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!