Public/Write-Message.ps1

<#PSScriptInfo
 
.NAME Write-Message
 
.VERSION 1.0.9
 
.DESCRIPTION
 Write-Message is a wrapper around Write-Host allowing to display multiple colors of
 text on one line, and will write the same message to an audit log file. Additional
 formatting includes line message indentation, adding a blank line before the message,
 and adding a blank line after the message.
 
.GUID 9e8dfd44-f782-445a-883c-70614f71519c
 
.AUTHOR DecimalZero
 
.COMPANYNAME NestLink
 
.COPYRIGHT Copyright (C) DecimalZero. All rights reserved.
 
.TAGS Write-Message Write-Host Color PowerShell Console Audit Logs Logging Windows Linux MacOS
 
.LICENSEURI
https://github.com/DecimalZero/Dz-Write-Message/blob/main/LICENSE
 
.PROJECTURI
https://github.com/DecimalZero/Dz-Write-Message
 
.ICONURI
https://github.com/DecimalZero/Dz-Write-Message/blob/main/Write-Message.png
 
.RELEASENOTES
https://github.com/DecimalZero/Dz-Write-Message/blob/main/README.md
 
.REQUIRESMODULE N/A
 
.EXTERNALMODULEDEPENDENCIES N/A
 
.REQUIREDSCRIPTS N/A
 
.EXTERNALSCRIPTDEPENDENCIES N/A
 
.PRIVATEDATA N/A
 
.PARAMETERS
Data
  | Write-Message {Message} {Foreground Color} {Background Color} {[-Indent1] [-Indent2] [-AddLineBefore] [-AddLineAfter]}
  |
  | The message to be passed into the function.
  | EXAMPLE: Write-Message 'Warning: The number of customers exceeded the maximum number of 39!!' 'Yellow' 'Black' -Indent2 -AddLineBefore -AddLineAfter
  |
  | Alternatively, Double Quotes can be utilized to add variables.
  | EXAMPLE: Write-Message "Warning: The number of customers exceeded the maximum number of $MaxNumber!!" 'Yellow' 'Black'
  |
Color
  | |
  | Foreground Font Colors: All font colors supported by PowerShell.
  | | Black, Blue, Cyan, DarkBlue, DarkCyan, DarkGray, DarkGreen, DarkMagenta,
  | | DarkRed, DarkYellow, Gray, Green, Magenta, Red, White, & Yellow
  | |
  | Background Font Colors: All font colors supported by PowerShell.
  | | Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow,
  | | Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, & White
  | |
  | Multiple Foreground Font Colors on Same Line:
  | | Must seperate by "|" without quotes and must have the exact number of "|" as in the message.
  | | EXAMPLE: Write-Message 'Warning: |The number of customers exceeded the maximum number of |39|!!' 'Red|White|Yellow|White' 'Black'
  | |
  | | No quotes are required when defining the color.
  | | EXMAPLE: Write-Message 'Warning: The number of customers exceeded the maximum number of 39!!' Red Black
  | |
  |
-Indent
  | Add line indentation before the message.
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -Indent
  | OUTPUT: ' Hello World'
  |
-Indent1
  | Add line indentation before the message.
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -Indent1
  | OUTPUT: ' - Hello World'
  |
-Indent2
  | Add line indentation before the message
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -Indent2
  | OUTPUT: ' -- Hello World'
  |
-Indent3
  | Add line indentation before the message
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -Indent3
  | OUTPUT: ' --- Hello World'
  |
-Indent4
  | Add line indentation before the message
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -Indent4
  | OUTPUT: ' ---- Hello World'
  |
-Indent5
  | Add line indentation before the message
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -Indent5
  | OUTPUT: ' ----- Hello World'
  |
-AddLineBefore
  | Adds a line before the message.
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -AddLineBefore
  |
-AddLineAfter
  | Adds a line after the message.
  | EXAMPLE: Write-Message 'Hello World' 'Yellow' 'Black' -AddLineAfter
  |
 
.EXAMPLE
Write-Message 'Warning: |The number of customers exceeded the maximum number of |39|!!' 'Red|Cyan|Yellow|Cyan' 'Black' -Indent2 -AddLineBefore -AddLineAfter
 
.AUDITLOGS
If the $Global:AuditLogPathFile variable is missing, no logs will be written.
The following example would be placed before this function.
   
# Set audit folder name variables
$AuditFolderName = 'AuditLogs'
   
# Set global audit log path file
$Global:AuditLogPathFile = (($PSScriptRoot) + ("\$AuditFolderName\") + ($(get-date -f yyyy-MM-dd-HH-mm-ss)) + ('-SomeFileName.log'))
   
# Check if audit folder exists, if not create it
If(-Not(Test-Path -LiteralPath (($PSScriptRoot) + ("\$AuditFolderName")))){
  New-Item -Path $PSScriptRoot -Name $AuditFolderName -ItemType "Directory" | Out-Null
}
 
#>


Function Write-Message{# Function to write message to host and audit log
  Param (
    [String]$Data,
    [String]$ForegroundColor = 'White',
    [String]$BackgroundColor = 'Black',
    [Switch]$Indent,
    [Switch]$Indent1,
    [Switch]$Indent2,
    [Switch]$Indent3,
    [Switch]$Indent4,
    [Switch]$Indent5,
    [Switch]$NoNewLine,
    [Switch]$AddLineBefore,
    [Switch]$AddLineAfter    
  )
  # Set indent line
  # Note, if multiple indent switches are used, the indent with lowest number wins
  If ($Indent){
    $IndentMessage = ' '
  }Else {
    If ($Indent1){
      $IndentMessage = ' - '
    }Else {
      If ($Indent2){
        $IndentMessage = ' -- '
      }Else {
        If ($Indent3){
          $IndentMessage = ' --- '
        }Else {
          If ($Indent4){
            $IndentMessage = ' ---- '
          }Else {
            If ($Indent5){
              $IndentMessage = ' ----- '
            }Else {
              $IndentMessage = $Null
            }
          }
        }
      }
    }
  }

  # Set add line before
  If ($AddLineBefore){
    $AddLineBreak = "`n"
  }Else {
    $AddLineBreak = $Null
  }

  # Process multicolor host message
  If ($ForegroundColor.Contains('|')){
    # Split color array
    $DataColor = $ForegroundColor.Split('|')
    # Split data array
    $DataMember = $Data.Split('|')
    # Loop through each data member in array
    For ($x = 0; $x -lt $DataMember.Count; $x++){
      Switch ($x){
        # Beginning of string
        {$x -eq 0} {
          # Write the data to the host the nonewline switch
          Write-Host (($AddLineBreak) + ($IndentMessage) + ($DataMember[$x])) -NoNewline -ForegroundColor $DataColor[$x]

          # Add first data pass to message variable
          $MassageData = $IndentMessage + $DataMember[$x]
        }

        # End of string
        {$DataMember.Count -eq $x + 1}{
          # Check for the addline switch
          If ($AddLineAfter){
            # Write the data to the host and include a new line space afterwards
            Write-Host $DataMember[$x] -ForegroundColor $DataColor[$x]; Write-Host
          }Else {
            # Check for the nonewline switch
            If ($NoNewLine){
              # Write the data to the host and include a new line space afterwards
              Write-Host $DataMember[$x] -ForegroundColor $DataColor[$x] -NoNewline
            }Else {
              # Write the data to the host
              Write-Host $DataMember[$x] -ForegroundColor $DataColor[$x]
            }
          }
          # Add first data pass to message data variable
          $MassageData = $MassageData + $DataMember[$x]
        }

        # Middle of string
        Default {
          # Write the data to the host
          Write-Host $DataMember[$x] -ForegroundColor $DataColor[$x] -NoNewline 
            
          # Add data pass to message data variable
          $MassageData = $MassageData + $DataMember[$x]
        }
      }
    }
  }Else {# Process single host message
    # Check if add line before flag exists
    If ($AddLineBefore){
      Write-Host
    }

    If ($NoNewLine){
      Write-Host ($IndentMessage + $Data) -ForegroundColor $ForegroundColor -BackgroundColor $BackgroundColor -NoNewline
    }Else {
      # Check if new line flag exists
      If ($AddLineAfter){
        Write-Host ($IndentMessage + $Data) -ForegroundColor $ForegroundColor -BackgroundColor $BackgroundColor; Write-Host
      }Else {
        Write-Host ($IndentMessage + $Data) -ForegroundColor $ForegroundColor -BackgroundColor $BackgroundColor
      }
    }

    # Add data to message variable
    $MassageData = $IndentMessage + $Data
  }
  # Save message to audit log
  If ($Global:AuditLogPathFile){
    If ($AddLineBreak){
      Add-Content ((get-date -f yyyy-MM-dd-HH-mm-ss) + (':')) -Path $Global:AuditLogPathFile
    }
    If ($AddLineAfter){
      Add-Content ((get-date -f yyyy-MM-dd-HH-mm-ss) + (': ') + ($MassageData)) -Path $Global:AuditLogPathFile
      Add-Content ((get-date -f yyyy-MM-dd-HH-mm-ss) + (':')) -Path $Global:AuditLogPathFile
    }Else {
      Add-Content ((get-date -f yyyy-MM-dd-HH-mm-ss) + (': ') + ($MassageData)) -Path $Global:AuditLogPathFile
    }
  }
}