public/Set-ComputerName.ps1

function Set-ComputerName {
    <#
    .SYNOPSIS
        Rename computer using common standard format
    .DESCRIPTION
        I hate repeating myself
    .PARAMETER MaxNameLength
        Maximum length of new name (default is 15, which is the limit for Windows)
    .PARAMETER FormCode
        Form-factor code placement: Prefix (default), Suffix, or None
    .PARAMETER NoHyphen
        Do not insert a hyphen separator between FormCode and SerialNumber
    .PARAMETER Reboot
        Force a reboot at the end (default = no reboot)
    .EXAMPLE
        Set-ComputerName
        (Defaults) results in name like "L-123456789"
    .EXAMPLE
        Set-ComputerName -FormCode Suffix -NoHyphen
        Results in name like "123456789L"
    .EXAMPLE
        Set-ComputerName -FormCode None -MaxNameLength 8
        Results in name like "12345678"
    .NOTES
        Actual Serial Number is used from WMI class Win32_SystemEnclosure,
        Chassis Type number is taken from Win32_SystemEnclosure and uses first
        element of result only, since docking stations, port replicators
        may return an array like (10,12) where 10 is the laptop, and 12 is the dock
    .LINK
        https://github.com/Skatterbrainz/ds-utils/blob/master/docs/Set-ComputerName.md
    #>

    [CmdletBinding(SupportsShouldProcess)]
    [OutputType()]
    param (
        [parameter(Position=0)][ValidateRange(3,63)][int] $MaxNameLength = 15,
        [parameter()][ValidateSet('Prefix','Suffix','None')][string] $FormCode = 'Prefix',
        [parameter()][switch] $NoHyphen,
        [parameter()][switch] $Reboot
    )
    # rename computer to "X-12345678"
    [string]$sn = (Get-WmiObject -Class Win32_SystemEnclosure).SerialNumber
    [int]$ct = ((Get-WmiObject -Class Win32_SystemEnclosure).ChassisTypes)[0]
    Write-Verbose "serialnumber = $sn"
    Write-Verbose "chassistype = $ct"
    # desktops
    if ($ct -in (3..7)+(13,34,35)) { $ff = 'D' }
    # laptops
    elseif ($ct -in (10,11,12,14)+(15..30)+(31,32,33,36)) { $ff = 'L' }
    # servers
    elseif ($ct -in (17..24)) { $ff = 'S' }
    # unknown
    else { $ff = 'X' }
    if ($NoHyphen) { $sep = "" } else { $sep = "-" }
    if ($FormCode -eq 'None') { $fc = ""; $sep = "" } else { $fc = $ff }
    $nx = "$fc$sep$sn"
    if ($nx.Length -gt $MaxNameLength) {
        $over = $nx.Length - $MaxNameLength
        $sn = $sn.substring($over, $sn.Length - $over)
        $nx = "$fc$sep$sn"
    }
    Write-Host "renaming computer to $nx" -ForegroundColor cyan
    if ($Reboot) {
        Rename-Computer -NewName $nx -Force -Restart
    } else {
        Rename-Computer -NewName $nx -Force
    }
}