This is intended to be used as the supplemental script (3_CheckXML.ps1) to be used in conjunction with the 1_Clean-NoIntroRoms.ps1 and 2_CompareFolderResults.ps1 scripts. This script allows you check missing scraped data in RetroPie by examining the gamelist.xml file for each game system on you RetroPie. This can save you HOURS of time manually checking for missing ROM scraped data.
#CheckXML.ps1
#5.3
# -Added Changelog in Comments
#5.2:
# -Added variables for Write-Out Colors and Updated to Write-Out v1.3
# -Missing attributes set to $true were not being detected, only worked if they had a blank value
#5.1:
# -No Changes
#5.0
# -New Release
$global:scriptName = $PSCommandPath
$global:scriptVersion = "v5.3"
$global:GameListRoot = "\\retropie\configs\all\emulationstation\gamelists\"
$global:MultiCartExceptions = "\(([^/)]*)(DISK|Disk|disk|Reel|4B-001, 4B-009, 8B-001, Sachen|4B-007, 4B-008, 8B-004, Sachen|4B-005, 4B-006, 8B-003, Sachen|4B-002, 4B-004, 8B-002, Sachen)([^/)]*)\)"
$global:IgnoreMulticartDuplicates = $true
$global:ValidateVerbose = $false #Validate all Data & Override ValidateChild
$global:logFile = (Split-Path -Path $PSCommandPath -Parent) + "\logs\" + (Split-Path -Path $PSCommandPath.Replace(".ps1",".log") -Leaf)
$global:logOverwrite = $true
$global:ValidateChild = [ordered]@{
"path" = $false
"name" = $true
"cover" = $false
"image" = $true
"marquee" = $false
"video" = $false
"rating" = $false
"desc" = $true
"releasedate" = $false
"developer" = $false
"publisher" = $false
"genre" = $false
"players" = $false
"kidgame" = $false
}
$global:romNoIntroHashTable = [ordered]@{
#RetroPieDirName = No-IntroDirName
"atari2600" = "Atari - 2600"
"atari5200" = "Atari - 5200"
"atari7800" = "Atari - 7800 [Headered]"
"atarijaguar" = "Atari - Jaguar"
"atarilynx" = "Atari - Lynx [Headered]"
"atarist" = "Atari - ST"
"coleco" = "Coleco - ColecoVision"
"fds" = "Nintendo - Family Computer Disk System [headered]"
"gamegear" = "Sega - Game Gear"
"gb" = "Nintendo - Game Boy"
"gba" = "Nintendo - Game Boy Advance"
"gbc" = "Nintendo - Game Boy Color"
"mastersystem" = "Sega - Master System - Mark III"
"megadrive" = "Sega - Mega Drive - Genesis"
"msx" = "Microsoft - MSX"
"n64" = "Nintendo - Nintendo 64"
"nes" = "Nintendo - Nintendo Entertainment System [headered]"
"ngp" = "SNK - Neo Geo Pocket"
"ngpc" = "SNK - Neo Geo Pocket Color"
"pcengine" = "NEC - PC Engine - TurboGrafx 16"
"sega32x" = "Sega - 32X"
"sg-1000" = "Sega - SG-1000"
"snes" = "Nintendo - Super Nintendo Entertainment System"
"vectrex" = "GCE - Vectrex"
"virtualboy" = "Nintendo - Virtual Boy"
"wonderswan" = "Bandai - WonderSwan"
"wonderswancolor" = "Bandai - WonderSwan Color"
}
#Output Color Variables
$global:colorMain = "Green"
$global:colorSub1 = "DarkGreen"
$global:colorSub2 = "Cyan"
$global:colorSub3 = "DarkRed"
$global:colorOk = "DarkCyan"
$global:colorWarn = "Yellow"
$global:colorError = "Red"
Function Main()
{
#Output Color Variables
$global:colorMain = "Green"
$global:colorSub1 = "DarkGreen"
$global:colorSub2 = "Cyan"
$global:colorOk = "DarkCyan"
$global:colorWarn = "Yellow"
$global:colorError = "Red"
#Powershell 4 or greater is required
If (!($PSVersionTable.PSVersion.Major -ge 4) -OR ($PSVersionTable.PSVersion -eq $null))
{
Write-Host -ForegroundColor $global:colorError "Powershell v4 or greater is required, quitting script!"
Exit
}
#Create Log File
If ($global:logOverwrite -eq $true)
{
Write-Out -NoNewLine -LogFile $global:logFile -Overwrite
}
Else
{
Write-Out -NoNewLine -LogFile $global:logFile
}
#Array to Track Results For Each Game System
$gameArray = @()
#Check XML Gamelists for Missing Scraped Metadata
$tStart = (Get-Date)
Write-Out -ForegroundColor $global:colorMain -Text "****************************************************************" -LogFile $global:logFile
Write-Out -Text "INITIALIZE" -ForegroundColor $global:colorMain -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "****************************************************************" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Script Name : $($global:scriptName)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Version: : $($global:scriptVersion)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Game List Root : $($global:GameListRoot)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Multicart Exceptions : $($global:MultiCartExceptions)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Ignore Multicart Exceptions : $($global:IgnoreMulticartDuplicates)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Validate Verbose : $($global:ValidateVerbose)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Log File : $($global:logFile)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Log Overwrite : $($global:logOverwrite)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Start Time : $($tStart)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "****************************************************************" -PostLine 1 -LogFile $global:logFile
ForEach ($GameSystem in $global:romNoIntroHashTable.keys)
{
#Create Object to Store Info For Each Game System
$gameObject = New-Object -TypeName psobject
$gameObject | Add-Member -MemberType NoteProperty -Name GameSystem -Value $GameSystem
$gameObject | Add-Member -MemberType NoteProperty -Name GameList -Value "$($global:GameListRoot)$($GameSystem)\gamelist.xml"
$gameObject | Add-Member -MemberType NoteProperty -Name GameListExist -Value $false
$gameObject | Add-Member -MemberType NoteProperty -Name Games -Value @{}
$gameObject | Add-Member -MemberType NoteProperty -Name RomsUnscraped -Value 0
$gameObject | Add-Member -MemberType NoteProperty -Name MissingMetadata -Value 0
$gameObject | Add-Member -MemberType NoteProperty -Name DuplicateRoms -Value 0
Write-Out -ForegroundColor $global:colorMain -Text "****************************************************************" -LogFile $global:logFile
Write-Out -Text "PROCESSING: $($gameObject.GameList)" -ForegroundColor $global:colorMain -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "****************************************************************" -LogFile $global:logFile
Write-Out -Text "STEP 1/3 - Confirm XML Exists" -ForegroundColor $global:colorSub1 -LogFile $global:logFile
Write-Out -Text "=====================================" -ForegroundColor $global:colorSub1 -LogFile $global:logFile
If (Test-Path -LiteralPath $gameObject.GameList -PathType Leaf)
{
$gameObject.GameListExist = $true
Write-Out -Text "Exists - Continue" -ForegroundColor $global:colorSub1 -LogFile $global:logFile
#Read GameList
[XML]$gameXML = Get-Content $gameObject.GameList
Write-Out -Text "STEP 2/3 - Validate Game Details" -ForegroundColor $global:colorSub1 -PreLine 1 -LogFile $global:logFile
Write-Out -Text "=====================================" -ForegroundColor $global:colorSub1 -LogFile $global:logFile
#Loop Each Game in the XML File
ForEach($gameMetadata in $gameXML.gameList.game)
{
$RomScraped = $true
#Output Validation
If ($global:ValidateVerbose -eq $true)
{
#Validate All Attributes
Write-Out -Text "$($gameMetadata.path)" -ForegroundColor $global:colorSub2 -LogFile $global:logFile
Write-Out -Text "-------------------------------------" -ForegroundColor $global:colorSub2 -LogFile $global:logFile
ForEach ($Child in $global:ValidateChild.keys)
{
If ($gameMetadata.$Child -eq "" -OR $gameMetadata.$Child -eq $null)
{
$gameObject.MissingMetadata++
$RomScraped = $false
Write-Out -Text "$($Child): ","MISSING" -ForegroundColor $global:colorSub2,$global:colorError -LogFile $global:logFile
}
Else
{
Write-Out -Text "$($Child): ","$($gameMetadata.$Child)" -ForegroundColor $global:colorSub2,$global:colorOk -LogFile $global:logFile
}
}
Write-Out -LogFile $global:logFile
}
Else
{
#Validate Only True Attributes
$MetadataErrors = @()
ForEach ($Child in $global:ValidateChild.keys)
{
If ($global:ValidateChild[$Child] -eq $true)
{
If ($gameMetadata.$Child -eq "" -OR $gameMetadata.$Child -eq $null)
{
$gameObject.MissingMetadata++
$RomScraped = $false
$MetadataErrors += $Child
}
}
}
If ($MetadataErrors.Count -gt 0)
{
Write-Out -Text "$($gameMetadata.path)" -ForegroundColor $global:colorSub2 -LogFile $global:logFile
Write-Out -Text "-------------------------------------" -ForegroundColor $global:colorSub2 -LogFile $global:logFile
ForEach ($Error in $MetadataErrors)
{
Write-Out -Text "$($Error): ","MISSING" -ForegroundColor $global:colorSub2,$global:colorError -LogFile $global:logFile
}
Write-Out -LogFile $global:logFile
}
}
If ($RomScraped -eq $false)
{
$gameObject.RomsUnscraped++
}
#Add Games ROM File & Name to HashTable To Check For Duplicates
$gameObject.Games.add($gameMetadata.path,$gameMetadata.name)
}
If ($gameObject.MissingMetadata -eq 0)
{
Write-Out -Text "Validation - Successful with $($gameObject.MissingMetadata) Errors" -ForegroundColor $global:colorSub1 -LogFile $global:logFile
}
Else
{
Write-Out -Text "Validation - ","Failed with Unscraped ROMs: $($gameObject.RomsUnscraped) and Missing Metadata: $($gameObject.MissingMetadata)" -ForegroundColor $global:colorSub1,$global:colorError -LogFile $global:logFile
}
#Check For Duplicates in XML Gamelists
Write-Out -Text "STEP 3/3 - Check For Duplicates" -ForegroundColor $global:colorSub1 -PreLine 1 -LogFile $global:logFile
Write-Out -Text "=====================================" -ForegroundColor $global:colorSub1 -LogFile $global:logFile
#Get List of Unique ROM Base Names
$colUniqueRoms = $gameObject.Games.Keys | ForEach {$gameObject.Games[$_].Split("(")[0]}
$colUniqueRoms = $colUniqueRoms | Sort-Object -Unique
Write-Out -Text "Unique Names: $($colUniqueRoms.Count) " -ForegroundColor $global:colorSub1 -LogFile $global:logFile
Write-Out -Text "Total ROMs: $($gameObject.Games.Count) " -ForegroundColor $global:colorSub1 -LogFile $global:logFile
If ($gameObject.Games.Count -gt $colUniqueRoms.Count)
{
Write-Out -Text "Potential Duplicates: $($gameObject.Games.Count - $colUniqueRoms.Count)" -ForegroundColor $global:colorWarn -LogFile $global:logFile
}
Else
{
Write-Out -Text "Potential Duplicates: $($gameObject.Games.Count - $colUniqueRoms.Count)" -ForegroundColor $global:colorSub1 -LogFile $global:logFile
}
#Find Duplicates
ForEach ($uniqueRom in $colUniqueRoms)
{
#Get HashTable Key for Each Duplicate
If ($global:IgnoreMulticartDuplicates)
{
$Duplicates = $gameObject.Games.Keys | ? { $gameObject.Games[$_] -match ("^"+[regex]::escape($uniqueRom)+"\(") -AND $gameObject.Games[$_] -cnotmatch $global:MultiCartExceptions }
}
Else
{
#Ensure Match to First '(' Incase of Common Name (ex: 'Megaman' vs 'Megaman 2')
$Duplicates = $gameObject.Games.Keys | ? { $gameObject.Games[$_] -match ("^"+[regex]::escape($uniqueRom)+"\(") }
}
If ($Duplicates.Count -gt 1)
{
$gameObject.DuplicateRoms+= ($Duplicates.Count - 1)
Write-Out -Text "Duplicate($($Duplicates.Count - 1)): $($uniqueRom)" -ForegroundColor $global:colorSub2 -PreLine 1 -LogFile $global:logFile
Write-Out -Text "----------------------------------------" -ForegroundColor $global:colorSub2 -LogFile $global:logFile
ForEach ($Dup in $Duplicates)
{
Write-Out -Text "ROM: ","$($Dup )" -ForegroundColor $global:colorSub2,$global:colorError -LogFile $global:logFile
}
}
}
If ($gameObject.DuplicateRoms -eq 0)
{
Write-Out -Text "Duplicates: None Found" -ForegroundColor $global:colorSub1 -PreLine 1 -PostLine 1 -LogFile $global:logFile
}
Else
{
Write-Out -Text "Duplicates: ","$($gameObject.DuplicateRoms) Found" -ForegroundColor $global:colorSub1,$global:colorError -PreLine 1 -PostLine 1 -LogFile $global:logFile
}
}
Else
{
Write-Out -Text "Not Exist - Skip" -ForegroundColor $global:colorError -PostLine 1 -LogFile $global:logFile
}
#Add Game System to Array to Track Results
$gameArray += $gameObject
}
#Display Final Results
Write-Out -Text "*****************************************************************" -ForegroundColor $global:colorMain -PreLine 1 -LogFile $global:logFile
Write-Out -Text "END RESULTS" -ForegroundColor $global:colorMain -LogFile $global:logFile
Write-Out -Text "*****************************************************************" -ForegroundColor $global:colorMain -LogFile $global:logFile
ForEach ($game in $gameArray)
{
Write-Out -Text "* $($game.GameSystem):" -ForegroundColor $global:colorMain -LogFile $global:logFile
If ($game.GameListExist -eq $false)
{
Write-Out -Text "Error ($($game.GameList)) Does Not Exist" -ForegroundColor $global:colorError -LogFile $global:logFile
}
Else
{
Write-Out -Text "* -Total Games: $($game.Games.Count)" -ForegroundColor $global:colorMain -LogFile $global:logFile
If ($game.RomsUnscraped -eq 0)
{
Write-Out -Text "* -ROMs Not Scraped: $($game.RomsUnscraped)" -ForegroundColor $global:colorMain -LogFile $global:logFile
}
Else
{
Write-Out -Text "* -ROMs Not Scraped: ","$($game.RomsUnscraped)" -ForegroundColor $global:colorMain,$global:colorError -LogFile $global:logFile
}
If ($game.MissingMetadata -eq 0)
{
Write-Out -Text "* -Missing Metadata: $($game.MissingMetadata)" -ForegroundColor $global:colorMain -LogFile $global:logFile
}
Else
{
Write-Out -Text "* -Missing Metadata: ","$($game.MissingMetadata)" -ForegroundColor $global:colorMain,$global:colorError -LogFile $global:logFile
}
If ($game.DuplicateRoms -eq 0)
{
Write-Out -Text "* -Duplicate ROMs: $($game.DuplicateRoms)" -ForegroundColor $global:colorMain -LogFile $global:logFile
}
Else
{
Write-Out -Text "* -Duplicate ROMs: ","$($game.DuplicateRoms)" -ForegroundColor $global:colorMain,$global:colorError -LogFile $global:logFile
}
}
Write-Out -ForegroundColor $global:colorMain -Text "* "-LogFile $global:logFile
}
$tEnd = (Get-Date)
Write-Out -ForegroundColor $global:colorMain -Text "* Start Time : $($tStart)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* End Time : $($tEnd)" -LogFile $global:logFile
Write-Out -ForegroundColor $global:colorMain -Text "* Elapsed Time : $([math]::Round(($tEnd-$tStart).totalseconds, 2)) seconds" -LogFile $global:logFile
Write-Out -Text "*****************************************************************" -ForegroundColor $global:colorMain -LogFile $global:logFile
}
Function Write-Out
{
<#
.SYNOPSIS
Write output to console and/or log file. Supports multiple foreground and background colors on a single line and
advanced options to insert lines, spaces, or tabs before or after the text as well as timestamps.
.DESCRIPTION
Uses Write-Host to output color text to the console, and supports using multiple foreground and background colors
on a single line. Uses Set-Content and Add-Content to output to a file.
It works by accepting strings as an array and then you can assign the foreground or background colors by passing
them as arrays for the matching text. It also accepts Default which allows you skip specifying a color and use the
default.
This function requires Powershell 4.0 to support the alias attribute in the function.
.PARAMETER Text
Optional. Array of strings to write to console/log. If you do not need to use multiple colors on a single line you can pass a single string instead of an array of strings. Otherwise, if you need to multiple colors on a single line pass an array of strings and associated colors using -ForegroundColor, -BackgroundColor, -ForegroundColorDefault, or -BackgroundColorDefault.
.PARAMETER ForegroundColor
Optional. Array of foreground Colors to write to console. Default means the ForegroundColorDefault value is used.
Valid Colors: Default, Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White
.PARAMETER ForegroundColorDefault
Optional. Default foreground color to write to console. Default is set to white.
Valid Colors: Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White
.PARAMETER BackgroundColor
Optional. Array of background colors to write to console. Default means the BackgroundColorDefault value is used.
Valid Colors: Default, Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White
.PARAMETER BackgroundColorDefault
Optional. Default background color to write to console. Default is none.
Valid Colors: Default, Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White
.PARAMETER PreLine
Optional. Add blank lines before your text. Default is 0.
.PARAMETER PreSpace
Optional. Add spaces before your text. Default is 0.
.PARAMETER PreTab
Optional. Add Tabs before your text. Default is 0.
.PARAMETER TimeStampFormat
Optional. Format used for time stamps. Default is 'yyyy-MM-dd HH:mm:ss'
.PARAMETER TimeStamp
Optional. Adds time stamp in square brackets before your text.
.PARAMETER ClearHost
Optional. Clear the console before your text.
.PARAMETER PostLine
Optional. Add blank lines after your text. Default is 0.
.PARAMETER PostSpace
Optional. Add spaces after your text. Default is 0.
.PARAMETER PostTab
Optional. Add tabs after your text. Default is 0.
.PARAMETER NoNewLine
Optional. Do not add a new line after your text and optional post text options. Default is to add a new line.
.PARAMETER LogFile
Optional. Absolute or relative path of the log file.
.PARAMETER Overwrite
Optional. Ovewrite the log file. Default is to append to the log file.
.INPUTS
Parameters above
.OUTPUTS
None
.NOTES
Author: Brian Steinmeyer
URL: http://sigkillit.com/
Created: 4/18/2020
Version 1.3
- Added LogOnly Option for only writing text to a log file
Version 1.2
- Set Text, ForegroundColor, and BackgroundColor to default value of @() to fix errors checking counts in some circumstances
- Fixed an issue where ForegroundColorDefault and BackgroundColorDefault were not working properly in some circumstances
- Added Requires -Version 4.0
Version 1.1
- Completely rewrote the "Main Text" section
- Added "Default" as a color option, which allows you to use the default values for foreground/background
- Useful when you want to specify a backgroundcolor in certain parts of a line like the middle
- Ex: Write-Out -Text "How to ","highlight ","the middle text" -BackgroundColor Default,Yellow,Default
Version: 1.0
- Initial Creation inspired by PSWriteColor (https://github.com/EvotecIT/PSWriteColor)
- Improved upon by switching Foreground and Background Colors to default values if colors are not specifid for all strings.
Will also ignore extra colors if more colors are specified than strings specified.
.EXAMPLE
Write-Out -Text "Start with Red Text ","Then Switch to Blue Text ","Now Magenta" -ForegroundColor Red,Blue,Magenta
.EXAMPLE
Write-Out -Text "White on Black ","Black on White ","Dark Cyan on Cyan ","Yellow on Green ","Default Color" -ForegroundColor White,Black,DarkCyan,Yellow -BackgroundColor Black,White,Cyan,Green
.EXAMPLE
Write-Out -Text "Make this"," entire line"," the same color by setting defaults" -ForegroundColorDefault Yellow -BackgroundColorDefault Magenta
.EXAMPLE
Write-Out -Text "Add a blank line and two tabs ","before ","my text" -ForegroundColor Green,Cyan,White -PreLine 1 -PreTab 2
.EXAMPLE
Write-Out -Text "Add two blank ","lines ","after my text" -ForegroundColor White,Green,White -PostLine 2
.EXAMPLE
Write-Out -Text "Add 3 spaces before my text" -ForegroundColor Gray -Prespace 3
.EXAMPLE
Write-Out -Text "White text and a tab after" -ForegroundColor White -NoNewLine -PostTab 1
Write-Out -Text "Black text on Yellow ","and then back to white" -ForegroundColor Black,White -BackgroundColor Yellow
.EXAMPLE
Write-Out -Text "An easy way to ","highlight ","text in the middle" -BackgroundColor Default,Yellow
.EXAMPLE
Write-Out -Text "You can even add a ","time stamp ","before your output" -ForegroundColor White,Green,White -TimeStamp -PreLine 3
.EXAMPLE
Write-Out -Text "You can change the ","time stamp format" -ForegroundColor White,Yellow -TimeStamp -TimeStampFormat "dd-MM-yyy HH:mm" -PreLine 1 -PostLine 1
.EXAMPLE
Write-Out -Text "An"," Error"," occurred let's write overwrite/create a new log file" -ForegroundColor White,Red,White -TimeStamp -LogFile "script.log" -Overwrite
.EXAMPLE
Write-Out -Text "Now you can ","Append ","this line to your log file" -ForegroundColor Cyan,Magenta -TimeStamp -LogFile "script.log"
#>
[CmdletBinding()]
Param (
[Parameter(Mandatory=$false)]
[AllowEmptyString()]
[alias ('T')]
[String[]]
$Text = @(),
[Parameter(Mandatory=$false)]
[ValidateSet("Default","Black","DarkBlue","DarkGreen","DarkCyan","DarkRed","DarkMagenta","DarkYellow","Gray","DarkGray","Blue","Green","Cyan","Red","Magenta","Yellow","White")]
[alias ('FGC', 'FC')]
[string[]]
$ForegroundColor = @(),
[Parameter(Mandatory=$false)]
[ValidateSet("Default","Black","DarkBlue","DarkGreen","DarkCyan","DarkRed","DarkMagenta","DarkYellow","Gray","DarkGray","Blue","Green","Cyan","Red","Magenta","Yellow","White")]
[alias ('FGCD', 'FCD')]
[string]
$ForegroundColorDefault = [ConsoleColor]::White,
[Parameter(Mandatory=$false)]
[ValidateSet("Default","Black","DarkBlue","DarkGreen","DarkCyan","DarkRed","DarkMagenta","DarkYellow","Gray","DarkGray","Blue","Green","Cyan","Red","Magenta","Yellow","White")]
[alias ('BGC', 'BC')]
[String[]]
$BackgroundColor = @(),
[Parameter(Mandatory=$false)]
[ValidateSet("Default","Black","DarkBlue","DarkGreen","DarkCyan","DarkRed","DarkMagenta","DarkYellow","Gray","DarkGray","Blue","Green","Cyan","Red","Magenta","Yellow","White")]
[alias ('BGCD', 'BCD')]
[string]
$BackgroundColorDefault = "Default",
[Parameter(Mandatory=$false)]
[int]
$PreLine = 0,
[Parameter(Mandatory=$false)]
[int]
$PreSpace = 0,
[Parameter(Mandatory=$false)]
[int]
$PreTab = 0,
[Parameter(Mandatory=$false)]
[Alias('TSF', 'TS')]
[string]
$TimeStampFormat = 'yyyy-MM-dd HH:mm:ss',
[Parameter(Mandatory=$false)]
[switch]
$TimeStamp,
[Parameter(Mandatory=$false)]
[switch]
$ClearHost,
[Parameter(Mandatory=$false)]
[int]
$PostLine = 0,
[Parameter(Mandatory=$false)]
[int]
$PostSpace = 0,
[Parameter(Mandatory=$false)]
[int]
$PostTab = 0,
[Parameter(Mandatory=$false)]
[switch]
$NoNewLine = $false,
[Parameter(Mandatory=$false)]
[alias ('Log', 'L')]
[string]
$LogFile = '',
[Parameter(Mandatory=$false)]
[switch]
$LogOnly = $false,
[Parameter(Mandatory=$false)]
[switch]
$Overwrite = $false
)
Begin
{
#Nothing to Do Here
}
Process
{
#Optional - Do Not Write to ConsoleColor
If (!($LogOnly))
{
#Optional - Prefix Text
If ($ClearHost) { Clear-Host }
If ($PreLine -gt 0) { For ($i = 0; $i -lt $PreLine; $i++) { Write-Host -Object "`n" -NoNewline } } # Add empty line(s) before Main text
If ($PreSpace -gt 0) { For ($i = 0; $i -lt $PreSpace; $i++) { Write-Host -Object " " -NoNewLine } } # Add Tab(s) before Main text
If ($PreTab -gt 0) { For ($i = 0; $i -lt $PreTab; $i++) { Write-Host -Object "`t" -NoNewLine } } # Add Space(s) before Main text
If ($TimeStamp) { Write-Host -Object "[$([datetime]::Now.ToString($TimeStampFormat))]" -NoNewline } # Add Timestamp before Main Text
#MAIN TEXT
If (($Text.Count -gt 0) -AND ($ForegroundColor.Count -eq 0) -AND ($BackgroundColor.Count -eq 0))
{
#Text Only Specified
For ($i = 0; $i -lt $Text.Count; $i++)
{
If ($BackgroundColorDefault -eq "Default")
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColorDefault -NoNewLine
}
Else
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColorDefault -BackgroundColor $BackgroundColorDefault -NoNewLine
}
}
}
ElseIf (($Text.Count -gt 0) -AND ($ForegroundColor.Count -gt 0) -AND ($BackgroundColor.Count -eq 0))
{
#Text and ForegroundColor Specified
For ($i = 0; $i -lt $Text.Count; $i++)
{
If ($ForegroundColor.Count -le $i) { $ForegroundColor += $ForegroundColorDefault } #ForegroundColor Not Specified Set to Default
If ($ForegroundColor[$i] -eq "Default") { $ForegroundColor[$i] = $ForegroundColorDefault }
If ($BackgroundColorDefault -eq "Default")
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColor[$i] -NoNewLine
}
Else
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColor[$i] -BackgroundColor $BackgroundColorDefault -NoNewLine
}
}
}
ElseIf (($Text.Count -gt 0) -AND ($ForegroundColor.Count -eq 0) -AND ($BackgroundColor.Count -gt 0))
{
#Text and BackgroundColor Specified
For ($i = 0; $i -lt $Text.Count; $i++)
{
If ($BackgroundColor.Count -le $i) { $BackgroundColor += $BackgroundColorDefault } #BackgroundColor Not Specified Set to Default
If ($BackgroundColor[$i] -eq "Default")
{
If ($BackgroundColorDefault -eq "Default")
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColorDefault -NoNewLine
}
Else
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColorDefault -BackgroundColor $BackgroundColorDefault -NoNewLine
}
}
Else
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColorDefault -BackgroundColor $BackgroundColor[$i] -NoNewLine
}
}
}
ElseIf (($Text.Count -gt 0) -AND ($ForegroundColor.Count -gt 0) -AND ($BackgroundColor.Count -gt 0))
{
#Text, ForegroundColor, and BackgroundColor Specified (FAILS NOT WRITING DEFAULT)
For ($i = 0; $i -lt $Text.Count; $i++)
{
If ($ForegroundColor.Count -le $i) { $ForegroundColor += $ForegroundColorDefault } #ForegroundColor Not Specified Set to Default
If ($BackgroundColor.Count -le $i) { $BackgroundColor += $BackgroundColorDefault } #BackgroundColor Not Specified Set to Default
If ($ForegroundColor[$i] -eq "Default") { $ForegroundColor[$i] = $ForegroundColorDefault }
If ($BackgroundColor[$i] -eq "Default")
{
If ($BackgroundColorDefault -eq "Default")
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColor[$i] -NoNewLine
}
Else
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColor[$i] -BackgroundColor $BackgroundColorDefault -NoNewLine
}
}
Else
{
Write-Host $Text[$i] -ForegroundColor $ForegroundColor[$i] -BackgroundColor $BackgroundColor[$i] -NoNewLine
}
}
}
Else
{
#No Text, ForegroundColor, or BackgroundColor Specified ($Text.Count -eq 0) -AND ($ForegroundColor.Count -eq 0) -AND ($BackgroundColor.Count -eq 0)
}
#Post Text
If ($PostSpace -gt 0) { for ($i = 0; $i -lt $PostSpace; $i++) { Write-Host -Object " " -NoNewLine } } # Add Tab(s) after Main text
If ($PostTab -gt 0) { for ($i = 0; $i -lt $PostTab; $i++) { Write-Host -Object "`t" -NoNewLine } } # Add Space(s) after Main text
If ($PostLine -gt 0) { for ($i = 0; $i -lt $PostLine; $i++) { Write-Host -Object "`n" -NoNewline } } # Add empty line(s) after Main text
If ($NoNewLine) { Write-Host -NoNewline } else { Write-Host } # Add New Line after Main Text Unless NoNewLine is Supplied
}
#Log File
$TextToWrite = "" #Build Text to Write to Log File
If ($PreLine -gt 0) { For ($i = 0; $i -lt $PreLine; $i++) { $TextToWrite += "`n" } } # Add empty line(s) before Main text
If ($PreSpace -gt 0) { For ($i = 0; $i -lt $PreSpace; $i++) { $TextToWrite += " " } } # Add Tab(s) before Main text
If ($PreTab -gt 0) { For ($i = 0; $i -lt $PreTab; $i++) { $TextToWrite += "`t" } } # Add Space(s) before Main text
If ($TimeStamp) { $TextToWrite += "[$([datetime]::Now.ToString($TimeStampFormat))]" } # Add Timestamp before Main Text
If ($Text.Count -gt 0) { For ($i = 0; $i -lt $Text.Count; $i++) { $TextToWrite += $Text[$i] } } #Add Main Text
If ($PostSpace -gt 0) { for ($i = 0; $i -lt $PostSpace; $i++) { $TextToWrite += " " } } # Add Tab(s) after Main text
If ($PostTab -gt 0) { for ($i = 0; $i -lt $PostTab; $i++) { $TextToWrite += "`t" } } # Add Space(s) after Main text
If ($PostLine -gt 0) { for ($i = 0; $i -lt $PostLine; $i++) { $TextToWrite += "`n" } } # Add empty line(s) after Main text
If ($LogFile -eq "")
{
#No LogFile Specified - Skip
}
ElseIf(!(Test-Path -Path $LogFile))
{
#Create Log File If Does Not Exist
If ($NoNewLine)
{
$nf = New-Item -Path $LogFile -type file -force -Value $TextToWrite
}
Else
{
$nf = New-Item -Path $LogFile -type file -force -Value $TextToWrite`r`n
}
}
Else
{
#Log File Exists
If($Overwrite)
{
#Overwrite Log File
If ($NoNewLine)
{
Set-Content -Path $LogFile -Value $TextToWrite -NoNewline
}
Else
{
Set-Content -Path $LogFile -Value $TextToWrite
}
}
Else
{
#Append Log File
Try {
If ($NoNewLine)
{
Add-Content -Path $LogFile -Value $TextToWrite -ErrorAction Stop -NoNewline
}
Else
{
Add-Content -Path $LogFile -Value $TextToWrite -ErrorAction Stop
}
} Catch {
Start-Sleep -s 3
If ($NoNewLine)
{
Add-Content -Path $LogFile -Value $TextToWrite -NoNewline
}
Else
{
Add-Content -Path $LogFile -Value $TextToWrite
}
}
}
}
}
End
{
#Nothing to Do Here
}
}
Main