functions/Get-WURandomString.ps1

<#
  .SYNOPSIS
  Get a random string.
 
  .DESCRIPTION
  Get a random string. You can specify the number of characters and character types.
 
  .OUTPUTS
  System.String
 
  .EXAMPLE
  PS C:\>Get-WURandomString -Length 8
 
  Returns a string like '8i60va7z'.
 
  .EXAMPLE
  PS C:\>Get-WURandomString -Length 32 -CharType 'UppercaseAlphabet','Number'
 
  Returns a string like '3EU1PZ4YQLC2SIJMON0W8BTG7H5A9X6K'.
 
  .EXAMPLE
  PS C:\>Get-WURandomString -Length 16 -Char '_','@','[',']'
 
  Returns a string like 'd[7e3x5wqi8nztl_'.
#>


[CmdletBinding()]
param (
  [ValidateNotNull()]
  [int]
  # Specify the number of characters to retrieve.
  $Length,

  [ValidateSet('Number', 'LowercaseAlphabet', 'UppercaseAlphabet')]
  [string[]]
  # Specifies character types. The default value are 'Number', 'LowercaseAlphabet'.
  $CharType = @('Number', 'LowercaseAlphabet'),

  [char[]]
  $Char
)

Set-StrictMode -Version 'Latest'

$CharTypeRanges = @{
  Number            = 48..57
  LowercaseAlphabet = 97..122
  UppercaseAlphabet = 65..90
}

$CharRanges = $CharType | ForEach-Object {
  $CharTypeRanges.$_
}

$CharRanges += [int[]]$Char

return -join ( $CharRanges | Select-Object -Unique | Get-Random -Count $Length | ForEach-Object { [char]$_ })