VDD Check-out Scripts

Abacus Technology

Background

This paper describes the VBScripts I developed to verify the accuracy of file listings in Version Description Documents (VDDs) prior to being used by Server Admins and DBAs on Production deployment nights.


During the early years of the Information Management and Communications Support (IMCS) contract at Kennedy Space Center (KSC), the Mission Assurance QA Group was responsible for ensuring the accuracy of VDDs. One area in the VDD where accuracy was critical, was the listing of the files to be deployed to Production. During the test phase of the software development lifecycle, it was possible that the VDD file listings could get out of sync with the file versions to be deployed. If the Server Admin or DBA discovered that the file listings in the VDD didn’t match the physical files in the staging area, then the release was pulled from the deployment.

Verifying VDD content was a manually intensive and error prone process. The likelihood of not catching errors increased proportionally to the number of files in the deployment list. It was not uncommon to have hundreds of files listed. The tester had to check each file’s date/time stamp and size. In addition, the status of missing or excess files had to be verified from both the VDD to the staging area and from the staging area to the VDD—a very tedious and time consuming task.

The solution took the form of a VBScript which would perform the file comparisons and produce a report that could easily be sent to the development team for resolution.

CheckVDD.vbs

Script Design

Sub ReportFileStatus()

Subroutine which compares the file attributes in the VDD with the file attributes in the staging area and writes the results to a log file.

Sub ProcessFile()

Subroutine which parses out files from the VDD. Calls ReportFileStatus().

Sub ShowFileList(folderspec)

Subroutine which builds an array of filenames from the staging area. Called by ShowFolderList(folderspec)

Function ShowFolderList(folderspec)

A function which traverses the folders in the root directory recursively. Calls ShowFileList(folderspec).

Sub FindMissingVddFiles

Subroutine which compares an array of files from the staging area with an array of files from the VDD and writes the results to a log file.

Sub ReadThrough

Subroutine which reads the text version of the VDD and sets the position in the file at the start of the file listing.

The main script section defines and initializes all variables and constants; prompts the tester for the application’s root directory path; initializes the log file; reads through and processes the input VDD text file; and writes summary information to a log.

NOTE: If you are running Windows 7 or Vista, you may get the following error message when trying to run scripts with the .vbs extension: There is no script engine for file extension ‘.vbs’. A registry fix is required to resolve the problem. I have a script available for Download. Remember to back up your registry before running the update.

'----------------------------------------------------------------------------------------------------------------------
'  Script for verifying files listed in a VDD against an Application Staging Area.
'  
'    File Attributes checked: Date Last Modified and Size
'    Count of files in VDD checked against count of files in the specified App Staging Area
'      Any files missing from the VDD are identified and listed in the Summary
'
'  Author: Gerard Sczepura
'
'  Description:
'    1.  Development runs the following command at the application root directory to create the file list for the VDD.
'        dir "<app root folder in UNC format>" /s /a-d > <output file>
'
'         Example: dir "\\MORBIUS2\Shares\ALT-Common" /s /a-d > d:\vddfiles.txt
'
'    2.  The following directories need to be created on the tester's machine:
'        D:\vdd\in
'        D:\vdd\out
'
'    3.  The script prompts the user for the application root directory in UNC format. The root
'        directory must match the value specified in the dir command from step 1.
'
'        Example: \\MORBIUS2\Shares\ALT-Common
'
'    4.  To create the input file 'D:\vdd\in\filelist.txt' open the VDD in MS Word and save
'          as type: Plain Text (*.txt).
'
'    5.  The run log is generated in 'D:/vdd/out/results.htm'
'
'  Baselined:  5/29/2009
'
'  Change History:
'    06/10/2009     Modified main to retrieve app root dir from a .txt file.
'                   Changed 'Dev Staging' to 'Staging Area' to be generic.
'
'    06/24/2009     Added functionality to list files missing from the VDD.
'                   Fixed a bug to remove extra "\" after root directory.
'
'    07/01/2009     Fixed a bug in the calculation of the iLenRoot variable for root dirs containing  
'                     subdirs, such as "Apps\Cisco"
'
'    08/19/2009     Updated messages in the Summary section.
'                   Added LCase function to string compares in FindMissingVddFiles.
'                   Modified ShowFolderList to list files top-down.
'
'    10/02/2009     Fixed a bug to increase the size of the vddFiles and stageFiles arrays from 300 to 1000.
'                   Redesigned the code which detects application subdirectories and improves reliability in handling
'                     staging areas other than Dev Staging.
'
'    11/19/2009     Reversed the design change made on 10/02/2009 and Modified the code which detects
'                     subdirectories to allow for UNC file specifications instead of drive letters.
'                   Modified text in the Description section of the comments block.
'                   Made changes to the output file start/end message text.
'                   Changed the code which acquires the root directory from reading a file to retrieving from a
'                     dialog box prompt.
'                   Converted results log file to HTML.
'
'    02/03/2010     Modified the script to allow reading the file list directly from a plain text formatted VDD instead
'                     of requiring the tester to cut-and-paste the files list into a .txt file. Created new subroutine
'                     ReadThrough.
'
'    12/09/2011     Modified global variable hTab from spaces to &nbsp; to support HTML output.
'----------------------------------------------------------------------------------------------------------------------

Sub ReportFileStatus()
  Dim chkFile, DtTm
  Dim fso, f

  Set fso = CreateObject("Scripting.FileSystemObject")

  chkFile = rootDir & subDir & filename
  DtTm = ""

  If (fso.FileExists(chkFile)) Then
    iFound = iFound + 1
    vSub = vSub + 1
    vddFiles(vSub) = chkFile
    Set f = fso.GetFile(chkFile)
    DtTm = f.DateLastModified
    am_pm = Mid(DtTm, Len(DtTm) -2, 3)
                
    ' Trim off the seconds from the file property
    DtTm = Mid(DtTm, 1,  InStrRev(DtTm, ":") - 1) & am_pm

    ' Check remaining file attributes
    If DtTm = datetime Then
      If filesize <> CStr(f.Size) Then
        Results.Write "<font color=" & dq & "red" & dq & ">"
        Results.Write hTab & subDir & filename & hTab & " Error: " & "File Size Mismatch!"
        Results.Write "</font>"
        Results.Write "<br>"
        Results.Write hTab & hTab & "Expected: " & filesize & hTab & "Found: " & f.Size
        Results.Write "<br><br>"
        errs = errs + 1
      End If
    Else
      Results.Write "<font color=" & dq & "red" & dq & ">"
      Results.Write hTab & subDir & filename & hTab & " Error: " & "Date/Time Mismatch!"
      Results.Write "</font>"
      Results.Write "<br>"
      Results.Write hTab & hTab & "Expected: " & datetime & hTab & "Found: " & DtTm
      Results.Write "<br><br>"
      errs = errs + 1
    End If
  Else
    Results.Write "<font color=" & dq & "red" & dq & ">"
    Results.Write hTab & subDir & filename & hTab & " Error: " & "File Not Found!"
    Results.Write "</font>"
    Results.Write "<br><br>"
 End If
End Sub

Sub ProcessFile()
  Dim timespec
        
  '  ---------- replace Tabs with spaces
  filespec = Replace(filespec, hTab, " ")
  filespec = Trim(filespec)

  '  ---------- get attributes
  attrs = Array("","","","")
  For i = 0 to 3
    attrs(i) = Mid(filespec, 1, InStr(filespec, " ") - 1)
    filespec = Mid(filespec, InStr(filespec, " "))
    filespec = Trim(filespec)
  Next

  filename = filespec
  datetime = attrs(0)
  timespec = attrs(1)
  filesize = attrs(3)

  '  ---------- trim leading zeroes from date & time
  If Instr(datetime, "0") = 1 Then
    datetime = Mid(datetime, 2)
  End If
  datetime = Replace(datetime, "/0", "/")
  If Instr(timespec, "0") = 1 Then
    timespec = Mid(timespec, 2)
  End If

  am_pm = attrs(2)
  datetime = datetime & " " & timespec & " " & am_pm

  '  ---------- remove commas
  filesize = Replace(filesize, ",", "")

  ReportFileStatus
End Sub

Sub ShowFileList(folderspec)
  Dim fso, f, f1, fc

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.GetFolder(folderspec)
  Set fc = f.Files
  For Each f1 in fc
    sSub = sSub + 1
    stageFiles(sSub) = f1
    fileCount = fileCount + 1
  Next
End Sub

Function ShowFolderList(folderspec)
  Dim fso, f, f1, s, sf

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.GetFolder(folderspec)
  Set sf = f.SubFolders

  For Each f1 in sf
    folderspec = folderspec & f1.name & "\"
    ShowFileList(folderspec)
    folderspec = ShowFolderList(folderspec)
    '  ---------- trim off processed subdirectory
    folderspec = Mid(folderspec, 1, Len(folderspec) -1)
    folderspec = Mid(folderspec, 1, InstrRev(folderspec, "\"))
  Next
   
  ShowFolderList = folderspec
End Function

Sub FindMissingVddFiles
  Dim x, y

  y = 0
  For x = 0 to sSub
    If LCase(stageFiles(x)) <> LCase(vddFiles(y)) Then
      Results.Write hTab & stageFiles(x) & "<br>"
    Else
      y = y + 1
    End If
  Next
End Sub

Sub ReadThrough
  Do While vdd_Files.AtEndOfStream <> True
    filespec = vdd_Files.ReadLine
    filespec = Trim(filespec)
    If InStr(1, filespec, "Volume in drive") > 0 Then
      Exit Do
    End If
  Loop
End Sub


'  Main _________________________________________

'  ---------- Loop and counter variables
Dim iLine, iFiles, iFound, errs, fileCount, iNotFound
Dim i, k
'  ---------- File system variables
Dim filePath_in, filePath_out, appDir
Dim fsoIn, fsoOut

'  ---------- Miscellaneous variables
Dim bExists
Dim vdd_Files, Results, Root
Dim RootFldr, DriveMapping
Dim filespec, filename, folderspec
Dim filesize, am_pm
Dim rootDir, subDir
Dim datetime
Dim attrs
Dim iLenRoot

'  ---------- Constants
Dim msgPrompt, msgPrompt2, msgTitle
Dim hTab, dq

hTab = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
dq = """"

msgPrompt = "Enter Root Directory in UNC format."
msgPrompt2 = "Example: \\MORBIUS2\Shares\ALT-Common"
msgTitle = "VDD Validation Script"

'  ---------- Arrays and subscripts for VDD and Staging files
Dim vddFiles(1000)
Dim stageFiles(1000)
Dim vSub, sSub

filePath_in = "D:\vdd\in\filelist.txt"
filePath_out = "D:\vdd\out\results.htm"

Set fsoIn = CreateObject("Scripting.FileSystemObject")
Set fsoOut = CreateObject("Scripting.FileSystemObject")

'  ---------- get the app root directory
Do While k <> 3
  RootFldr = InputBox(msgPrompt & vbCrLf & vbCrLf & "   " & msgPrompt2, msgTitle)
  RootFldr = Trim(RootFldr)
  If RootFldr = "" Then
    Msgbox("Initiate, the Root Directory must be specified!")
    RootFldr = ""
    k = k + 1
  Else
    If fsoIn.FolderExists(RootFldr) Then
      Exit Do
    Else
      Msgbox("Padawan, the Directory must be valid!")
      RootFldr = ""
      k = k + 1
    End If
  End If
Loop

iLenRoot = Len(RootFldr)
rootDir = RootFldr

'  ---------- get the files
Set vdd_Files = fsoIn.OpenTextFile(filePath_in, 1)
Set Results = fsoOut.OpenTextFile(filePath_out, 2, True)

Results.Write "<html>"
Results.Write "<HEAD>"
Results.Write "<TITLE>VDD Validation Script Results</TITLE>"
Results.Write "</HEAD>"
Results.Write "<body>"

vSub = -1
sSub = -1
iLine = 0
iFound = 0
iFiles = 0
errs = 0
filespec = ""

Results.Write "Comparing VDD to Staging Area on " & Date & " at " & Time
Results.Write "<br><br>"
Results.Write "App Root Directory: " & rootDir
Results.Write "<br><br>"

rootDir = rootDir & "\"

ReadThrough

Do While vdd_Files.AtEndOfStream <> True
  filespec = vdd_Files.ReadLine
  filespec = Trim(filespec)

  If filespec <> "" And InStr(1, filespec, "Volume") = 0 Then
    If InStr(1, filespec, "Directory of ") <> 0 Then
      If Len(Mid(filespec, 14 + iLenRoot)) > 0 Then       ' Len("Directory of ") +1 = 14
        subDir = Mid(filespec, 14 + iLenRoot + 1) & "\"   ' iLenRoot + 1 to skip "\"
      End If
    Else
      If InStr(1, filespec, "File(s)") = 0 Then
        If InStr(1, filespec, "Total Files") <> 0 Then
          filespec = vdd_Files.ReadLine
          filespec = Trim(filespec)
          iFiles = CInt(Mid(filespec, 1, InStr(1, filespec, "F") - 2))
          Exit Do
        Else
          iLine = iLine+1
          ProcessFile
        End If
      End If
    End If
  End If
Loop

vdd_Files.Close

'  ---------- get the count and list of files in Staging Area
fileCount = 0
ShowFileList(rootDir)
ShowFolderList(rootDir)

'  ---------- produce the summary and finish
Results.Write "...Compare Completed on " & Date & " at " & Time
Results.Write "<br><br>"
Results.Write "_______________  SUMMARY  _________________"
Results.Write "<br><br>"
Results.Write " >>> VDD to Staging Area Results <<<"
Results.Write "<br><br>"
Results.Write "Total Files in VDD = " & iLine & "<br>"
iNotFound = iLine - iFound
Results.Write "Total Files Missing in Staging Area = " & iNotFound & "<br>"
Results.Write "Total Mismatched Files = " & errs
Results.Write "<br><br>"
Results.Write " >>> Staging Area to VDD Results <<<"
Results.Write "<br><br>"
Results.Write "Total Files Expected = " & iFiles & "<br>"
Results.Write "Files Counted in Staging Area = " & fileCount & "<br>"
If iLine < fileCount + iNotFound Then
  Results.Write "<br><br>"
  Results.Write "<font color=" & dq & "red" & dq & ">"
  Results.Write "***** !!ERROR: Files Missing in the VDD!! *****"
  Results.Write "</font>"
  Results.Write "<br><br>"
  FindMissingVddFiles
End If

Results.Write("</body>")
Results.Write("</html>")

Results.Close

Set Up

      1. Create the following directories:
        mkdir D:\vdd\in
        mkdir D:\vdd\out
  1. Run the DIR command from a CMD window to create the input text file. The following is used as an example:
    dir "\\MORBIUS2\Shares\ALT-Common" /s /a-d > d:\vdd\in\filelist.txt

Running CheckVDD.vbs

  1. Invoke the CheckVDD.vbs script and when prompted, enter the UNC path of the root directory as shown in the example below:
    Script prompt
  2. If the tester happens to enter a path that doesn’t exist the script displays the following message:
    Script prompt
  3. The file list in the VDD is compared to the Root Directory and the results written to D:\vdd\out\results.htm

Results

The following are the results of our sample run (text in highlighted rows are displayed in RED when viewed in a Browser):

App Root Directory: \\MORBIUS2\Shares\ALT-Common 

     Drivers\VPC-EB290X\Backup\20111225_135016_FileRepository.nba      Error: File Size Mismatch!
          Expected: 530739411     Found: 530739311

     Drivers\VPC-EB290X\Backup\drvlist (2).csv      Error: File Not Found!

     Hotfix\symbols\dll\mpr.pdb      Error: Date/Time Mismatch!
          Expected: 3/11/2004 7:37 PM     Found: 3/10/2004 7:37 PM

     Hotfix\symbols\dll\user32.dbg      Error: Date/Time Mismatch!
          Expected: 3/23/2004 8:17 PM     Found: 3/23/2004 7:17 PM

...Compare Completed on 6/9/2013 at 2:40:50 PM

_______________ SUMMARY _________________

>>> VDD to Staging Area Results <<<

Total Files in VDD = 105
Total Files Missing in Staging Area = 1
Total Mismatched Files = 3

>>> Staging Area to VDD Results <<<

Total Files Expected = 105
Files Counted in Staging Area = 104

Ancillary Scripts

After completing the CheckVDD script I decided to write two follow-on scripts: CopyVDDFiles and FolderCompare. I adapted the algorithms from CheckVDD to create these two other scripts.

CopyVDDFiles prompts for the source folder because in practice, the files may not be copied from the same source folder where the DIR command was run.

The CopyVDDFiles script turned out to be an exercise and was never used to copy files to the Production staging area due to security restrictions in place at the time. Eventually, the Software Services group developed an automated deployment script framework for copying files to the test, development, and production servers.

The FolderCompare script has become obsolete since the commercial application Beyond Compare was acquired.

CopyVDDFiles.vbs

'----------------------------------------------------------------------------------------------------------------------
'  Script for copying files listed in a VDD to a Production staging area.
'  
'    Each file copied is listed in the results file indicating source and destination locations.
'    A count of files copied is displayed in the results file.
'
'  Author: Gerard Sczepura
'
'  Description:
'    1.  The following directories need to be created on the tester's machine:
'        D:\vdd\in
'        D:\vdd\out
'
'    2.  The script prompts the user for the source and destination folders.
'        Example: D:\Source
'
'    3.  To create the input file 'D:\vdd\in\filelist.txt' open the VDD in MS Word and save
'          as type: Plain Text (*.txt).
'
'    4.  The run log is generated in 'D:\vdd\out\fileCopyRes.htm'
'
'  Baselined:  12/15/2009
'
'  Change History:
'    02/04/2010     Modified the script to allow reading the file list directly from a plain text
'                     formatted VDD instead of requiring the tester to cut-and-paste the
'                     files list into a .txt file. Created new subroutine ReadThrough.
'
'    06/18/2013     Fixed bugs, cleaned up areas of the code, and added additional error checking.
'----------------------------------------------------------------------------------------------------------------------

Sub ProcessFile()
  Set fsoFldr = CreateObject("Scripting.FileSystemObject")

  '  ---------- replace Tabs with spaces
  filespec = Replace(filespec, vbTab, " ")
  filespec = Trim(filespec)

  '  ---------- get filename attribute
  filename = filespec
  filename = Mid(filename, Instr(filename, "M") + 1)
  filename = Trim(filename)
  filename = Mid(filename, Instr(filename, " "))
  filename = Trim (filename)

  '  ---------- save filenames and folders
  vSub = vSub + 1

  vddFiles(vSub) = rootDir & subDir & filename
  stageFiles(vSub) = targetFldr & subDir & filename
        
  '  ---------- create sub directory
  If fsoFldr.FolderExists(targetFldr & subDir) <> true Then
    fsoFldr.CreateFolder(targetFldr & subDir)
  End If
End Sub

Sub ReadThrough
  Do While vdd_Files.AtEndOfStream <> True
    filespec = vdd_Files.ReadLine
    filespec = Trim(filespec)
    If InStr(1, filespec, "Volume in drive") > 0 Then
      Exit Do
    End If
  Loop
End Sub


'  Main _________________________________________

'  ---------- Loop and counter variables
Dim i, k, vSub

'  ---------- File system variables
Dim filePath_in, filePath_out
Dim fsoIn, fsoOut, fsoCpy, fsoFldr

'  ---------- Miscellaneous variables
Dim vdd_Files, Results
Dim RootFldr, targetFldr
Dim filespec, filename, folderspec
Dim rootDir, subDir
Dim iLenRoot, iFileCount

'  ---------- Constants
Dim msgPrompt, msgPrompt2
Dim msgPrompt3, msgPrompt4
Dim msgTitle
Dim hTab, dq

hTab = "&nbsp;&nbsp;&nbsp;&nbsp;"
dq = """"

msgPrompt = "Enter Source Location in UNC or drive letter format."
msgPrompt2 = "Examples: \\MyServer\Source, D:\Source"
msgPrompt3 = "Enter Destination Location in UNC or drive letter format."
msgPrompt4 = "Examples: \\MyServer\Target, D:\Target"
msgTitle = "VDD File Copy Script"

'  ---------- Arrays and subscripts for VDD and Staging files
Dim vddFiles(1000)
Dim stageFiles(1000)

'  ---------- initialize the I/O files
filePath_in = "D:\vdd\in\filelist.txt"
filePath_out = "D:\vdd\out\fileCopyRes.htm"

Set fsoIn = CreateObject("Scripting.FileSystemObject")
Set fsoOut = CreateObject("Scripting.FileSystemObject")
Set fsoFldr = CreateObject("Scripting.FileSystemObject")

'  ---------- open the I/O files
Set vdd_Files = fsoIn.OpenTextFile(filePath_in, 1)
Set Results = fsoOut.OpenTextFile(filePath_out, 2, True)

'  ---------- setup the Results file for HTML
Results.Write "<html>"
Results.Write "<HEAD>"
Results.Write "<TITLE>VDD File Copy Script Results</TITLE>"
Results.Write "</HEAD>"
Results.Write "<body>"

Results.Write "Copying VDD files to Staging Area on " & Date & " at " & Time
Results.Write "<br><br>"

'  ---------- get the app root directory
Do While k <> 3
  RootFldr = InputBox(msgPrompt & vbCrLf & vbCrLf & "   " & msgPrompt2, msgTitle)
  RootFldr = Trim(RootFldr)
  If RootFldr = "" Then
    Msgbox("Initiate, the Root Directory must be specified!")
    k = k + 1
  Else
    If fsoIn.FolderExists(RootFldr) Then
      Exit Do
    Else
      Msgbox("Padawan, the Directory must be valid!")
      RootFldr = ""
      k = k + 1
    End If
  End If
Loop

iLenRoot = Len(RootFldr)
rootDir = RootFldr

'  ---------- get the target directory
Do While k <> 3
  targetFldr = InputBox(msgPrompt3 & vbCrLf & vbCrLf & "   " & msgPrompt4, msgTitle)
  targetFldr = Trim(targetFldr)
  If targetFldr = "" Then
    Msgbox("Initiate, the Target Directory must be specified!")
    k = k + 1
  Else
    If fsoFldr.FolderExists(targetFldr) Then
      Exit Do
    Else
      If Msgbox("Do you want to create folder: " & targetFldr & "?") = vbOK Then
        fsoFldr.CreateFolder(targetFldr)
        Exit Do
      Else
        Msgbox("Padawan, the Directory must be valid!")
        targetFldr = ""
        k = k + 1
      End If
    End If
  End If
Loop

vSub = -1
filespec = ""

Results.Write "Source Location: " & rootDir
Results.Write "<br>"
Results.Write "Destination: " & targetFldr
Results.Write "<br><br>"

If InstrRev(rootDir, "\") < Len(rootDir) Then
  rootDir = rootDir & "\"
End If

If InstrRev(targetFldr, "\") < Len(targetFldr) Then
  targetFldr = targetFldr & "\"
End If

ReadThrough

Do While vdd_Files.AtEndOfStream <> True
  filespec = vdd_Files.ReadLine
  filespec = Trim(filespec)

  If filespec <> "" And InStr(1, filespec, "Volume") = 0 Then
    If InStr(1, filespec, "Directory of ") <> 0 Then
      If Len(Mid(filespec, 14 + iLenRoot)) > 0 Then          ' Len("Directory of ") +1 = 14
        subDir = Mid(filespec, 14 + iLenRoot + 1) & "\"      ' iLenRoot + 1 to skip "\"
      End If
    Else
      If InStr(1, filespec, "File(s)") = 0 Then
        If InStr(1, filespec, "Total Files") <> 0 Then
          filespec = vdd_Files.ReadLine
          filespec = Trim(filespec)
          Exit Do
        Else
          ProcessFile
        End If
      End If
    End If
  End If
Loop

vdd_Files.Close

'  ---------- Copy the files
Set fsoCpy = CreateObject("Scripting.FileSystemObject")
iFileCount = 0

For i = 0 to vSub
  If fsoCpy.FileExists(vddFiles(i)) <> TRUE Then
    Msgbox(vddFiles(i) & " File doesn't exist!")
  Else
    iFileCount = iFileCount + 1
    fsoCpy.CopyFile vddFiles(i), stageFiles(i), true
    Results.Write vddFiles(i)
    Results.Write "<br>"
    Results.Write hTab & "<b>Copied to:&nbsp;</b>" & stageFiles(i)
    Results.Write "<br>"
  End If
Next

'  ---------- produce the summary and finish
Results.Write "<br>"
Results.Write "...Copy Script completed on " & Date & " at " & Time
Results.Write "<br><br>"
Results.Write hTab & iFileCount & "&nbsp File(s) copied to Destination"

Results.Write("</body>")
Results.Write("</html>")

Results.Close

Set Up

  1. Create the following directories:
    mkdir D:\vdd\in
    mkdir D:\vdd\out
  1. Run the DIR command from a CMD window to create the input text file. The following is used as an example:
    dir “D:\Preinstalled" /s /a-d > d:\vdd\in\filelist.txt

Running CopyVDDFiles.vbs

  1. Invoke the CopyVDDFiles.vbs script
  2. When prompted, enter the path of the source directory as shown in the example below:
    copyvdd_diag1
  3. When prompted, enter the path of the target directory as shown in the example below:
    copyvdd_diag2
  4. If the target folder doesn’t exist, the following prompt will be displayed:
    copyvdd_diag3
  5. Respond OK to create the target folder
  6. The files are copied and the results written to D:\vdd\out\fileCopyRes.htm

Results

The following are the results of our sample run (instances of “Copied to:” text are displayed in BOLD when viewed in a Browser):

Copying VDD files to Staging Area on 6/18/2013 at 7:33:54 PM

Source Location: D:\Preinstalled
Destination: \\MORBIUS2\Shares\ALT-Common\Target

D:\Preinstalled\autorun.inf
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\autorun.inf
D:\Preinstalled\Quick Reference Guide.pdf
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\Quick Reference Guide.pdf
D:\Preinstalled\Setup.exe
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\Setup.exe
D:\Preinstalled\Three (3) Year Standard Limited Warranty.pdf
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\Three (3) Year Standard Limited Warranty.pdf
D:\Preinstalled\autorun\Canvio3.ico
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\autorun\Canvio3.ico
D:\Preinstalled\autorun\Installer.exe
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\autorun\Installer.exe
D:\Preinstalled\autorun\pref.xml
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\autorun\pref.xml
D:\Preinstalled\Mac Driver\Instruction.pdf
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\Mac Driver\Instruction.pdf
D:\Preinstalled\Mac Driver\Tuxera NTFS for Mac.dmg
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\Mac Driver\Tuxera NTFS for Mac.dmg
D:\Preinstalled\NTI\autorun.new
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\NTI\autorun.new
D:\Preinstalled\NTI\Setup.exe
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\NTI\Setup.exe
D:\Preinstalled\OpenSourceSoftwareInfo\EndUserLicenseAgreement.pdf
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\OpenSourceSoftwareInfo\EndUserLicenseAgreement.pdf
D:\Preinstalled\OpenSourceSoftwareInfo\NTI OpenSourceSoftwareInfo.pdf
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\OpenSourceSoftwareInfo\NTI OpenSourceSoftwareInfo.pdf
D:\Preinstalled\OpenSourceSoftwareInfo\Tuxera OpenSourceSoftwareInfo.pdf
    Copied to: \\MORBIUS2\Shares\ALT-Common\Target\OpenSourceSoftwareInfo\Tuxera OpenSourceSoftwareInfo.pdf

...Copy Script completed on 6/18/2013 at 7:40:32 PM

    14  File(s) copied to Destination

FolderCompare.vbs

'--------------------------------------------------------------------------------------------------------------------------------
'  Script for comparing folder contents, subfolders are scanned recursively.
'  
'    File Attributes checked: Date Last Modified and Size
'
'      The scan runs in two phases. The first phase compares the primary folder to the secondary folder.
'      The second phase compares the secondary folder to the primary. The script will detect missing
'        files in either folder location.
'
'  Author: Gerard Sczepura
'
'  Description:
'    1.  The script prompts the user for the primary and secondary folder locations and the results filename.
'
'        If the user omits the primary or secondary folder location values, the script will display a message
'          dialog. If the user enters the same value for the primary and secondary location, the script will
'          display a message dialog.
'
'    2.  The run log is generated in the user specified filename.
'
'  Baselined:  11/20/2009
'
'  Change History:
'    06/20/2013     Fixed bugs.
'
'--------------------------------------------------------------------------------------------------------------------------------

Sub ShowFileList(folderspec, ps)
  Dim fso, f, f1, fc
  Dim fName

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.GetFolder(folderspec)
  Set fc = f.Files
  For Each f1 in fc
    Select Case ps
      Case "p"     vSub = vSub + 1
                   fName = Replace(LCase(f1.Path), LCase(pLoc), "", 1)
                   vddFiles(vSub) = fName & " " & f1.DateLastModified & " " & f1.Size
      Case "s"     sSub = sSub + 1
                   fName = Replace(LCase(f1.Path), LCase(sLoc), "", 1)
                   stageFiles(sSub) = fName & " " & f1.DateLastModified & " " & f1.Size
    End Select
  Next
End Sub

Function ShowFolderList(folderspec, ps)
  Dim fso, f, f1, s, sf

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.GetFolder(folderspec)
  Set sf = f.SubFolders

  For Each f1 in sf
    folderspec = folderspec & f1.name & "\"
    ShowFileList folderspec, ps
    folderspec = ShowFolderList(folderspec, ps)
    '  ---------- trim off processed subdirectory
    folderspec = Mid(folderspec, 1, Len(folderspec) -1)
    folderspec = Mid(folderspec, 1, InstrRev(folderspec, "\"))
  Next
 
  ShowFolderList = folderspec      
End Function

Sub GetArrayFields(aVal, vType)
  Dim aName, adtTime, aTime, aAMPM, afSize
        
  afSize = Mid(aVal, InstrRev(aVal, " "))         'Get file size
  aVal = Mid(aVal, 1, InstrRev(aVal, " ") - 1)    'Trim file size
  aAMPM = Mid(aVal, InstrRev(aVal, " "))          'Get AM/PM
  aVal = Mid(aVal, 1, InstrRev(aVal, " ") - 1)    'Trim AM/PM
  aTime = Mid(aVal, InstrRev(aVal, " "))          'Get time
  aVal = Mid(aVal, 1, InstrRev(aVal, " ") - 1)    'Trim time
  adtTime = Mid(aVal, InstrRev(aVal, " "))        'Get date
  aName = Mid(aVal, 1, InstrRev(aVal, " ") - 1)   'Trim date
  Trim(afSize)
  adtTime = Trim(adtTime) & aTime & aAMPM
  aName = Trim(aName)

  Select Case vType
    Case "p"      fNameX = aName
                  dtTimeX = adtTime
                  fSizeX = afSize
    Case "s"      fNameY = aName
                  dtTimeY = adtTime
                  fSizeY = afSize
  End Select
End Sub

Sub CompareFolders()
  Dim x, y
  Dim xVal, yVal

  Results.Write "_______________  SUMMARY  _________________"
  Results.Write "<br><br>"
  Results.Write " >>> Phase I: " & pLoc & " to " & sLoc & " Comparison <<<"
  Results.Write "<br><br>"

  '  ---------- Scan Phase I
  For x = 0 to vSub
    xVal = vddFiles(x)
    GetArrayFields xVal, "p"
    For y = 0 to sSub
      yVal = stageFiles(y)
      GetArrayFields yVal, "s"
      If LCase(fNameX) = LCase(fNameY) Then
        If dtTimeX <> dtTimeY Or fSizeX <> fSizeY Then
          Results.Write "<font color=" & dq & "red" & dq & ">"
          Results.Write "*** DateTime, FileSize Mismatch: <br>"
          Results.Write "</font>"
          Results.Write vddFiles(x) & "<br>"
          Results.Write stageFiles(y)
          Results.Write "<br><br>"
        End If
        bfound = True
        truncFiles(y) = ""
        Exit For
      End If
    Next
    If bfound <> True Then
      Results.Write "<font color=" & dq & "red" & dq & ">"
      Results.Write "*** File: " & fNameX & " not found in Secondary Location - " & sLoc
      Results.Write "</font>"
      Results.Write "<br><br>"
    Else
      bfound = False
    End If
  Next

  '  ---------- Scan Phase II
  Results.Write "<br>"
  Results.Write " >>> Phase II: " & sLoc & " to " & pLoc & " Comparison <<<"
  Results.Write "<br><br>"
                
  For y = 0 to sSub
    yVal = truncFiles(y)
    If yVal <> "" Then
      GetArrayFields yVal, "s"
      For x = 0 to vSub
        xVal = vddFiles(x)
        GetArrayFields xVal, "p"
        If LCase(fNameY) = LCase(fNameX) Then
          If dtTimeY <> dtTimeX Or fSizeY <> fSizeX Then
            Results.Write "<font color=" & dq & "red" & dq & ">"
            Results.Write "DateTime, FileSize Mismatch: <br>"
            Results.Write "</font>"
            Results.Write stageFiles(y) & "<br>"
            Results.Write vddFiles(x)
            Results.Write "<br><br>"
          End If
          bfound = True
          Exit For
        End If
      Next
      If bfound <> True Then
        Results.Write "<font color=" & dq & "red" & dq & ">"
        Results.Write "*** File: " & fNameY & " not found in Primary Location - " & pLoc
        Results.Write "</font>"
        Results.Write "<br><br>"
      Else
        bfound = False
      End If
    End If
  Next

  Results.Write "<br>"
  Results.Write "Compare Completed" & " on " & Date & " at " & Time
End Sub


'  Main _________________________________________

'  ---------- Constants
Dim msgPrompt, msgPrompt2, msgTitle
Dim dq

dq = """"

'  ---------- Loop and counter variables
Dim i, j, k

'  ---------- File System variables
Dim filePath_out
Dim fso, f, fsoOut

'  ---------- File attribute variables
Dim fNameX, dtTimeX, fSizeX
Dim fNameY, dtTimeY, fSizeY

'  ---------- Arrays and subscripts for file names
Dim vddFiles(1000)
Dim stageFiles(1000)
Dim truncFiles(1000)
Dim vSub, sSub

'  ---------- Root folder variables
Dim primaryLoc, secondaryLoc
Dim pLoc, sLoc

'  ---------- Prompt the user for folder locations and results file
Set fso = CreateObject("Scripting.FileSystemObject")
   
Do While k <> 3
  primaryLoc = InputBox("Enter Primary Folder location.", "Folder Compare Script")
  primaryLoc = Trim(primaryLoc)
  If primaryLoc = "" Then
    MsgBox("Initiate, the folder location must be specified!")
    k = k + 1
  Else
    If fso.FolderExists(primaryLoc) Then
      Exit Do
    Else
      Msgbox("Padawan, the folder location must be valid!")
      k = k + 1
    End If
  End If
Loop

k = 0

Do While k <> 3
  secondaryLoc = InputBox("Enter Secondary Folder location.", "Folder Compare Script")
  secondaryLoc = Trim(secondaryLoc)
  If secondaryLoc = "" Then
    MsgBox("Initiate, the folder location must be specified!")
    k = k + 1
  Else
    If fso.FolderExists(secondaryLoc) Then
      Exit Do
    Else
      Msgbox("Padawan, the folder location must be valid!")
      k = k + 1
    End If
  End If
Loop

k = 0

pLoc = primaryLoc
sLoc = secondaryLoc

If primaryLoc <> "" And secondaryLoc <> "" Then
  If LCase(primaryLoc) = LCase(secondaryLoc) Then
    MsgBox("Jedi Tester, the Folder locations are the same!")
  End If
Else
  MsgBox("Jedi Tester, one or both locations specified are NULL!")
End If

If Mid(primaryLoc, Len(primaryLoc), 1) <> "\" Then
  primaryLoc = primaryLoc & "\"
End If
If Mid(secondaryLoc, Len(secondaryLoc), 1) <> "\" Then
  secondaryLoc = secondaryLoc & "\"
End If

filePath_out = InputBox("Enter results file (*.htm)", "Folder Compare Script")

'  ---------- Open the output results file
Set fsoOut = CreateObject("Scripting.FileSystemObject")
Set Results = fsoOut.OpenTextFile(filePath_out, 2, True)

'  ---------- Begin the folder comparison
Results.Write "<html>"
Results.Write "<HEAD>"
Results.Write "<TITLE>Directory Comparison Script Results</TITLE>"
Results.Write "</HEAD>"
Results.Write "<body>"

Results.Write "Comparing Folders: " & pLoc & " to " & sLoc & " on " & Date & " at " & Time
Results.Write "<br><br>"

vSub = -1
sSub = -1

ShowFileList primaryLoc, "p"
ShowFolderList primaryLoc, "p"
ShowFileList secondaryLoc, "s"
ShowFolderList secondaryLoc, "s"

For j = 0 to sSub
  truncFiles(j) = stageFiles(j)
Next
CompareFolders

Results.Write("</body>")
Results.Write("</html>")

Results.Close

Set Up

  1. For this example, the script will compare the folders copied using the CopyVDDFiles.vbs script from the previous section. Some errors were introduced for illustration purposes.

Running FolderCompare.vbs

  1. Invoke the FolderCompare.vbs script
  2. Respond to the primary folder prompt as follows:
    fldrcomp_diag1
  3. Respond to the secondary folder prompt as follows:
    fldrcomp_diag2
  4. Respond to the results file prompt as follows:
    fldrcomp_diag3
  5. The script compares the two folder locations and writes the results to the specified log file

Results

The following are the results of our sample run (text in highlighted rows are displayed in RED when viewed in a Browser):

Comparing Folders: D:\Preinstalled to \\MORBIUS2\Shares\ALT-Common\Target on 6/22/2013 at 8:21:47 AM

_______________ SUMMARY _________________

>>> Phase I: D:\Preinstalled to \\MORBIUS2\Shares\ALT-Common\Target Comparison <<<

*** File: \quick reference guide.pdf not found in Secondary Location - \\MORBIUS2\Shares\ALT-Common\Target

*** DateTime, FileSize Mismatch:
\autorun\pref.xml 1/11/2012 2:57:59 AM 147
\autorun\pref.xml 6/18/2013 8:27:43 PM 147


>>> Phase II: \\MORBIUS2\Shares\ALT-Common\Target to D:\Preinstalled Comparison <<<

*** File: \autorun\canvio3.ico not found in Primary Location - D:\Preinstalled


Compare Completed on 6/22/2013 at 8:24:09 AM

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *