I find that I often need random datasets for testing or for examples in my presentations. My favorite tool for that is NameIT. This is a PowerShell module written by Doug Finke that makes it super easy to create good looking but random data.
PS:> Invoke-Generate '[person]' -Count 3
Heather Rogers
John Bailey
Julia Perez
Index
Installing NameIT
This module is published to the PSGallery. All we have to do is install it.
Install-Module NameIT -Scope CurrentUser
Invoke-Generate
Invoke-Generate
is the workhorse of this module. By calling it without any parameters, we get a random text string.
PS:> Invoke-Generate
lhcqalmf
The real magic happens when we start to provide template strings with patterns in them. Quite often, we have a pattern in mind and NameIT lets us build on that. Here we use ‘?’ for random letters and ‘#’ for random numbers.
PS:> Invoke-Generate "cafe###-???"
cafe176-yhj
Template functions
There is also support for in-line template functions for common patterns. If we need a random name and an address for example:
PS:> Invoke-Generate "[person], [address]"
Sarah Garcia, 10096 Tililebuik Commons
The reason that I use NameIT is because it includes a good set of template functions that are easy to use.
`[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 pronounceable 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 male]`: generate random name of male based on provided culture like <FirstName><Space><LastName>.
`[address]`: generate a random street address. Formatting is biased to US currently.
`[guid]`: generates a random GUID.
`[randomdate]`: generates a random date.
`[state]`: generates a random US state. supports specifying abbr, zip, capital.
Syllable
The syllable template function will generate data that looks like words but are pronounceable and easier to remember than true random.
PS:> Invoke-Generate '[syllable][syllable][syllable][numeric][numeric]' -Count 5
ugderip87
gedicwa11
haermi85
uksexpop29
jursejcab72
Person
Generating random names is one of the most common data elements in random datasets. This is the example from the start of the article.
PS:> Invoke-Generate '[person]' -Count 3
Heather Rogers
John Bailey
Julia Perez
Some of these template functions support parameters. The [person]
template allows you to specify female
or male
names.
PS:> Invoke-Generate '[person female]' -Count 3
Natasha James
Christine Jenkins
Jennifer Nguyen
PS:> Invoke-Generate '[person male]' -Count 3
Joshua Richardson
Joseph Diaz
Luis Clark
Custom datasets
NameIT has a basic set of built in datasets, but we can create our own. These custom datasets can be used like the other template functions. To do this, we have to craft a hashtable in a special way.
$CustomData = @{
color = @('Red','Green','Blue','Black','White')
weekday = @('Monday','Tuesday','Wednesday','Thursday','Friday')
team = @('IT','Accounting','Marketing','Shipping','Administration','Sales')
}
Each key of the hashtable becomes a new template function. The values of the key are then randomly selected. In the above example, I have three sets of data called color
,weekday
, and team
. We can then provide this value to Invoke-Generate
to get a random value from that list.
PS:> Invoke-Generate "[color] [weekday] [team]" -CustomData $CustomData
Green Tuesday Marketing
Random objects
One interesting feature is the ability for Invoke-Generate -AsPSObject
to create PSObjects
for you. It uses ConvertFrom-StringData
internally to try and convert the string into an object. This generally expects you to create key value pairs for it to parse.
$template = @"
name = [person]
address = [address]
"@
Invoke-Generate $Template -AsPSObject -Count 3
That will create these objects for us automatically.
name address
---- -------
Christopher Scott 130 Buin Loop
Jonathan Flores 110 Nehle Clb
Jasmine Evans 68 Yegeh Blvd
JSON
If you find the use of flat key value pairs too limiting, then we can always generate JSON that can be converted into an object.
$template = @"
{
"name" : "[person]",
"address" : {
"street":"[address]",
"state":"[state abbr]"
}
}
"@
Invoke-Generate $Template -Count 3 |
ForEach-Object {ConvertFrom-Json $_}
I removed the -AsPSObject
this time because I want the raw string output.
{
"name" : "Travis Turner",
"address" : {
"street":"489 Juhalpipreduq Sta",
"state":"AL"
}
}
I can then pass this JSON to ConvertFrom-JSON
to get my desired object.
name address
---- -------
Travis Turner @{street=489 Juhalpipreduq Sta; state=AL}
Jesse Johnson @{street=44283 Zano Lane; state=PA}
Anthony Baker @{street=38215 Zulujjalga Port; state=MO}
Keep it simple
There is also nothing wrong with creating an object with random properties.
[pscustomobject]@{
name = Invoke-Generate '[person]'
address = @{
street = Invoke-Generate '[address]'
state = Invoke-Generate '[state abbr]'
}
}
I don’t have to craft some special string this way. It’s all PowerShell. This is exactly how I create my test objects.
NameIT in action
Here are a few examples that I pulled out of my scripts where I am alrady using NameIT.
Example server info
This first one is a fake server report. Something that shows system owners and some generic audit information.
[pscustomobject]@{
ComputerName = Invoke-Generate "Server-[state abbr]##"
Owner = Invoke-Generate "[person]"
Phone = Invoke-Generate "###-###-####"
LastUpdate = Invoke-Generate "[randomdate]"
Status = Invoke-Generate '[status]' -CustomData @{
status = @('Secure','Unpatched','Unsecure')
}
}
I do get a little clever with generating the status by using custom data inline. This may have been easier to just use a Get-Random
. It would have done the same thing.
@('Secure','Unpatched','Unsecure') | Get-Random
Here is what the final result looked like:
ComputerName Owner Phone LastUpdate Status
------------ ----- ----- ---------- ------
Server-AK22 Amy Hill 968-954-5675 01/15/2007 Unsecure
Server-MN43 Kelly Price 934-790-4090 11/14/1994 Secure
Server-NE01 Shane Robinson 337-859-7009 03/25/1973 Unpatched
Server-MS06 Evan Parker 792-245-5228 07/31/2009 Secure
Server-AZ26 Krystal Parker 643-391-6774 10/26/2014 Unsecure
AD group names
I had a demo that used Active Directory to generate a PSGraph based on group membership. For that, I generated several AD group names using the [synonym]
template function.
PS:> Invoke-Generate "[synonym opinion]_[synonym committee]" -Count 7
message_commission
subjectmatter_citizenscommittee
idea_nongovernmentalorganization
legaldocument_citizenscommittee
substance_administrativebody
subjectmatter_citizenscommittee
legalinstrument_administrativeunit
This worked out better than using random characters.
Final words
Many of the above examples were taken from the project’s github page. I have found NameIT to be very usefull. I know my random data looks a lot better because of it.