Public/Invoke-Generate.ps1

<#
.Synopsis
   Utilize Invoke-Generate to create a random value type
 
.DESCRIPTION
   NameIt returns strings including unecessary zeros in numbers. Get-RandomValue returns a specified values type.
 
.PARAMETER Template
   A Nameit template string.
 
   [alpha]; selects a random character (constrained by the -Alphabet parameter).
   [numeric]; selects a random numeric (constrained by the -Numbers parameter).
   [vowel]; selects a vowel from a, e, i, o or u.
   [phoneticVowel]; selects a vowel sound, for example ou.
   [consonant]; selects a consonant from the entire alphabet.
   [syllable]; generates (usually) a pronouncable single syllable.
   [synonym word]; finds a synonym to match the provided word.
   [person]; generate random name of female or male based on provided culture like <FirstName><Space><LastName>.
   [person female]; generate random name of female based on provided culture like <FirstName><Space><LastName>.
   [person female first]
   [person female last]
   [person male]; generate random name of male based on provided culture like <FirstName><Space><LastName>.
   [person male first]
   [person male last]
   [person both first]
   [person both last]
   [address]; generate a random street address. Formatting is biased to US currently.
   [space]; inserts a literal space. Spaces are striped from the templates string by default.
 
.PARAMETER Count
   The number of random items to return.
 
.PARAMETER Alphabet
   A set of alpha characters used to generate random strings.
 
.PARAMETER Numbers
   A set of digit characters used to generate random numerics.
 
.EXAMPLE
   PS C:\> Invoke-Generate
   lhcqalmf
 
.EXAMPLE
   PS C:\> Invoke-Generate -alphabet abc
   cabccbca
 
.EXAMPLE
   PS C:\> Invoke-Generate "cafe###"
   cafe176
 
.EXAMPLE
   PS C:\> Invoke-Generate "???###"
   yhj561
 
.EXAMPLE
   PS C:\> Invoke-Generate -count 5 "[synonym cafe]_[syllable][syllable]"
   restaurant_owkub
   coffeebar_otqo
   eatingplace_umit
   coffeeshop_fexuz
   coffeebar_zuvpe
 
.Notes
   Inspired by
   http://mitchdenny.com/introducing-namerer-for-naming-things/
#>


function Invoke-Generate {
    [CmdletBinding(DefaultParameterSetName = "Data")]
    param (
        [Parameter(Position = 0)]
        [String]
        $Template = '????????',

        [Parameter(Position = 1)]
        [int]
        $Count = 1,

        [Parameter(Position = 2)]
        [string]
        $Alphabet = 'abcdefghijklmnopqrstuvwxyz',

        [Parameter(Position = 3)]
        [string]
        $Numbers = '0123456789',

        [Parameter(Position = 4)]
        [HashTable]$CustomData,

        [Parameter(Position = 5)]
        [String]$CustomDataFile = "$ModuleBase\customData\customData.ps1",

        [Switch]$ApprovedVerb,
        [Switch]$AsCsv,
        [Switch]$UseCsvCultureSeparator,
        [Switch]$AsTabDelimited,
        [Switch]$AsPSObject ,

        [Parameter()]
        [cultureinfo]
        $Culture = [cultureinfo]::CurrentCulture
    )

    $script:alphabet = $alphabet
    $script:numbers = $number

    if (Test-Path $CustomDataFile) {
        $CustomData += . $CustomDataFile
    }

    if ($CustomData) {
        foreach ($key in $CustomData.Keys) {
            Add-GeneratorToSet -Name $key
            $null = New-Item -Path Function: -Name $key -Value { $CustomData[$MyInvocation.InvocationName] | Get-Random } -Force
        }
    }

    $template = $template -replace '\?', '[alpha]' -replace '#', '[numeric]'
    $unitOfWork = $template -split "\[(.+?)\]" | Where-Object -FilterScript { $_ }
    $tokenizerErrors = $null # must be declared for [ref]

    1..$count | ForEach-Object -Process {
        $r = -join $($unitOfWork | ForEach-Object -Process {
                $tokens = [System.Management.Automation.PSParser]::Tokenize($_, [ref] $tokenizerErrors)
                $fn = $tokens[0].Content
                if (Test-GeneratorInSet -Name $fn) {
                    $generator = Get-Command -Name $fn -ErrorAction Stop
                    $arguments = $tokens | 
                        Select-Object -Skip 1 |
                        ForEach-Object -Process {
                            if ($_.Type -eq [System.Management.Automation.PSTokenType]::String) {
                                '{0}' -f [System.Management.Automation.Language.CodeGeneration]::EscapeSingleQuotedStringContent($_.Content)
                            } else {
                                $_.Content
                            }
                        }

                    if ($generator.Parameters.ContainsKey('Culture') -and $arguments.Count -le $generator.Parameters['Culture'].Attributes.Position) {
                        $arguments = @() + $arguments + @('-Culture', $Culture.ToString())
                    }

                    $generatorExpression = "$fn $arguments"
                    $generatorExpression | Write-Verbose
                    $generatorExpression | Invoke-Expression
                } else {
                    $_
                }
            })

        if ($AsPSObject) {
            [pscustomobject](ConvertFrom-StringData $r)
        }
        elseif ($AsCsv) {
            $separator = if ($UseCsvCultureSeparator) {
                @{
                    Delimiter = $Culture.TextInfo.ListSeparator
                }
            } else {
                @{}
            }
            [pscustomobject](ConvertFrom-StringData $r) |
                ConvertTo-Csv -NoTypeInformation @separator
        }
        elseif ($AsTabDelimited) {
            [pscustomobject](ConvertFrom-StringData $r) |
                ConvertTo-Csv -Delimiter "`t" -NoTypeInformation
        }
        else {
            $r
        }
    }
}