PoshCode Archive  Hex Artifact Content

Artifact 403c32cfbcddb10f7019be6f89393823b11e9cbe629ee22bfcb1a0292d2381c7:

  • File This-newer-version-of-the-.ps1 — part of check-in [7200ab4da3] at 2018-06-10 14:01:00 on branch trunk — This newer version of the ExBPA only creates HTML based reports for each server. This setup made the reports difficult to compile and notarize. So I made a parser to read the HTML and convert the pertinent data into CSV files. (user: Josh Wortz size: 2746)

0000: 23 20 65 6e 63 6f 64 69 6e 67 3a 20 61 73 63 69  # encoding: asci
0010: 69 0d 0a 23 20 61 70 69 3a 20 70 6f 77 65 72 73  i..# api: powers
0020: 68 65 6c 6c 0d 0a 23 20 74 69 74 6c 65 3a 20 0d  hell..# title: .
0030: 0a 23 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 20  .# description: 
0040: 54 68 69 73 20 6e 65 77 65 72 20 76 65 72 73 69  This newer versi
0050: 6f 6e 20 6f 66 20 74 68 65 20 45 78 42 50 41 20  on of the ExBPA 
0060: 6f 6e 6c 79 20 63 72 65 61 74 65 73 20 48 54 4d  only creates HTM
0070: 4c 20 62 61 73 65 64 20 72 65 70 6f 72 74 73 20  L based reports 
0080: 66 6f 72 20 65 61 63 68 20 73 65 72 76 65 72 2e  for each server.
0090: 20 54 68 69 73 20 73 65 74 75 70 20 6d 61 64 65   This setup made
00a0: 20 74 68 65 20 72 65 70 6f 72 74 73 20 64 69 66   the reports dif
00b0: 66 69 63 75 6c 74 20 74 6f 20 63 6f 6d 70 69 6c  ficult to compil
00c0: 65 20 61 6e 64 20 6e 6f 74 61 72 69 7a 65 2e 20  e and notarize. 
00d0: 53 6f 20 49 20 6d 61 64 65 20 61 20 70 61 72 73  So I made a pars
00e0: 65 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 48  er to read the H
00f0: 54 4d 4c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  TML and convert 
0100: 74 68 65 20 70 65 72 74 69 6e 65 6e 74 20 64 61  the pertinent da
0110: 74 61 20 69 6e 74 6f 20 43 53 56 20 66 69 6c 65  ta into CSV file
0120: 73 2e 0d 0a 23 20 76 65 72 73 69 6f 6e 3a 20 30  s...# version: 0
0130: 2e 31 0d 0a 23 20 74 79 70 65 3a 20 73 63 72 69  .1..# type: scri
0140: 70 74 0d 0a 23 20 61 75 74 68 6f 72 3a 20 4a 6f  pt..# author: Jo
0150: 73 68 20 57 6f 72 74 7a 0d 0a 23 20 6c 69 63 65  sh Wortz..# lice
0160: 6e 73 65 3a 20 43 43 30 0d 0a 23 20 78 2d 70 6f  nse: CC0..# x-po
0170: 73 68 63 6f 64 65 2d 69 64 3a 20 35 37 36 38 0d  shcode-id: 5768.
0180: 0a 23 20 78 2d 61 72 63 68 69 76 65 64 3a 20 32  .# x-archived: 2
0190: 30 31 35 2d 30 33 2d 32 33 54 31 33 3a 30 38 3a  015-03-23T13:08:
01a0: 34 38 0d 0a 23 0d 0a 23 0d 0a 3c 23 0d 0a 2e 53  48..#..#..<#...S
01b0: 59 4e 4f 50 53 49 53 0d 0a 43 6f 6e 76 65 72 74  YNOPSIS..Convert
01c0: 73 20 4d 69 63 72 6f 73 6f 66 74 20 4f 66 66 69  s Microsoft Offi
01d0: 63 65 20 33 36 35 20 42 65 73 74 20 50 72 61 63  ce 365 Best Prac
01e0: 74 69 63 65 73 20 41 6e 61 6c 79 7a 65 72 20 48  tices Analyzer H
01f0: 54 4d 4c 20 72 65 70 6f 72 74 73 20 74 6f 20 43  TML reports to C
0200: 53 56 2e 0d 0a 0d 0a 2e 44 45 53 43 52 49 50 54  SV......DESCRIPT
0210: 49 4f 4e 20 0d 0a 43 6f 6e 76 65 72 74 73 20 4d  ION ..Converts M
0220: 69 63 72 6f 73 6f 66 74 20 4f 66 66 69 63 65 20  icrosoft Office 
0230: 33 36 35 20 42 65 73 74 20 50 72 61 63 74 69 63  365 Best Practic
0240: 65 73 20 41 6e 61 6c 79 7a 65 72 20 48 54 4d 4c  es Analyzer HTML
0250: 20 72 65 70 6f 72 74 73 20 74 6f 20 43 53 56 2e   reports to CSV.
0260: 0d 0a 0d 0a 2e 50 41 52 41 4d 45 54 45 52 20 46  .....PARAMETER F
0270: 69 6c 65 4c 6f 63 61 74 69 6f 6e 0d 0a 50 72 6f  ileLocation..Pro
0280: 76 69 64 65 20 74 68 65 20 70 61 74 68 20 74 6f  vide the path to
0290: 20 6f 6e 65 20 6f 72 20 6d 61 6e 79 20 48 54 4d   one or many HTM
02a0: 4c 20 66 69 6c 65 73 2e 0d 0a 0d 0a 2e 45 58 41  L files......EXA
02b0: 4d 50 4c 45 20 0d 0a 20 43 6f 6e 76 65 72 74 45  MPLE .. ConvertE
02c0: 78 42 50 41 54 6f 2d 43 53 56 20 2d 46 69 6c 65  xBPATo-CSV -File
02d0: 4c 6f 63 61 74 69 6f 6e 20 28 47 65 74 2d 43 68  Location (Get-Ch
02e0: 69 6c 64 49 74 65 6d 20 2a 2e 68 74 6d 6c 29 0d  ildItem *.html).
02f0: 0a 0d 0a 0d 0a 2e 4e 4f 54 45 53 0d 0a 41 75 74  ......NOTES..Aut
0300: 68 6f 72 3a 20 4a 6f 73 68 20 57 6f 72 74 7a 0d  hor: Josh Wortz.
0310: 0a 44 61 74 65 20 43 72 65 61 74 65 64 3a 20 33  .Date Created: 3
0320: 2f 33 2f 32 30 31 35 0d 0a 0d 0a 23 3e 0d 0a 70  /3/2015....#>..p
0330: 61 72 61 6d 28 0d 0a 20 20 20 20 5b 56 61 6c 69  aram(..    [Vali
0340: 64 61 74 65 53 63 72 69 70 74 28 7b 25 7b 54 65  dateScript({%{Te
0350: 73 74 2d 50 61 74 68 20 24 5f 20 2d 50 61 74 68  st-Path $_ -Path
0360: 54 79 70 65 20 27 4c 65 61 66 27 7d 7d 29 5d 5b  Type 'Leaf'}})][
0370: 73 74 72 69 6e 67 5b 5d 5d 24 46 69 6c 65 4c 6f  string[]]$FileLo
0380: 63 61 74 69 6f 6e 0d 0a 0d 0a 29 0d 0a 0d 0a 66  cation....)....f
0390: 75 6e 63 74 69 6f 6e 20 50 61 72 73 65 42 50 41  unction ParseBPA
03a0: 28 5b 56 61 6c 69 64 61 74 65 53 63 72 69 70 74  ([ValidateScript
03b0: 28 7b 25 7b 54 65 73 74 2d 50 61 74 68 20 24 5f  ({%{Test-Path $_
03c0: 20 2d 50 61 74 68 54 79 70 65 20 27 4c 65 61 66   -PathType 'Leaf
03d0: 27 7d 7d 29 5d 5b 73 74 72 69 6e 67 5b 5d 5d 24  '}})][string[]]$
03e0: 46 69 6c 65 73 29 0d 0a 7b 0d 0a 20 20 20 20 0d  Files)..{..    .
03f0: 0a 20 20 20 20 24 64 65 74 61 69 6c 73 52 65 67  .    $detailsReg
0400: 78 20 3d 20 22 3c 64 69 76 5b 5e 3e 5d 2a 3e 28  x = "<div[^>]*>(
0410: 2e 2a 3f 29 3c 62 72 20 5c 2f 3e 3c 62 72 20 5c  .*?)<br \/><br \
0420: 2f 3e 22 0d 0a 20 20 20 20 24 6e 6f 74 65 73 52  />"..    $notesR
0430: 65 67 78 20 3d 20 22 3c 69 6d 67 20 73 72 63 5b  egx = "<img src[
0440: 5e 3e 5d 2a 5c 2f 3e 28 2e 2a 3f 29 3c 62 72 20  ^>]*\/>(.*?)<br 
0450: 5c 2f 3e 22 0d 0a 0d 0a 20 20 20 20 5b 61 72 72  \/>"....    [arr
0460: 61 79 5d 24 48 54 4d 4c 41 72 72 61 79 20 3d 20  ay]$HTMLArray = 
0470: 28 5b 73 74 72 69 6e 67 5d 28 47 65 74 2d 43 6f  ([string](Get-Co
0480: 6e 74 65 6e 74 20 24 46 69 6c 65 73 29 29 2e 72  ntent $Files)).r
0490: 65 70 6c 61 63 65 28 22 3c 64 69 76 22 2c 20 22  eplace("<div", "
04a0: 60 6e 3c 64 69 76 22 29 20 2d 73 70 6c 69 74 20  `n<div") -split 
04b0: 22 60 6e 22 20 0d 0a 0d 0a 20 20 20 20 23 5b 61  "`n" ....    #[a
04c0: 72 72 61 79 5d 24 68 74 6d 6c 61 72 72 61 79 20  rray]$htmlarray 
04d0: 3d 20 24 6e 65 77 48 54 4d 4c 20 2d 73 70 6c 69  = $newHTML -spli
04e0: 74 20 22 60 6e 22 0d 0a 20 20 20 20 5b 61 72 72  t "`n"..    [arr
04f0: 61 79 5d 24 72 65 70 6f 72 74 20 3d 20 24 6e 75  ay]$report = $nu
0500: 6c 6c 0d 0a 0d 0a 0d 0a 20 20 20 20 66 6f 72 65  ll......    fore
0510: 61 63 68 20 28 24 6c 69 6e 65 20 69 6e 20 24 68  ach ($line in $h
0520: 74 6d 6c 61 72 72 61 79 29 0d 0a 20 20 20 20 7b  tmlarray)..    {
0530: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 24 6c  ..        if ($l
0540: 69 6e 65 20 2d 6d 61 74 63 68 20 22 3c 64 69 76  ine -match "<div
0550: 20 6f 6e 63 6c 69 63 6b 22 29 0d 0a 20 20 20 20   onclick")..    
0560: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0570: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
0580: 69 6e 67 5d 24 6e 6f 74 65 20 3d 28 5b 72 65 67  ing]$note =([reg
0590: 65 78 5d 3a 3a 6d 61 74 63 68 28 24 6c 69 6e 65  ex]::match($line
05a0: 2c 20 24 6e 6f 74 65 73 72 65 67 78 29 2e 47 72  , $notesregx).Gr
05b0: 6f 75 70 73 5b 31 5d 2e 56 61 6c 75 65 29 0d 0a  oups[1].Value)..
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05d0: 24 4f 62 6a 65 63 74 20 3d 20 4e 65 77 2d 4f 62  $Object = New-Ob
05e0: 6a 65 63 74 20 50 53 4f 62 6a 65 63 74 0d 0a 20  ject PSObject.. 
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0d                 .
0600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0610: 20 24 4f 62 6a 65 63 74 20 7c 20 61 64 64 2d 6d   $Object | add-m
0620: 65 6d 62 65 72 20 4e 6f 74 65 70 72 6f 70 65 72  ember Noteproper
0630: 74 79 20 54 69 74 6c 65 20 24 6e 6f 74 65 0d 0a  ty Title $note..
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0650: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0660: 20 20 69 66 20 28 24 6c 69 6e 65 20 2d 6d 61 74    if ($line -mat
0670: 63 68 20 22 69 6d 67 5f 57 61 72 6e 69 6e 67 22  ch "img_Warning"
0680: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
0690: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06b0: 20 20 24 74 79 70 65 3d 20 22 57 61 72 6e 69 6e    $type= "Warnin
06c0: 67 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g"..            
06d0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
06f0: 6c 73 65 69 66 20 28 24 6c 69 6e 65 20 2d 6d 61  lseif ($line -ma
0700: 74 63 68 20 22 69 6d 67 5f 45 72 72 6f 72 22 29  tch "img_Error")
0710: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0720: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 24 74 79 70 65 20 3d 20 22 45 72 72 6f 72 22   $type = "Error"
0750: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0760: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
0780: 65 69 66 20 28 24 6c 69 6e 65 20 2d 6d 61 74 63  eif ($line -matc
0790: 68 20 22 69 6d 67 5f 49 6e 66 6f 22 29 0d 0a 20  h "img_Info").. 
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74                $t
07d0: 79 70 65 20 3d 20 22 49 6e 66 6f 72 6d 61 74 69  ype = "Informati
07e0: 6f 6e 61 6c 22 0d 0a 20 20 20 20 20 20 20 20 20  onal"..         
07f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
0820: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 20 20 20 20 20 24 74 79 70 65 20 3d 20 22         $type = "
0850: 50 61 73 73 65 64 22 0d 0a 20 20 20 20 20 20 20  Passed"..       
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20      ..          
0890: 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
08a0: 20 20 20 20 20 20 20 20 24 4f 62 6a 65 63 74 20          $Object 
08b0: 7c 20 61 64 64 2d 6d 65 6d 62 65 72 20 4e 6f 74  | add-member Not
08c0: 65 70 72 6f 70 65 72 74 79 20 45 72 72 6f 72 54  eproperty ErrorT
08d0: 79 70 65 20 24 74 79 70 65 0d 0a 20 20 20 20 20  ype $type..     
08e0: 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20         ..       
08f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
0900: 65 6c 73 65 69 66 28 24 6c 69 6e 65 20 2d 6d 61  elseif($line -ma
0910: 74 63 68 20 22 68 69 64 64 65 6e 5f 53 65 63 74  tch "hidden_Sect
0920: 69 6f 6e 22 20 2d 61 6e 64 20 21 28 24 6c 69 6e  ion" -and !($lin
0930: 65 20 2d 6d 61 74 63 68 20 22 3c 3f 78 6d 6c 20  e -match "<?xml 
0940: 76 65 72 73 69 6f 6e 3d 22 29 29 0d 0a 20 20 20  version="))..   
0950: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0960: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
0970: 69 6e 67 5d 24 6e 6f 74 65 20 3d 20 28 5b 72 65  ing]$note = ([re
0980: 67 65 78 5d 3a 3a 6d 61 74 63 68 28 24 6c 69 6e  gex]::match($lin
0990: 65 2c 20 24 64 65 74 61 69 6c 73 52 65 67 78 29  e, $detailsRegx)
09a0: 2e 47 72 6f 75 70 73 5b 31 5d 2e 56 61 6c 75 65  .Groups[1].Value
09b0: 29 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )  ..           
09c0: 20 20 20 20 20 24 4f 62 6a 65 63 74 20 7c 20 61       $Object | a
09d0: 64 64 2d 6d 65 6d 62 65 72 20 4e 6f 74 65 70 72  dd-member Notepr
09e0: 6f 70 65 72 74 79 20 44 65 74 61 69 6c 73 20 24  operty Details $
09f0: 6e 6f 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  note..          
0a00: 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
0a10: 20 20 20 20 20 20 20 20 24 72 65 70 6f 72 74 20          $report 
0a20: 2b 3d 20 24 6f 62 6a 65 63 74 0d 0a 20 20 20 20  += $object..    
0a30: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 0d 0a 20          }...... 
0a40: 20 20 20 7d 0d 0a 20 20 20 20 24 72 65 70 6f 72     }..    $repor
0a50: 74 0d 0a 0d 0a 7d 0d 0a 0d 0a 0d 0a 47 65 74 2d  t....}......Get-
0a60: 43 68 69 6c 64 49 74 65 6d 20 24 46 69 6c 65 4c  ChildItem $FileL
0a70: 6f 63 61 74 69 6f 6e 20 7c 20 25 7b 50 61 72 73  ocation | %{Pars
0a80: 65 42 50 41 20 2d 46 69 6c 65 73 20 24 5f 20 7c  eBPA -Files $_ |
0a90: 20 65 78 70 6f 72 74 2d 63 73 76 20 2d 4e 6f 54   export-csv -NoT
0aa0: 79 70 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 22  ypeInformation "
0ab0: 24 5f 2e 63 73 76 22 7d 0d 0a                    $_.csv"}..