PowerShellを使用してランダムな名前と電話番号を生成する方法
テストまたはデモンストレーション用のデータセットが必要で、そのセットが個人情報(PII)を表す必要がある場合は、通常、実際の人を表す実際のデータを使用したくありません。ここでは、そのような場合にPowerShellを使用してランダムな名前と電話番号のリストを生成する方法について説明します。.
あなたが必要なもの
始める前に、いくつかのツールと情報が必要です。
パワーシェル
このスクリプトはPowerShell 4.0を使用して開発され、PowerShell 2.0との互換性についてもテストされています。 PowerShell 2.0以降は、Windows 7以降Windowsに組み込まれています。WindowsXPおよびVistaでも、Windows Management Framework(WMF)の一部として使用できます。いくつかのさらなる詳細とダウンロードのためのリンクは下にあります.
- PowerShell 2.0にはWindows 7が付属しています。WindowsXP SP3およびVista(SP1以降)のユーザーは、Microsoftから適切なWMFバージョンをKB968929でダウンロードできます。 XP SP2以下、またはSP1なしのVistaではサポートされていません。.
- PowerShell 4.0にはWindows 8.1が付属しています。 Windows 7 SP1ユーザーは、MicrosoftダウンロードセンターからのWMFアップデートの一部としてアップグレードできます。 XPやVistaでは利用できません.
お名前
ランダムジェネレータに入力するにはいくつかの名前のリストが必要です。のための素晴らしい情報源 ロット 名前、およびその人気に関する情報(このスクリプトでは使用されません)は、アメリカ合衆国国勢調査局です。以下のリンクから入手できるリストは非常に大きいので、一度にたくさんの名前と番号を生成する予定がある場合は、それらを少し切り捨てることをお勧めします。私たちのテストシステムでは、フルリストを使って生成するのにそれぞれの名前/番号のペアは約1.5秒かかりました、しかしあなたの走行距離はあなた自身のシステムスペックによって変わるでしょう.
- 姓
- 男性のファーストネーム
- 女性のファーストネーム
使用するソースに関係なく、スクリプトが名前選択のためのプールとして使用できる3つのテキストファイルを生成する必要があります。各ファイルには名前だけを入れ、1行に1つの名前だけを入れます。これらはあなたのPowerShellスクリプトと同じフォルダに保存する必要があります。.
Surnames.txt スクリプトに選択させたい姓を含める必要があります。例:
スミスジョンソンウィリアムズジョーンズブラウン
Males.txt スクリプトに選択させたい男性の姓を含める必要があります。例:
ジェームズジョンロバートマイケルウィリアム
Females.txt スクリプトに選択させたい女性のファーストネームを含める必要があります。例:
メアリーパトリシアリンダバーバラエリザベス
電話番号の規則
自分の電話番号が他人の実際の電話番号と一致しないようにするには、最も一般的な「555」Exchangeコードを使用します。しかし、たくさんの電話番号を含むデータセットを表示しようとしているのであれば、555はかなり単調に見えます。物事をより面白くするために、北米番号計画(NANP)の規則に違反する他の電話番号を生成します。以下は無効な電話番号のサンプルです。このスクリプトで生成される各クラスの番号を表します。
- (157)836-8167
市外局番が1または0で始まることができないため、この番号は無効です。. - (298)731-6185
NANPが2桁目に9を含む市外局番を割り当てていないため、この番号は無効です。. - (678)035〜7598
Exchange Codesが1または0で始まることができないため、この番号は無効です。. - (752)811〜1375
Exchange Codesは2つの1で終わることができないのでこの数は無効です. - (265)555-0128
Exchangeコードが555であるため、この番号は無効です。, そして 加入者IDが架空の番号用に予約されている範囲内にある. - (800)555-0199
この番号は、架空の番号として使用するために予約されている555交換コードを持つ唯一の800番号です.
上記の規則は変更されることがあり、管轄によって異なる場合があることに注意してください。電話番号を生成するロケールに適用される現在の規則を確認するには、独自の調査を行う必要があります。.
一般的なコマンド
このスクリプト全体を通して使用されることになるいくつかのかなり一般的なコマンドがあるので、実際にそれを書くことに飛び込む前に、あなたはこれらが何を意味するかの基本的な考えを得るべきです.
- ForEachオブジェクト オブジェクトの配列(リスト)を取り、それぞれに対して指定された操作を実行します。 ForEach-Objectスクリプトブロック内で、$ _変数は現在処理中のアイテムを参照するために使用されます。.
- もし…他に ステートメントを使用すると、特定の条件が満たされている場合にのみ操作を実行でき、(オプションで)その条件が満たされていない場合に行うべきことを指定できます。.
- スイッチ 文は、より多くの選択肢を持つif文に似ています。 Switchはいくつかの条件に対してオブジェクトをチェックし、オブジェクトが一致する条件に対して指定されたスクリプトブロックを実行します。他の条件が一致しない場合にのみ実行されるデフォルトブロックをオプションで指定することもできます。 switchステートメントは、処理中の現在の項目を参照するために$ _変数も使用します。.
- しながら ステートメントを使用すると、特定の条件が満たされる限り、スクリプトブロックを継続的に繰り返すことができます。スクリプトブロックが終了したときに条件が真にならないようなことが起こると、ループは終了します。.
- 試して…キャッチ ステートメントはエラー処理に役立ちます。 tryに指定されたスクリプトブロックに問題があると、catchブロックが実行されます。.
- コンテンツ取得 それはすずの上にそれが言うことをします。指定されたオブジェクト(通常はファイル)の内容を取得します。これは、コンソールでテキストファイルの内容を表示するために使用することも、このスクリプトのように他のコマンドで使用するために内容をパイプラインに沿って渡すこともできます。.
- 書き込みホスト コンソールに何かを入れます。これはユーザーにメッセージを表示するために使用され、出力がリダイレクトされた場合はスクリプトの出力に含まれません。.
- 書き込み出力 実際に出力を生成します。通常、これはコンソールにダンプされますが、他のコマンドによってリダイレクトすることもできます。.
スクリプトには他にもコマンドがありますが、それらを説明します。.
スクリプトを構築する
今度は私達の手を汚す時間です.
パート1:準備をする
あなたがあなたのスクリプトをきれいなコンソールから実行し始めるのが好きなら、ここにあなたがそれに欲しい最初の行があります.
クリアホスト
きれいなスクリーンができたので、次にやるべきことは、スクリプトで必要なものがすべて揃っていることを確認することです。そのためには、どこを探すべきか、何を探すべきかを伝えることから始める必要があります。.
$ ScriptFolder =分割パス$ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles =( 'Males.txt'、 'Females.txt'、 'Surnames.txt')
最初の行はどんなスクリプトにもとても便利です。スクリプトを含むフォルダを指す変数を定義します。スクリプトがそれ自身と同じディレクトリ(またはそのディレクトリからの既知の相対パス)にある他のファイルを必要とする場合、これは不可欠です。作業ディレクトリ.
2行目は、スクリプトを正しく実行するために必要なファイル名の配列を作成します。これらのファイルが存在することを確認する次の部分で、$ ScriptFolder変数と共にこれを使用します。.
$ RequiredFiles | ForEach-Object if(!(テストパス "$ ScriptFolder \ $ _"))書き込みホスト "$ _が見つかりません。" -ForegroundColor Red $ MissingFiles ++
この一連のスクリプトは、$ RequiredFiles配列をForEach-Objectブロックに送信します。そのスクリプトブロック内で、ifステートメントはTest-Pathを使用して、探しているファイルがそれが属する場所であるかどうかを確認します。 Test-Pathは、ファイルパスを指定すると、パスが存在するものを指しているかどうかを示すために基本的なtrueまたはfalseの応答を返す単純なコマンドです。そこに感嘆符があります ではない これは、ifステートメントに渡す前にTest-Pathの応答を元に戻します。そのため、Test-Pathがfalseを返した場合(つまり、探しているファイルが存在しない場合)、それはtrueに変換され、ifステートメントはそのスクリプトブロックを実行します。.
ここで注意すべきもう1つのことは、このスクリプトでよく使用されますが、一重引用符ではなく二重引用符を使用することです。何かを一重引用符で囲むと、PowerShellはそれを静的文字列として扱います。一重引用符で囲まれているものはそのままそのまま渡されます。二重引用符は、PowerShellに渡す前に、文字列内の変数やその他の特別な項目を変換するように指示します。ここでは、二重引用符は、実行する代わりに テストパス '$ ScriptFolder \ $ _' 私たちは実際にもっと似たようなことをするでしょう テストパス 'C:\ Scripts \ Surnames.txt' (あなたのスクリプトがC:\ Scriptsにあり、ForEach-Objectが現在 'Surnames.txt'に取り組んでいると仮定します).
見つからないファイルごとに、Write-Hostは、どのファイルが見つからないかを知らせるエラーメッセージを赤で表示します。それから、次の部分で使用される$ MissingFiles変数をインクリメントして、エラーが発生し、足りないファイルがあれば終了します。.
"if($ MissingFiles)Write-Host" $ MissingFilesソースファイルが見つかりませんでした。スクリプトを中止します。 -ForegroundColor赤削除変数ScriptFolder、RequiredFiles、MissingFiles Exit
これはあなたがif文でできるもう一つの巧妙なトリックです。 ifステートメントが一致条件をチェックするために演算子を使うようにあなたに言うかについてあなたが見るであろうほとんどのガイド。たとえば、ここで私たちは使用することができます if($ MissingFiles -gt 0) $ MissingFilesがゼロより大きいかどうかを確認します。ただし、すでにTest-Pathを使用していた前のブロックのように、ブール値を返すコマンドを使用している場合は、これは不要です。数値がゼロでないかどうかを確認するためだけにテストを行っているときに、このような場合にそれをせずに行うこともできます。ゼロ以外の数(正または負)はtrueとして扱われますが、ゼロ(または、ここで発生する可能性があるように存在しない変数)はfalseとして扱われます。.
$ MissingFilesが存在し、それがゼロでない場合、Write-Hostは、いくつのファイルが欠けていたか、そしてスクリプトが中止されることを知らせるメッセージを投稿します。その後、Remove-Variableは作成したすべての変数をクリーンアップし、Exitはスクリプトを終了します。通常のPowerShellコンソールでは、スクリプトによって設定された変数は通常スクリプトの終了時に破棄されるため、Remove-Variableはこの特定の目的には実際には必要ありません。ただし、PowerShell ISEの動作は多少異なるため、そこからスクリプトを実行する予定がある場合は、このままにしておくことをお勧めします。.
すべてが順調であれば、スクリプトは続行します。もう1つ準備を整えておくと、後で別名を付けることができて嬉しいです.
New-AliasとGet-Random
別名は、コマンドの代替名を作成するために使用されます。これらは、私たちが新しいインターフェースに慣れるのを手助けするのに役立ちます(例:PowerShellには次のようなエイリアスが組み込まれています)。 ディレクトリ - > Get-ChildItem そして cat - >コンテンツ取得または一般的に使用されるコマンドの簡単な参照をするために。ここでは、 非常に の簡単な説明 ランダム取得 後でもっとよく使われるコマンド.
Get-Randomは、その名前が意味することとほぼ同じです。 (名前のリストのような)配列を入力として指定すると、配列からランダムな項目を選び、それを吐き出します。乱数を生成するためにも使用できます。ただし、Get-Randomと数値について覚えておくべきことは、他の多くのコンピュータ操作と同様に、ゼロから数えることです。だから代わりに ランダム取得10 「1から10までの数字を私に与える」というより自然な意味は、「0から9までの数字を私に与える」ということです。Get-Randomの動作がより自然になります。期待していますが、このスクリプトでは必要ありません。.
パート2:ユーザー入力を取得して仕事を始める
ランダムな名前と電話番号を1つだけ生成するスクリプトが優れていますが、ユーザーが1つのバッチに含める名前と番号の数をユーザーが指定できるようにした方がはるかに優れています。残念ながら、私たちは常に有効な入力を与えることをユーザーに信頼することはできません。だから、これだけではなく、もう少しだけ $ UserInput =読み取りホスト.
while(!$ ValidInput)try [int] $ UserInput =読み取りホスト-Prompt '生成されるアイテム' $ ValidInput = $ true catch 書き込みホスト '無効な入力です。数字のみを入力してください。 -ForegroundColorレッド
上記のwhileステートメントは、$ ValidInputの値を確認して否定します。 $ ValidInputがfalseであるか存在しない限り、スクリプトブロックをループし続けます。.
tryステートメントはRead-Hostを介してユーザー入力を受け取り、それを整数値に変換しようとします。 (それは [int] 成功した場合は、whileループを終了できるように$ ValidInputをtrueに設定します。成功しなかった場合、catchブロックはエラーを通知し、$ ValidInputが設定されなかったため、whileループが戻ってきてユーザーに再度プロンプトを表示します。.
ユーザーが入力として適切に番号を与えたら、スクリプトが実際に仕事を始めようとしていることを発表して、それからそれをやり遂げることを望みます.
Write-Host "'n $ UserInputの名前と電話番号を作成しています。しばらくお待ちください。1 ... $ UserInput | ForEachオブジェクト
心配しないでください、私たちはランダムな名前と番号ジェネレータコードを理解するためにあなた自身をあなたに任せるつもりはありません。これは、次のセクション(実際の作業が行われる場所)が収まる場所を示すための単なるプレースホルダーコメントです。.
Write-Host行は非常に簡単です。それは単に、スクリプトが生成しようとしている名前と電話番号の数を言い、スクリプトがその仕事をしている間、忍耐強く待つようにユーザーに要求します。の'n 文字列の最初と最後には、その出力の前後に空白行を挿入することです。入力行と名前と番号のリストを視覚的に区別するためです。これはバックティック(通常、タブの上の1の左側にあるキー)であり、それぞれの前にあるアポストロフィや一重引用符ではありません。 n.
次の部分では、ForEach-Objectループのさまざまな使用方法を示します。通常、スクリプトブロックを一定回数実行する場合は、通常のforループを設定します。 ($ x = 1; $ x -le $ UserInput; $ x ++)の場合. ForEach-Objectでは、整数のリストを渡すことでこれを簡単にすることができます。実際にこれらの整数で何かをするように指示するのではなく、整数でなくなるまで実行する静的スクリプトブロックを渡します。.
パート3:ランダムな名前の生成
名前を生成することは、このプロセスの残りの部分の最も簡単な部分です。それは3つのステップで構成されています:姓を選ぶ、性別を選ぶ、そして名を選ぶ。しばらく前にGet-Random用に作成したエイリアスを覚えていますか。それを使い始める時間.
$ Surname = Get-Content "$ ScriptFolder \ Surnames.txt" | g $ Male = g 2 if($ Male)$ FirstName = Get-Content "$ ScriptFolder \ Males.txt" | else $ FirstName = Get-Content "$ ScriptFolder \ Females.txt" | g
最初の行は私たちの姓のリストを受け取り、それをランダムピッカーにフィードし、そして選択された名前を$ Surnameに割り当てます。.
2行目は、私たちの性別を選びます。 Get-Randomがゼロからカウントを開始する方法、およびゼロが偽で他のすべてが真であることを覚えていますか?それが私たちが使っている方法です ランダム取得2 (またははるかに短い g 2 私たちの別名のおかげで - 両方とも私たちの人が男性であるかどうかを決めるために0か1の間の選択をもたらします。その後のif / else文は、それに応じて男性または女性のファーストネームをランダムに選択します。.
パート4:ランダムな電話番号の生成
これは本当に楽しい部分です。先ほど、無効または架空の電話番号を作成する方法がいくつかあることを説明しました。私たちはすべての私たちの数字がお互いにあまりにも似ているように見たくないので、私たちは毎回ランダムに無効な数字フォーマットを選びます。ランダムに選択されたフォーマットは、市外局番と交換コードによって定義され、これらはまとめて$ Prefixとして格納されます。.
$ NumberFormat = g 5スイッチ($ NumberFormat)0 $プレフィックス= "($(g 2)$(g 10)$(g 10))$(g 10)$(g 10)$(g 10)" 1 $プレフィックス= "($(g 10)9 $(g 10))$(g 10)$(g 10)$(g 10)" 2 $プレフィックス= "($(g 10)$ (g 10)$(g 10))$(g 2)$(g 10)$(g 10) " 3 $ Prefix ="($(g 10)$(g 10)$(g 10)) $(g 10)11 " 4 $接頭辞="($(g 10)$(g 10)$(g 10))555 "
最初の行は、電話番号のフォーマットを選択するための簡単な乱数生成です。次に、switchステートメントはそのランダムな選択を取り、それに応じて$ Prefixを生成します。無効な電話番号タイプのリストを覚えていますか? $ NumberFormatの値0〜3は、そのリストの最初の4つに対応しています。両方とも「555」の交換コードを使用するため、値4は最後の2つのうちの1つを生成できます。.
ここで、二重引用符を使った別のトリックを使用していることもわかります。二重引用符は、文字列が出力される前に変数を解釈させるだけではなく、スクリプトブロックを処理することもできます。そのためには、スクリプトブロックを次のようにラップします。 “ $()”. それで、あなたが上に持っているものはそれらの範囲で制限されているか、または我々が従う必要がある規則に従って静的にセットされているそれらのいくつかで、個々にランダム化された数字のたくさんです。市外局番と市外局番のペアに通常表示されるはずの、各文字列にも括弧とスペースがあります。.
名前と電話番号を出力する準備が整う前にする必要がある最後のことは、$ Suffixとして格納されるSubscriber IDを生成することです。.
switch($ NumberFormat)$ _ -lt 4 $サフィックス= "$(g 10)$(g 10)$(g 10)$(g 10)" 4 switch($プレフィックス)'( 800)555 '$サフィックス=' 0199 'デフォルト$サフィックス= "01 $(g 10)$(g 10)"
555の番号に対する特別な規則のため、スクリプトが作成しようとしているすべての電話番号の終わりに4つのランダムな数字を生成することはできません。そのため、最初のスイッチは、555という数字を扱っているかどうかを確認します。そうでなければ、それは4つのランダムな数字を生成します。それが555番号である場合、2番目のスイッチは800市外局番をチェックします。それが一致すれば、使用できる有効な$ Suffixは1つだけです。そうでなければ、それは0100-0199の間に何かから選ぶことが許可されています.
このブロックが書かれている可能性がある方法ではなく、いくつかの異なる方法があることに注意してください。両方のswitchステートメントは、それぞれ2つの選択肢しか処理しないため、if / elseステートメントに置き換えられた可能性があります。また、最初のswitchステートメントのオプションとして "4"を明示的に呼び出すのではなく、残りの唯一のオプションであるため、 "default"を2番目のオプションと同じように使用できます。 if / else vs. switchのどちらを選択するか、または特定の値の代わりにdefaultキーワードをどこに使用するかの選択は、多くの場合個人的な好みの問題に帰着します。それがうまくいく限り、あなたが最も快適なものは何でも使ってください.
それでは、出力の時間です.
書き出し "" $ FirstName $姓$プレフィックス - $サフィックス "
これは、スクリプトに入るのと同じくらい簡単です。名前と姓をスペースで区切って出力し、次に電話番号の前にスペースを1つ挿入します。 Exchange CodeとSubscriber IDの間の標準ダッシュも追加されます。.
一番下の閉じ括弧は、以前のForEach-Objectループの終わりです - すでに持っている場合は、これを省略してください。.
パート5:スクリプトのクリーンアップと実行
すべての作業が終わった後、良いスクリプトはそれ自身の後を片付ける方法を知っています。繰り返しますが、コンソールからスクリプトを実行するだけの場合は、以下の変数の削除は実際には必要ありませんが、ISEで実行する予定がある場合は必要です。.
アイテム削除エイリアス:\ g変数削除ScriptFolder、RequiredFiles、Surname、Male、FirstName、NumberFormat、プレフィックス、サフィックス、ValidInput、UserInput
すべて完了したら、スクリプトを名前ファイルと同じフォルダに「.ps1」という拡張子を付けて保存します。スクリプトが実行できるようにExecutionPolicyが設定されていることを確認し、それに旋風を吹き込みます。.
これが実行中のスクリプトのスクリーンショットです。
下のリンクから、このPowerShellスクリプトを含むZIPファイルと名前リストを含むテキストファイルをダウンロードすることもできます。.
PowerShell用のランダムな名前と電話番号ジェネレータ