如何用PowerShell生成随机姓名和电话号码

当您需要用于测试或演示的数据集,并且该数据集需要表示个人身份信息(PII)时,您通常不希望使用代表真实人员的真实数据。在这里,我们将带您了解如何使用PowerShell为此类场合生成随机姓名和电话号码列表。

你需要什么

在开始之前,您应该拥有一些工具和信息:

Powershell

此脚本是使用PowerShell 4.0开发的,并且已经过与PowerShell 2.0的兼容性测试。从Windows 7开始,PowerShell 2.0或更高版本已内置到Windows中。它还可用于Windows XP和Vista,作为Windows管理框架(WMF)的一部分。下面是一些进一步的详细信息和下载链接。

PowerShell 2.0随Windows 7一起提供。Windows XP SP3和Vista(SP1或更高版本)用户可以从Microsoft的KB968929下载相应的WMF版本。XP SP2或更低版本或没有SP1的Vista不支持此功能。 PowerShell 4.0自带Windows 8.1。Windows7SP1用户可以作为WMF更新的一部分从Microsoft下载中心升级到它。它不适用于XP或Vista。

姓名

您需要一些姓名列表才能输入随机生成器。美国人口普查局是许多名字的一个很好的来源,以及关于它们的受欢迎程度的信息(尽管本文不会使用这些信息)。下面的链接中提供的列表非常大,所以如果您计划一次生成大量的姓名和数字,您可能需要将其缩减一些。在我们的测试系统上,使用完整的列表生成每个名称/号码对大约需要1.5秒,但您的里程数将根据您自己的系统规格而有所不同。

姓氏。 男性名字。 女性名字

无论您使用哪种源,您都需要生成三个文本文件,脚本可以将它们用作名称选择的池。每个文件应该只包含名称,并且每行只能包含一个名称。这些文件需要存储在与PowerShell脚本相同的文件夹中。

Surnames.txt应该包含您希望脚本从中选择的姓氏。示例:

Males.txt应该包含您希望脚本从中选择的男性名字。示例:

Females.txt应该包含您希望脚本从中选择的女性名字。示例:

电话号码的规则

如果你想确定你的电话号码与任何人的真实电话号码不匹配,最简单的方法是使用众所周知的“555”交换码。但是如果你要显示一个有很多电话号码的数据集,那555很快就会开始看起来相当单调。为了让事情更有趣,我们将生成其他违反北美编号计划(NANP)规则的电话号码。下面是一些无效电话号码示例,表示此脚本将生成的每类号码:

(157)836-8167。 此号码无效,因为区号不能以1或0开头。 (298)731-6185。 此号码无效,因为NANP没有分配第二位数字为9的区号。 (678)035-7598。 此数字无效,因为Exchange代码不能以1或0开头。 (752)811-1375。 此数字无效,因为Exchange代码不能以两个1结尾。 (265)555-0128。 此号码无效,因为交换代码是555,并且订户ID在为虚拟号码保留的范围内。 (800)555-0199。 这个号码是唯一一个带有555交换代码的800号码,该号码保留用作虚构号码。

请注意,上述规则可能会更改,并可能因司法管辖区的不同而有所不同。您应该自己进行研究,以验证适用于您将为其生成电话号码的区域设置的当前规则。

常用命令

在整个脚本中将使用一些相当常见的命令,因此在我们开始实际编写之前,您应该对这些命令的含义有一个基本的了解。

ForEach-Object接受对象的数组或列表,并对每个对象执行指定的操作。在ForEach-Object脚本块中,$_变量用于引用当前正在处理的项。 IF…。ELSE语句允许您仅在满足某些条件时执行操作,并(可选)指定不满足该条件时应执行的操作。 SWITCH语句类似于IF语句,具有更多选择。开关将根据几个条件检查对象,并运行为该对象匹配的条件指定的任何脚本块。您还可以选择指定仅在没有其他条件匹配时才运行的默认块。SWITCH语句还使用$_变量来引用当前正在处理的项。 只要满足特定条件,WHILE语句就允许您连续重复脚本块。在脚本块完成时,一旦发生导致条件不再为真的情况,循环就会退出。 试试…。Catch语句有助于错误处理。如果为try指定的脚本块出现任何错误,则Catch块将运行。 Get-Content做它在罐头上写的事情。它获取指定对象的内容-通常是文件。这可以用于在控制台显示文本文件的内容,或者像在此脚本中一样,沿管道传递内容以与其他命令一起使用。 Write-Host将内容放入控制台。它用于向用户显示消息,如果输出被重定向,则不会包含在脚本的输出中。 WRITE-OUTPUT实际上会生成输出。通常,这会转储到控制台,但也可以由其他命令重定向。

脚本中还有其他命令,但我们将在进行过程中解释这些命令。

构建脚本

现在是我们动手的时候了。

第1部分:做好准备

如果您希望您的脚本从干净的控制台开始运行,这里是您想要的第一行。

现在我们有了一个干净的屏幕,接下来我们要做的是检查脚本,以确保它所需的一切都已就绪。要做到这一点,我们需要从告诉它在哪里寻找,以及寻找什么开始。

那里的第一行对于任何脚本都非常有用。它定义一个指向包含脚本的文件夹的变量。如果您的脚本需要位于与其本身相同的目录(或该目录的已知相对路径)中的其他文件,这是必不可少的,因为如果您在另一个工作目录中尝试运行脚本时,将会遇到错误。

第二行创建脚本正确运行所需的文件名数组。在下一篇文章中,我们将使用这个变量和$ScriptFolder变量,检查这些文件是否存在。

这段脚本将$RequiredFiles数组发送到ForEach-Object块。在该脚本块中,if语句使用Test-path来查看我们正在查找的文件是否属于它。test-path是一个简单的命令,当给定文件路径时,它返回一个基本的TRUE或FALSE响应,告诉我们该路径是否指向存在的内容。There中的感叹号有一个NOT操作符,它在将Test-Path的响应传递给if语句之前将其反转。因此,如果Test-Path返回false(即,我们正在查找的文件不存在),它将被转换为true,以便if语句执行其脚本块。

这里要注意的另一件事(将在此脚本中经常使用)是使用双引号而不是单引号。当您将某项放在单引号中时,PowerShell会将其视为静态字符串。单引号中的任何内容都将按原样传递。双引号告诉PowerShell在传递字符串之前转换字符串中的变量和其他一些特殊项。这里,双引号意味着我们实际上不会运行Test-path‘$ScriptFolder\$_’,而是执行更类似于Test-path‘C:\scripts\Surnames.txt’的操作(假设您的脚本位于C:\script中,并且ForEach-Object当前正在处理‘Surnames.txt’)。

对于每个找不到的文件,Write-Host将发布一条红色错误消息,告诉您缺少哪个文件。然后,它递增将在下一篇文章中使用的$MissingFiles变量,以便在缺少任何文件时出错并退出。

这里有另一个巧妙的技巧,您可以使用If语句来完成。您将看到的关于if语句的大多数指南都会告诉您使用运算符检查匹配条件。例如,这里我们可以使用if($MissingFiles-GT 0)来查看$MissingFiles是否大于零。但是,如果您已经在使用返回布尔值的命令(就像我们使用Test-Path的前一块中一样),那么就没有必要这样做。在这样的情况下,您也可以不使用它,当您只是在测试一个数字是否非零时。任何非零数(正数或负数)将被视为true,而零(或者,这里可能发生的情况,不存在的变量)将被视为false。

如果$MissingFiles存在,并且不是零,Write-Host将发布一条消息,告诉您丢失了多少个文件,并且脚本将中止。然后,Remove-Variable将清理我们创建的所有变量,退出将退出脚本。在常规的PowerShell控制台上,这一特定目的实际上并不需要Remove-Variable,因为脚本设置的变量通常在脚本退出时会被丢弃。但是,PowerShell ISE的行为略有不同,因此如果您计划从那里运行脚本,您可能希望保留它。

如果一切正常,剧本就会继续。另一个要做的准备是一个别名,我们以后会很高兴有这个别名的。

别名用于创建命令的备用名称。这些可以帮助我们熟悉新的界面(例如:PowerShell有内置的别名,如dir->Get-ChildItem和cat->Get-Content),或者帮助我们对常用命令进行简略的参考(例如:PowerShell具有内置别名,如dir->Get-ChildItem和cat->Get-Content)。在这里,我们对稍后将大量使用的get-Random命令做一个非常简略的参考。

Get-Random在很大程度上就像它的名字所暗示的那样。给定一个数组(类似于名称列表)作为输入,它从数组中随机挑选一项并将其输出。它还可以用来生成随机数。不过,关于Get-Random和Numbers需要记住的一点是,像许多其他计算机操作一样,它从零开始计数。因此,Get-Random 10的意思不是更自然的“给我一个从1到10的数字”,而是“给我一个从0到9的数字”。您可以更具体地选择数字,以便Get-Random的行为更像您自然期望的那样,但我们在此脚本中不需要这样做。

第2部分:获取用户输入并开始工作

虽然只生成一个随机姓名和电话号码的脚本很棒,但如果脚本允许用户指定他们想要在一批中获得多少个姓名和号码,效果会更好。不幸的是,我们不能真正信任用户总是提供有效的输入。因此,这不仅仅是$UserInput=Read-Host。

上面的WHILE语句检查并否定$ValidInput的值。只要$ValidInput为false或不存在,它就会继续循环访问其脚本块。

try语句通过Read-Host接受用户输入,并尝试将其转换为整数值。(这是Read-Host之前的[int]。)。如果成功,它会将$ValidInput设置为true,这样While循环就可以退出。如果没有成功,CATCH块将发布一个错误,并且由于没有设置$ValidInput,WHILE循环将返回并再次提示用户。

一旦用户正确地给出了一个数字作为输入,我们希望脚本宣布它即将开始实际工作,然后开始工作。

别担心,我们不会让您自己找出随机的名称和数字生成器代码。这只是一个占位符注释,用于向您显示下一节(完成实际工作的位置)适合的位置。

Write-Host行相当简单。它简单地说明脚本将生成多少个姓名和电话号码,并要求用户在脚本执行其工作时耐心等待。字符串开头和结尾处的`n是在该输出前后插入一个空行,只是为了在输入行和名称和数字列表之间提供一些视觉上的分隔。(=。请注意,这是一个反勾号(又名“庄重的重音”-通常是制表符上方的键,在1的左边),而不是每个n前面的撇号或单引号。

下一部分展示了使用ForEach-Object循环的不同方式。通常,当您希望脚本块运行特定次数时,您将设置一个常规的for循环,如for($x=1;$x-le$UserInput;$x++){<#insert script here#>}。ForEach-Object允许我们通过向它提供整数列表来简化这一过程,而不是告诉它实际对这些整数做任何事情,我们只给它一个静态脚本块来运行,直到它的整数用完为止。

第3部分:生成随机名称

生成名称是此过程其余部分中最简单的一部分。它只包括三个步骤:选择姓氏,选择性别,选择名字。还记得我们前段时间为Get-Random做的别名吗?是时候开始使用它了。

第一行接受我们的姓氏列表,将其提供给随机选择器,并将选定的姓名分配给$Surname。

第二行选择我们的人的性别。还记得Get-Random是如何从零开始计数的吗?零是假的,其他一切都是真的吗?这就是我们如何使用Get-Random 2(或由于我们的别名而使用更短的g2-两者都导致在0或1之间进行选择)来决定我们的人是不是男性。随后的if/Else语句相应地随机选择一个男性或女性名字。

第4部分:生成随机电话号码

这才是真正有趣的部分。早些时候,我们向您展示了几种使电话号码无效或虚构的方法。因为我们不想让所有的数字看起来都太相似,所以我们每次都会随机选择一个无效的数字格式。随机选择的格式将由它们的区号和交换码定义,它们将统一存储为$PREFIX。

第一行是一个简单的随机数生成,用于选择我们要为电话号码遵循哪种格式。然后,switch语句接受该随机选择,并相应地生成$前缀。还记得那个无效电话号码类型列表吗?$NumberFormat值0-3对应于该列表中前四个值。值4可以生成后两个中的一个,因为两者都使用“555”交换代码。

在这里,您还可以看到我们正在使用另一个带有双引号的技巧。双引号不仅允许您在字符串输出之前解释变量-它们还允许您处理脚本块。为此,您可以这样包装脚本块:“$(<#script here#>)”。所以上面有很多单独的随机数字,其中一些要么限制在它们的范围内,要么根据我们需要遵循的规则静态设置。每个字符串还带有圆括号和空格,您通常会在区号和交换代码对中看到它们。

在准备输出姓名和电话号码之前,我们需要做的最后一件事是生成订户ID,它将存储为$SUFFIX。

由于555个数字的特殊规则,我们不能只为脚本要生成的每个电话号码的末尾生成四个随机数字。所以,第一个开关检查我们是不是在处理555号码。如果不是,它会生成四个随机数字。如果是555号码,第二台交换机将检查区号800。如果匹配,则只有一个有效的$后缀可以使用。否则,它可以从0100-0199之间的任何值中进行选择。

请注意,此块可能有几种不同的写入方式,而不是原来的方式。这两个switch语句都可以替换为if/Else语句,因为它们各自只处理两个选择。此外,不是专门为第一个switch语句调用“4”作为选项,而是可以使用与第二个语句类似的“default”,因为它是剩下的唯一选项。If/Else和Switch之间的选择,或者在哪里使用DEFAULT关键字而不是特定值,通常归结为个人偏好问题。只要能用,就用你觉得最舒服的。

现在,是输出的时间了。

这个很简单,就像它在剧本里得到的一样。它只输出用空格分隔的名字和姓氏,然后输出电话号码前的另一个空格。这里还添加了Exchange Code和订户ID之间的标准破折号。

底部的右方括号是前面ForEach-Object循环的末尾-如果您已经得到它,就省略它。

第5部分:清理和运行脚本

在所有工作完成之后,一个好的脚本知道如何自我清理。同样,如果您只打算从控制台运行脚本,则不需要删除下面的变量,但是如果您计划在ISE中运行脚本,则需要删除以下变量。

完成所有操作后,使用“.ps1”扩展名将脚本保存在与Names文件相同的文件夹中。确保设置了ExecutionPolicy,以便脚本可以运行,并试一试。

以下是脚本运行的屏幕截图:

您还可以从下面的链接下载包含此PowerShell脚本的ZIP文件,以及带有名称列表的文本文件。

PowerShell的随机名字和电话号码生成器

相关文章