Public/Network/Format-MacAddress.ps1

function Format-MacAddress {
  <#
.SYNOPSIS
    Function to cleanup a MACAddress string
.DESCRIPTION
    Function to clean up a MACAddress string and optionally format it with separators
.PARAMETER MacAddress
    Specifies the MacAddress. Either a single string or an array of strings. Aliased to 'Address'
.PARAMETER Separator
    Specifies the separator every X characters. Aliased to 'Delimiter'. Validated against set(':', 'None', '.', "-", ' ', 'Space', ';')
.PARAMETER Case
    Specifies if the output is to be set in a particular case
    Upper Sets to upper case, 'a' becomes 'A'
    Uppercase Sets to upper case, 'a' becomes 'A'
    Lower Sets to lower case, 'A' becomes 'a'
    Lowercase Sets to lower case, 'A' becomes 'a'
    Ignore Does nothing to the case of the letters 'aB', so remains as 'aB'
.Parameter Split
    Specifies how many characters to split the MacAddress on. Valid values are 2,3,4,6
.EXAMPLE
    Format-MacAddress -MacAddress 1234567890ab
    12:34:56:78:90:ab
.EXAMPLE
    Format-MacAddress -MacAddress '00:11:22:dD:ee:FF' -Case Upper
    00:11:22:DD:EE:FF
.EXAMPLE
    Format-MacAddress -MacAddress '00:11:22:dD:ee:FF' -Case Lowercase
    001122ddeeff
.EXAMPLE
    Format-MacAddress -MacAddress '00:11:22:dD:ee:FF' -Case Lowercase -Separator '-'
    00-11-22-dd-ee-ff
.EXAMPLE
    Format-MacAddress -MacAddress '00:11:22:dD:ee:FF' -Case Lowercase -Separator '.'
    00.11.22.dd.ee.ff
.EXAMPLE
    Format-MacAddress -Address '00:11:22:dD:ee:FF', '10005a123456' -case Uppercase -Delimiter '-'
    00-11-22-DD-EE-FF
    10-00-5A-12-34-56
 
    Showing how function can take an array of MacAddress using the alias 'Address' and the alias 'Delimiter' for the 'Separator' parameter
.EXAMPLE
    '00:11:22:dD:ee:FF', '10005a123456' | Format-MacAddress -case Lowercase -Separator '.'
    00.11.22.dd.ee.ff
    10.00.5a.12.34.56
 
    Showing how the values for MacAddress can be received from the pipeline
.EXAMPLE
    Format-MacAddress '10005a123456' -case Lowercase -Separator ':'
    10:00:5a:12:34:56
 
    Showing how MacAddress can be unnamed positional parameter
.EXAMPLE
    '00:11:22:dD:ee:FF' | Format-MacAddress -Separator None -Case Ignore
 
    001122dDeeFF
.EXAMPLE
    '00:11:22:dD:ee:FF', '10005a123456' | Format-MacAddress -case Lowercase -Separator '.' -Split 4
    0011.22dd.eeff
    1000.5a12.3456
.EXAMPLE
    '00:11:22:dD:ee:FF', '10005a123456' | Format-MacAddress -case Lowercase -Separator '.' -Split 4 -IncludeOriginal
 
    OriginalMac FormattedMac
    ----------- ------------
    00:11:22:dD:ee:FF 0011.22dd.eeff
    10005a123456 1000.5a12.3456
.EXAMPLE
    Format-MacAddress -MacAddress (Get-RandomMacAddress) -Separator '.'
 
    95.4a.e6.39.05.aa
.OUTPUTS
    System.String
.NOTES
    # Inspired and based on Clean-MacAddress.ps1 by
    # Francois-Xavier Cat
    # www.lazywinadmin.com
    # @lazywinadm
 
    Modified:
    1. Changed MacAddress to allow for pipeline input
    2. Changed MacAddress to be a positional parameter
    3. Changed MacAddress to be aliased to 'Address'
    4. Changed MacAddress to accept an array of addresses if need be
    5. Changed Separator to be aliased to 'Delimiter'
    6. Added the space and semicolon to the set of valid separator values
    7. Changed the switches Upper and Lower to be a string parameter Case which accepts as valid input Upper, Uppercase, Lower, Lowercase, Ignore
    8. Added -Split parameter that can split the address every X characters. Valid values are 2,3,4,6
    9. Added IncludeOriginal switch to be able to compare original with formatted.
 
#>


  #region Parameter
  [OutputType('String')]
  [CmdletBinding()]
  param
  (
    [Parameter(Position = 0, HelpMessage = 'Please enter a MAC address (12 hex)', Mandatory, ValueFromPipeline)]
    [Alias('Address')]
    [String[]] $MacAddress,

    [ValidateSet(':', 'None', '.', '-', ' ', 'Space', ';')]
    [Alias('Delimiter')]
    [string] $Separator = ':',

    [ValidateSet('Ignore', 'Upper', 'Uppercase', 'Lower', 'Lowercase')]
    [string] $Case = 'Lower',

    [ValidateSet(2, 3, 4, 6)]
    [int] $Split = 2,

    [switch] $IncludeOriginal
  )
  #endregion Parameter

  begin {
    if ($Separator -eq 'Space') { $Separator = ' ' }
    Write-Invocation $MyInvocation
  }

  process {
    foreach ($Mac in $MacAddress) {
      $oldMac = $Mac
      $Mac = $Mac -replace '-', '' #Replace Dash
      $Mac = $Mac -replace ':', '' #Replace Colon
      $Mac = $Mac -replace ';', '' #Replace semicolon
      $Mac = $Mac -replace '/s', '' #Remove whitespace
      $Mac = $Mac -replace ' ', '' #Remove whitespace
      $Mac = $Mac -replace '\.', '' #Remove dots
      $Mac = $Mac.trim() #Remove space at the beginning
      $Mac = $Mac.trimend() #Remove space at the end
      switch ($Case) {
        'Upper' { $Mac = $mac.toupper() }
        'Uppercase' { $Mac = $mac.toupper() }
        'Lower' { $Mac = $mac.tolower() }
        'Lowercase' { $Mac = $mac.tolower() }
        'Ignore' { }
        Default { }
      }

      if ($Separator -ne 'None') {
        switch ($Split) {
          2 { $Mac = $Mac -replace '(..(?!$))', "`$1$Separator" }
          3 { $Mac = $Mac -replace '(...(?!$))', "`$1$Separator" }
          4 { $Mac = $Mac -replace '(....(?!$))', "`$1$Separator" }
          6 { $Mac = $Mac -replace '(......(?!$))', "`$1$Separator" }
          default { $Mac = $Mac -replace '(..(?!$))', "`$1$Separator" }
        }
      }

      if ( !($IncludeOriginal) ) {
        Write-Output -InputObject $Mac
      } else {
        $prop = ([ordered] @{ OriginalMac = $oldMac ; FormattedMac = $mac })
        $obj = New-Object -TypeName psobject -Property $prop
        Write-Output -InputObject $obj
      }
    }
  } #EndBlock Process

  end {
    Out-Verbose $fxn "Complete."
  }
}