PuttyLogCleaner.ps1

<#
 
.NOTES
 
Information on running PowerShell scripts can be found here:
    -http://ss64.com/ps/syntax-run.html
    -https://technet.microsoft.com/en-us/library/bb613481.aspx
 
File Name: PuttyLogCleaner.ps1
 
.SYNOPSIS
 
Version:
 
1.1 - Added GUI for selecting files to open and save
 
1.0 - Original release
 
.DESCRIPTION
This script will read in a log file generated from the Putty application and remove any backspace characters (along with the
characters the backspace was intended to remove) for an easier to read log.
 
.PARAMETER OriginalFile
The name of a Putty generated log file located in the same directory as this script.
 
 
.EXAMPLE
 
.\PuttyLogCleaner.ps1
 
Running without any parameters will prompt for all necessary values
 
.EXAMPLE
 
.\PuttyLogCleaner.ps1 -OriginalFile MyLogFile.txt
 
Parses through the Putty log file named MyLogFile.txt
 
#>



<#PSScriptInfo
 
.VERSION 1.1
 
.GUID 5290f432-65f9-4fb2-b291-65d848fea68e
 
.AUTHOR Tim McGue
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
#>


<#
 
.DESCRIPTION
 This script will read in a log file generated from the Putty application and remove any backspace characters (along with the characters the backspace was intended to remove) for an easier to read log.
 
#>
 


[CmdletBinding(PositionalBinding=$False)]
Param(

  [Parameter(Mandatory=$False)]
   [string]$OriginalFile

)

Function RemoveBackspace ($InputString) {

    #Find the location of the backspace in the passed string
    $BackspaceLocation = $InputString.IndexOf("`b")

    #Get the left characters of the line without including the backspace nor the character immediately to the left of the backspace
    #which removes the character the backspace originally intended to delete
    $BackspaceRemovedStart = $InputString.substring(0,$BackspaceLocation-1)
    
    #Get all the characters to the right of the first backspace
    $BackspaceRemovedEnd = $InputString.substring($BackspaceLocation+1,$InputString.length-$BackspaceLocation-1)

    #Join the two strings together
    $BackspaceRemoved = $BackspaceRemovedStart + $BackspaceRemovedEnd

    #Keep parsing until no backspaces remain
    if ($BackspaceRemoved.Contains("`b")) {

        RemoveBackspace $BackspaceRemoved

    } else {

        #Return back the cleaned string
        Return $BackspaceRemoved

    }

}

Function Get-OpenFile($initialDirectory)
{ 

    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
    Out-Null

    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
        
    $OpenFileDialog.initialDirectory = $initialDirectory
    
    $OpenFileDialog.filter = "All files (*.*)| *.*"
    
    $OpenFileDialog.ShowDialog() | Out-Null
    
    $OpenFileDialog.filename

}

Function Get-SaveFile($initialDirectory) { 
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

    $SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
    
    $SaveFileDialog.initialDirectory = $initialDirectory
    
    $SaveFileDialog.filter = "All files (*.*)| *.*"
    
    $SaveFileDialog.ShowDialog() | Out-Null
    
    $SaveFileDialog.filename

} #Get-SaveFile


If ($OriginalFile.Length -eq 0) {

    Write-Host "Select a saved Putty output file"

    $OriginalFile = Get-OpenFile
    
}

# Read in the file
$RawOriginalText = Get-Content $OriginalFile

#Setup the array
$CleanedText = @()

#Go through each line read from the text file
ForEach ($Line in $RawOriginalText) {

    #Check for backspace characters
    if ($Line.Contains("`b")) {

        #Call the function
        $Line = RemoveBackspace $Line        
     
    }

    #BEL character
    if ($Line.Contains("`a")) {

        #Remove the BEL
        $Line = $Line.replace("`a","")

    }

    #Some newer BIOS output will use a wide variety of escape characters.
    #There is no reason to clean those ESC items.

    #Add the cleaned line into the array
    $CleanedText += $Line
    
}

Write-Host "Select a file to save cleaned output"

$CleanedOutputFile = Get-SaveFile

#Output the array to the new file name
Out-File -FilePath $CleanedOutputFile -InputObject $CleanedText