當您需要一個用於測試或演示的資料集,並且該資料集需要表示個人識別資訊(PII)時,您通常不希望使用表示實際人員的真實資料。在這裡,我們將帶您瞭解如何使用PowerShell為此類場合生成隨機姓名和電話號碼列表。
在開始之前,您應該掌握一些工具和資訊:
此指令碼是使用PowerShell 4.0開發的,並已測試與PowerShell 2.0的相容性。自Windows 7以來,PowerShell 2.0或更高版本已內建到Windows中。它也可以作為Windows管理框架(WMF)的一部分用於Windows XP和Vista。下面是一些詳細資訊和下載連結。
你需要一些名字列表來輸入隨機生成器。一個偉大的來源,為許多名字,以及有關他們的流行資訊(雖然這將不會用於本指令碼),是美國人口普查局。下面的連結提供的列表非常大,因此如果您計劃一次生成大量的名稱和數字,您可能需要將它們縮小一點。在我們的測試系統中,使用完整列表生成每個姓名/號碼對大約需要1.5秒,但您的里程數將根據您自己的系統規格而有所不同。
無論使用哪種原始碼,都需要生成三個文字檔案,指令碼可以將其用作名稱選擇的池。每個檔案只能包含名稱,每行只能包含一個名稱。這些指令碼需要儲存在與PowerShell指令碼相同的資料夾中。
姓氏.txt應該包含您希望指令碼從中選擇的姓氏。例子:
Smith Johnson Williams Jones Brown**.txt應該包含希望指令碼從中選擇的**名字。例子:
James John Robert Michael William**.txt應該包含希望指令碼從中選擇的**名字。例子:
Mary Patricia Linda Barbara Elizabeth如果你想確保你的電話號碼與任何人的真實電話號碼不匹配,最簡單的方法就是使用眾所周知的“555”交換碼。但是如果你要展示一個有很多電話號碼的資料集,555很快就會變得非常單調。為了讓事情更有趣,我們將生成其他違反北美編號計劃(NANP)規則的電話號碼。下面是一些無效電話號碼的示例,表示此指令碼將生成的每類號碼:
請注意,上述規則可能會有所更改,並可能因司法管轄區而異。你應該做你自己的研究,以驗證適用於你將要生成電話號碼的地區的當前規則。
在整個指令碼中都會用到一些相當常見的命令,所以在我們開始實際編寫之前,您應該對這些命令的含義有一個基本的瞭解。
指令碼中還有其他命令,但我們將邊走邊解釋。
現在是時候把手弄髒了。
如果您希望指令碼從乾淨的控制檯開始執行,那麼這裡是您想要的第一行程式碼。
Clear-Host現在我們有了一個乾淨的螢幕,接下來我們要做的就是檢查指令碼,確保它所需要的一切都準備就緒。要做到這一點,我們需要先告訴它去哪裡找,找什麼。
$ScriptFolder = Split-Path $MyInvocation.MyCommand.Definition -Parent $RequiredFiles = ('Males.txt','Females.txt','Surnames.txt')第一行對任何指令碼都非常有用。它定義了一個變數,該變數指向包含指令碼的資料夾。如果指令碼需要與自身位於同一目錄(或該目錄的已知相對路徑)中的其他檔案,這一點非常重要,因為如果在另一個工作目錄中執行指令碼,則會遇到錯誤。
第二行建立指令碼正常執行所需的檔名陣列。在下一篇文章中,我們將使用這個引數和$ScriptFolder變數來檢查這些檔案是否存在。
$RequiredFiles | ForEach-Object { if (!(Test-Path "$ScriptFolder\$_")) { Write-Host "$_ not found." -ForegroundColor Red $MissingFiles++ } }這個指令碼塊將$RequiredFiles陣列傳送到ForEach物件塊中。在這個指令碼塊中,if語句使用testpath來檢視我們要查詢的檔案是否在它所屬的位置。testpath是一個簡單的命令,當給定一個檔案路徑時,它返回一個基本的true或false響應,告訴我們路徑是否指向某個存在的東西。其中的感嘆號有一個not運算子,它在將測試路徑的響應傳遞給if語句之前反轉它。因此,如果Test Path返回false(即,我們要查詢的檔案不存在),它將被轉換為true,以便if語句執行其指令碼塊。
這裡要注意的另一件事是使用雙引號而不是單引號,這在本指令碼中經常使用。當您將某個內容放在單引號中時,PowerShell將其視為靜態字串。單引號中的內容將按原樣傳遞。雙引號告訴PowerShell在傳遞字串之前轉換字串中的變數和其他一些特殊項。在這裡,雙引號意味著不執行測試路徑“$ScriptFolder\$\”,而是實際執行類似於測試路徑“C:\Scripts”的操作\姓氏.txt'(假設您的指令碼位於C:\Scripts中,並且ForEach物件當前正在處理'姓氏.txt’).
對於每個找不到的檔案,Write Host都會發布一條紅色的錯誤訊息,告訴您丟失了哪個檔案。然後它增加$MissingFiles變數,該變數將在下一部分中使用,以出錯並在缺少任何檔案時退出。
if ($MissingFiles) { Write-Host "Could not find $MissingFiles source file(s). Aborting script." -ForegroundColor Red Remove-Variable ScriptFolder,RequiredFiles,MissingFiles Exit }下面是另一個巧妙的技巧,你可以用if語句。大多數關於if語句的指南都會告訴您使用運算子檢查匹配條件。例如,這裡我們可以使用if($MissingFiles-gt 0)來檢視$MissingFiles是否大於零。但是,如果您已經在使用返回布林值的命令(如前面使用測試路徑的塊中所示),則不需要這樣做。在這種情況下,當你只是測試一個數字是否為非零時,你也可以不用它。任何非零數(正數或負數)都將被視為true,而零(或者這裡可能出現的不存在的變數)將被視為false。
如果$MissingFiles存在並且不為零,Write Host將釋出一條訊息,告訴您丟失了多少檔案,並且指令碼將中止。然後,Remove Variable將清理我們建立的所有變數,Exit將退出指令碼。在常規的PowerShell控制檯中,對於這個特定的目的,實際上並不需要Remove Variable,因為指令碼設定的變數通常在指令碼退出時被丟棄。但是,PowerShell ISE的行為有點不同,因此如果您計劃從那裡執行指令碼,則可能需要保留此選項。
如果一切正常,指令碼將繼續。還有一個需要準備的是一個別名,我們很高興以後能有這個別名。
New-Alias g Get-Random別名用於為命令建立備用名稱。這些工具有助於我們熟悉新的介面(例如:PowerShell具有內建別名,如dir->;get ChildItem和cat->;get Content),或者對常用命令進行速記引用。在這裡,我們為Get Random命令做了一個非常簡短的參考,稍後將大量使用這個命令。
GetRandom幾乎就是它的名字所暗示的。給定一個數組(比如一個名字列表)作為輸入,它從陣列中選擇一個隨機項並將其吐出。它也可以用來生成隨機數。關於隨機數和隨機數,要記住的一點是,和許多其他計算機操作一樣,它從零開始計數。因此,與其得到Random 10,意思是更自然的“給我一個從1到10的數字”,它實際上意味著“給我一個從0到9的數字”。你可以更具體地選擇數字,這樣得到Random的行為就更像你自然期望的,但在這個指令碼中我們不需要這樣。
雖然只生成一個隨機姓名和電話號碼的指令碼很好,但如果該指令碼允許使用者指定在一個批處理中要獲得多少姓名和號碼,那就更好了。不幸的是,我們不能真正信任使用者總是給出有效的輸入。所以,除了$UserInput=Read Host,還有更多的內容。
while (!$ValidInput) { try { [int]$UserInput = Read-Host -Prompt 'Items to be generated' $ValidInput = $true } catch { Write-Host 'Invalid input. Enter a number only.' -ForegroundColor Red } }上面的while語句檢查並否定$ValidInput的值。只要$ValidInput為false或不存在,它就會繼續迴圈遍歷其指令碼塊。
try語句透過Read Host接收使用者輸入,並嘗試將其轉換為整數值。(這是Read Host之前的[int])如果成功,它會將$ValidInput設定為true,以便while迴圈可以退出。如果不成功,catch塊將釋出一個錯誤,因為$ValidInput沒有設定,while迴圈將返回並再次提示使用者。
一旦使用者正確地給出了一個數字作為輸入,我們就希望指令碼宣佈它將要開始實際執行它的工作,然後開始執行它。
Write-Host "`nGenerating $UserInput names & phone numbers. Please be patient.`n" 1..$UserInput | ForEach-Object { <# INSERT RANDOM NAME & NUMBER GENERATOR HERE #> }別擔心,我們不會讓你自己去找出隨機名稱和數字生成器程式碼。這只是一個佔位符註釋,告訴你下一個部分(真正的工作在哪裡完成)將放在哪裡。
寫主機行非常簡單。它只是簡單地說明指令碼將生成多少個姓名和電話號碼,並要求使用者在指令碼工作時耐心等待。字串開頭和結尾的`n是在輸出前後**一個空行,只是為了在輸入行和名稱和數字列表之間提供一些視覺上的分隔。請注意,這是一個背勾(又名“重音符”-通常是標籤上方的鍵,在1的左邊),而不是在每個n前面的撇號或單引號。
下一部分將展示使用ForEach物件迴圈的不同方法。通常,當您希望指令碼塊執行一定次數時,會設定一個常規for迴圈,例如for($x=1;$x-le$UserInput;$x++){<;#INSERT script HERE#>;}。ForEach物件讓我們透過向它提供一個整數列表來簡化這個過程,而不是告訴它實際對這些整數執行任何操作,我們只是給它一個靜態指令碼塊來執行,直到它沒有整數可以執行為止。
生成名稱是此過程其餘部分中最簡單的部分。它只包括三個步驟:選擇姓氏、性別和名字。還記得我們給Random做的那個別名嗎?是時候開始使用它了。
$Surname = Get-Content "$ScriptFolder\Surnames.txt" | g $Male = g 2 if ($Male) {$FirstName = Get-Content "$ScriptFolder\Males.txt" | g} else {$FirstName = Get-Content "$ScriptFolder\Females.txt" | g}第一行獲取我們的姓氏列表,將其輸入隨機選取器,並將所選名稱指定給$LANSAME。
第二行選擇我們的人的性別。還記得Get Random是如何從零開始計數的嗎?零是假的,其他的都是真的嗎?這就是我們如何使用Get Random 2(或者由於我們的別名而短得多的g2——兩者都會導致在0或1之間進行選擇)來決定我們的人是否是**。if/else語句隨後會相應地隨機選擇一個**或**的名字。
這是真正有趣的部分。早些時候,我們向您展示瞭如何有幾種方法可以使一個無效或虛構的電話號碼。因為我們不希望所有的數字看起來太相似,所以每次我們都會隨機選取一個無效的數字格式。隨機選擇的格式將由它們的區號和交換碼來定義,它們將共同儲存為$Prefix。
$NumberFormat = g 5 switch ($NumberFormat) { 0 {$Prefix = "($(g 2)$(g 10)$(g 10)) $(g 10)$(g 10)$(g 10)"} 1 {$Prefix = "($(g 10)9$(g 10)) $(g 10)$(g 10)$(g 10)"} 2 {$Prefix = "($(g 10)$(g 10)$(g 10)) $(g 2)$(g 10)$(g 10)"} 3 {$Prefix = "($(g 10)$(g 10)$(g 10)) $(g 10)11"} 4 {$Prefix = "($(g 10)$(g 10)$(g 10)) 555"} }第一行是一個簡單的隨機數生成,用來選擇我們要使用的電話號碼格式。然後,switch語句接受該隨機選擇並相應地生成$字首。還記得那個無效電話號碼型別列表嗎?$NumberFormat值0-3對應於該列表中的前四個。值4可以生成最後兩個值中的一個,因為它們都使用“555”交換程式碼。
在這裡,你也可以看到我們正在使用另一個雙引號技巧。雙引號不僅允許您在字串輸出之前解釋變數,還允許您處理指令碼塊。為此,將指令碼塊包裝為:$(<;#script HERE#>;)”。所以你上面有很多單獨的隨機數字,其中一些數字要麼限制在它們的範圍內,要麼根據我們需要遵循的規則靜態設定。每個字串也有圓括號和空格,正如您通常希望在區號和交換碼對中看到的那樣。
在準備輸出姓名和電話號碼之前,我們需要做的最後一件事是生成一個訂戶ID,它將儲存為$Suffix。
switch ($NumberFormat) { {$_ -lt 4} {$Suffix = "$(g 10)$(g 10)$(g 10)$(g 10)"} 4 { switch ($Prefix) { '(800) 555' {$Suffix = '0199'} default {$Suffix = "01$(g 10)$(g 10)"} } } }由於555號碼的特殊規則,我們不能只為指令碼要生成的每個電話號碼的結尾生成四個隨機數字。所以,第一個開關檢查我們是否在處理一個555號碼。如果不是,則生成四個隨機數字。如果是555號碼,第二個開關檢查800區號。如果匹配,我們只能使用一個有效的$字尾。否則,可以從0100-0199之間的任何物件中進行選擇。
請注意,有幾種不同的方法可以編寫此塊,而不是按原樣編寫。這兩個switch語句都可以替換為if/else語句,因為它們各自只處理兩個選擇。另外,不是特別地將“4”作為第一個switch語句的選項,而是可以使用與第二個switch語句類似的“default”,因為它是剩下的唯一選項。在if/else和switch之間的選擇,或者在哪裡使用預設關鍵字而不是特定的值,通常歸結為個人喜好的問題。只要有用,就用你最舒服的東西。
現在,是時候輸出了。
Write-Output "$FirstName $Surname $Prefix-$Suffix" }這個和劇本里的一樣簡單。它只輸出用空格隔開的名字和姓氏,然後在電話號碼前加一個空格。這裡的標準破折號之間的交換程式碼和訂戶ID得到新增。
底部的右括號是前面的ForEach物件迴圈的結尾-如果已經得到了它,請忽略它。
在所有的工作都完成之後,一個好的指令碼知道如何在自己完成之後進行清理。同樣,如果您只打算從控制檯執行指令碼,那麼下面的變數刪除實際上是不需要的,但是如果您計劃在ISE中執行指令碼,那麼您將需要它。
Remove-Item alias:\g Remove-Variable ScriptFolder,RequiredFiles,Surname,Male,FirstName,NumberFormat,Prefix,Suffix,ValidInput,UserInput完成所有操作後,將副檔名為“.ps1”的指令碼儲存在與names檔案相同的資料夾中。確保您的ExecutionPolicy已經設定好,這樣指令碼就可以運行了,並嘗試一下。
以下是實際劇本的截圖:
您還可以從下面的連結下載包含此PowerShell指令碼的ZIP檔案和包含名稱列表的文字檔案。
PowerShell的隨機姓名和電話號碼生成器
... 那麼你知道如何建立一個好的密碼嗎?你怎麼能記住不止一個呢?這裡有一些技巧和竅門,以維護個人強密碼為您所有的線上帳戶。 ...
...意識到,主動電話幾乎人人都討厭。我們之前已經解釋過如何在Android上阻止通話,現在來看看如何在iOS上阻止電話號碼。 ...
...要在網站上輸入你的真實姓名或地址。你永遠不知道它是如何追溯到你的,如果真的發生了,你不會意識到它,直到為時已晚。 ...
...聯絡人與自己的資料庫進行匹配。Truecaller透過對數百萬使用者進行此項操作,建立了一個強大的使用者電話號碼資料庫。 ...
... 在本文中,我們將介紹如何使用不同的Apple裝置設定和建立Apple ID。因此,無論您使用的是iPhone、Mac還是Windows PC,您都可以獲得Apple ID並開始充分利用Apple的服務。 ...
...也可以直接在應用程式中快速將聯絡人新增到WhatsApp。 如何在android上的whatsapp中新增聯絡人 如果有人遞給你一張名片,你很快就想在WhatsApp中開始對話,那麼直接在WhatsApp中新增他們作為聯絡人。當你這麼做的時候,這個人的...
...進行更改。 相關:為什麼你應該使用密碼管理器,以及如何開始 聯機更改密碼 從Ring的網站開始。從那裡,點選右上角的“登入”按鈕。 接下來,登入您的帳戶。 將滑鼠懸停在右上角的姓名上,然後選擇“帳戶”選項。 單...
FaceTime是蘋果內建的影片和音訊通話應用程式。它與你的iPhone配對,允許你在macOS上打電話。 你不需要iPhone來打FaceTime電話(甚至不需要使用iMessage),但是你需要一個iPhone來打電話。如果你沒有iPhone,你仍然可以透過與你的Apple...
...碼從當前的SIM卡移動到攻擊者的SIM卡上。 埠輸出騙局是如何工作的? 這個騙局和身份盜竊有很多共同點。有人把你的個人資訊偽裝成你,讓你的**運營商把你的電話號碼移到一部新**上。**運營商會要求他們提供一些個人資訊來...