홈페이지 » 어떻게 » PowerShell을 사용하여 임의의 이름과 전화 번호를 생성하는 방법

    PowerShell을 사용하여 임의의 이름과 전화 번호를 생성하는 방법

    테스트 또는 데모 용 데이터 세트가 필요하고 해당 세트가 개인 식별 정보 (PII)를 나타내야 할 경우 일반적으로 실제 인물을 나타내는 실제 데이터를 사용하고 싶지 않습니다. 여기서는 PowerShell을 사용하여 그러한 경우에 대한 임의의 이름과 전화 번호 목록을 생성하는 방법을 설명합니다.

    필요한 것

    시작하기 전에 필요한 도구와 정보가 있습니다.

    PowerShell

    이 스크립트는 PowerShell 4.0을 사용하여 개발되었으며 PowerShell 2.0과의 호환성 테스트를 마쳤습니다. PowerShell 2.0 이상은 Windows 7부터 Windows에 내장되어 있습니다. WMF (Windows Management Framework)의 일부인 Windows XP 및 Vista에서도 사용할 수 있습니다. 추가 세부 정보 및 다운로드 링크는 아래에 있습니다..

    • PowerShell 2.0은 Windows 7과 함께 제공됩니다. Windows XP 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 초가 걸리지 만 자신의 시스템 사양에 따라 마일리지가 달라질 수 있습니다.

    • 남자 이름
    • 여성 이름

    사용하는 소스에 관계없이 스크립트가 이름 선택을 위해 풀로 사용할 수있는 세 개의 텍스트 파일을 생성해야합니다. 각 파일은 이름 만 포함하고 한 줄에 하나의 이름 만 포함해야합니다. PowerShell 스크립트와 동일한 폴더에 저장해야합니다..

    Surnames.txt 스크립트에서 선택할 성을 포함해야합니다. 예:

    스미스 존슨 윌리엄스 존스 브라운

    Males.txt 스크립트에서 선택할 남성 이름을 포함해야합니다. 예:

    제임스 존 로버트 마이클 윌리엄

    Females.txt 스크립트에서 선택할 여성 이름을 포함해야합니다. 예:

    메리 패트리샤 린다 바바라 엘리자베스

    전화 번호 규칙

    전화 번호가 다른 사람의 실제 전화 번호와 일치하지 않도록하려면 가장 쉬운 방법은 잘 알려진 "555"교환 코드를 사용하는 것입니다. 그러나 전화 번호가 많은 데이터 세트를 보여줄 예정이라면 555는 매우 단조롭고 빠르게 보일 것입니다. 더 재미있는 일을하기 위해 북미 번호 계획 (NANP) 규칙을 위반하는 다른 전화 번호를 생성합니다. 다음은이 스크립트에서 생성되는 각 클래스의 클래스를 나타내는 잘못된 전화 번호 샘플입니다.

    • (157) 836-8167
      지역 번호는 1 또는 0으로 시작할 수 없으므로이 번호는 유효하지 않습니다..
    • (298) 731-6185
      NANP가 지역 코드에 9를 두 번째 숫자로 할당하지 않기 때문에이 번호는 유효하지 않습니다..
    • (678) 035-7598
      교환 번호는 1 또는 0으로 시작할 수 없으므로이 번호는 유효하지 않습니다..
    • (752) 811-1375
      Exchange 코드는 두 개의 1로 끝날 수 없으므로이 번호는 유효하지 않습니다..
    • (265) 555-0128
      Exchange 코드가 555이므로이 번호는 유효하지 않습니다., 구독자 ID가 가상 번호 용으로 예약 된 범위 내에 있습니다..
    • (800) 555-0199
      이 번호는 가상 번호로 사용하도록 예약 된 555 Exchange 코드가있는 유일한 800 번호입니다..

    위의 규칙은 변경 될 수 있으며 관할 지역에 따라 다를 수 있습니다. 전화 번호를 생성 할 로케일에 적용 가능한 현재 규칙을 확인하기 위해 자체 조사를 수행해야합니다..

    일반적인 명령

    이 스크립트에서 사용되는 몇 가지 일반적인 명령이 있으므로 실제로 작성하기 전에 이러한 의미가 무엇인지에 대한 기본적인 아이디어를 얻어야합니다.

    • ForEach-Object 객체의 배열 또는 목록을 취하여 각각에 지정된 작업을 수행합니다. ForEach-Object 스크립트 블록 내에서 $ _ 변수는 처리중인 현재 항목을 나타내는 데 사용됩니다.
    • 다른 경우라면 명령문을 사용하면 특정 조건이 충족 될 때만 작업을 수행 할 수 있으며 (선택 사항) 해당 조건이 충족되지 않을 때 수행 할 작업을 지정할 수 있습니다..
    • 스위치 명령문은 더 많은 선택 사항이있는 명령문과 같습니다. 스위치는 여러 조건에 대해 개체를 검사하고 개체가 일치하는 조건에 지정된 스크립트 블록을 실행합니다. 다른 조건이 일치하지 않는 경우에만 실행될 기본 블록을 선택적으로 지정할 수도 있습니다. 또한 switch 문은 $ _ 변수를 사용하여 현재 처리중인 항목을 참조합니다..
    • 동안 명령문을 사용하면 특정 조건이 충족되는 한 스크립트 블록을 계속 반복 할 수 있습니다. 스크립트 블록이 끝났을 때 조건이 더 이상 참이되지 않게되면 루프가 종료됩니다..
    • 시도하다. 잡다. 문은 오류 처리에 도움이됩니다. try에 지정된 스크립트 블록에 문제가 발생하면 catch 블록이 실행됩니다..
    • Get-Content 주석에 쓰여있는대로 해. 지정된 객체 (일반적으로 파일)의 내용을 가져옵니다. 이것은 콘솔에서 텍스트 파일의 내용을 표시하거나이 스크립트에서와 같이 파이프 라인을 따라 내용을 전달하여 다른 명령과 함께 사용할 수 있습니다.
    • 호스트 쓰기 콘솔에 물건을 넣습니다. 이 메시지는 사용자에게 메시지를 표시하는 데 사용되며 출력이 리디렉션되는 경우 스크립트의 출력에 포함되지 않습니다..
    • 쓰기 출력 실제로 출력을 생성합니다. 일반적으로 콘솔에 덤프되지만 다른 명령으로 리디렉션 될 수도 있습니다.

    스크립트에는 다른 명령이 있지만 설명대로 설명하겠습니다..

    스크립트 작성

    이제 손을 더럽힐 시간입니다..

    1 부 : 준비하기

    스크립트가 깨끗한 콘솔에서 실행되기를 원하면 여기에 원하는 첫 번째 줄이 있습니다..

    호스트 지우기

    이제는 깨끗한 화면이 나오기 때문에 다음으로해야 할 일은 필요로하는 모든 것이 제대로되었는지 확인하기위한 스크립트 검사입니다. 그렇게하기 위해서, 우리는 어디를보아야하는지, 그리고 무엇을 찾을지를 말함으로써 시작해야합니다..

    $ ScriptFolder = 분할 경로 $ MyInvocation.MyCommand.Definition -Parent $ RequiredFiles = ( 'Males.txt', 'Females.txt', 'Surnames.txt')

    첫 번째 줄은 모든 스크립트에 매우 유용합니다. 스크립트가 들어있는 폴더를 가리키는 변수를 정의합니다. 스크립트가 다른 디렉토리에있을 때 스크립트를 실행하려고하면 오류가 발생하기 때문에 스크립트가 그 자신과 동일한 디렉토리 (또는 해당 디렉토리의 알려진 상대 경로)에있는 다른 파일을 필요로하는 경우 필수적입니다 작업 디렉토리.

    두 번째 줄은 스크립트가 제대로 실행되는 데 필요한 파일 이름 배열을 만듭니다. $ ScriptFolder 변수와 함께이 파일을 사용하여 다음 파일에 있는지 확인합니다..

    $ RequiredFiles | ForEach-Object if (! (Test-Path "$ ScriptFolder \ $ _")) Write-Host "$ _ not found." -ForegroundColor 빨강 $ MissingFiles ++

    이 스크립트는 $ RequiredFiles 배열을 ForEach-Object 블록으로 보냅니다. 해당 스크립트 블록 내에서 if 문은 Test-Path를 사용하여 찾고있는 파일이 속한 곳인지 확인합니다. Test-Path는 파일 경로가 주어지면 기본 true 또는 false 응답을 반환하는 간단한 명령으로, 경로가 존재하는 경로를 가리키는 지 알려줍니다. 거기에있는 느낌표는 아니 연산자는 Test-Path의 응답을 if 문으로 전달하기 전에 역순으로 처리합니다. 따라서 Test-Path가 false를 반환하면 (즉, 찾고있는 파일이 존재하지 않음) if 문이 스크립트 블록을 실행할 수 있도록 true로 변환됩니다.

    이 스크립트에서 자주 사용되는 여기에서 주목할 또 하나의 점은 작은 따옴표 대신 큰 따옴표를 사용하는 것입니다. 작은 따옴표를 사용하면 PowerShell에서이를 정적 문자열로 처리합니다. 작은 따옴표 안에있는 것은 무엇이든간에 그대로 전달됩니다. 큰 따옴표는 PowerShell이 ​​변수와 문자열을 전달하기 전에 문자열 내의 일부 다른 특수 항목을 변환하도록 지시합니다. 여기에 큰 따옴표는 달리기 대신에 Test-Path '$ ScriptFolder \ $ _'  우리는 실제로 더 많은 것을 할 것입니다. Test-Path '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가 0보다 큰지 확인하십시오. 그러나, 당신이 이미 부울 값을 반환하는 명령을 사용하고 있다면 (이전에 우리가 Test-Path를 사용했던 곳에서와 같이) 필요하지 않습니다. 숫자가 0이 아닌지 확인하기 위해 테스트하는 경우에도 이와 같은 경우에 없어도됩니다. 0이 아닌 숫자 (양수 또는 음수)는 true로 처리되고, 0 (또는 존재하지 않는 변수 일 수 있음)은 false로 처리됩니다..

    $ MissingFiles가 있고 0이 아닌 경우 Write-Host는 누락 된 파일 수와 스크립트가 중단된다는 메시지를 게시합니다. 그런 다음 Remove-Variable은 생성 한 모든 변수를 정리하고 Exit는 스크립트를 종료합니다. 일반 PowerShell 콘솔에서 스크립트가 설정 한 변수는 일반적으로 스크립트가 종료 될 때 삭제되기 때문에 Remove-Variable은이 특정 목적에 실제로 필요하지 않습니다. 그러나 PowerShell ISE는 조금 다르게 동작하므로 여기에서 스크립트를 실행할 계획이라면이 정보를 유지해야합니다..

    모든 것이 정돈되면 스크립트가 계속됩니다. 한 가지 더 준비 할 사항은 나중에 우리가 가질 수있는 별칭입니다..

    New-Alias ​​g Get-Random

    별칭은 명령의 대체 이름을 만드는 데 사용됩니다. 이는 새로운 인터페이스에 익숙해지는 데 도움이 될 수 있습니다 (예 : PowerShell에는 다음과 같은 별칭이 내장되어 있습니다. dir -> Get-ChildItem 고양이 -> Get-Content) 또는 일반적으로 사용되는 명령에 대한 간략 참조를 만들 수 있습니다. 여기, 우리는 대단히 짧은 참조 겟 - 랜덤 나중에 많이 사용될 명령.

    Get-Random은 그 이름이 암시하는 바를 거의 수행합니다. 입력으로 배열 (이름 목록과 같은)이 주어지면, 배열에서 임의의 항목을 선택하고 그것을 밖으로 내뱉습니다. 또한 난수를 생성하는 데 사용할 수 있습니다. Get-Random과 숫자에 대해 기억해야 할 점은 다른 많은 컴퓨터 작업과 마찬가지로 0부터 세는 것입니다. 그래서 대신 무작위 추출 10 보다 자연스러운 "1부터 10까지의 숫자를 부여하십시오."는 의미는 "0에서 9까지의 숫자를 알려주십시오"라는 뜻입니다. 숫자 선택에 대해 더 구체적으로 지정할 수 있으므로 Get-Random은 자연스럽게 기대하지만, 우리는이 대본에서 그것을 필요로하지 않을 것이다..

    2 부 : 사용자 입력 및 작업 시작

    임의의 이름과 전화 번호를 생성하는 스크립트는 훌륭하지만, 사용자가 하나의 배치에서 몇 개의 이름과 번호를 지정하도록 허용하는 것이 훨씬 좋습니다. 불행히도 사용자가 항상 올바른 입력을 제공 할 수는 없습니다. 그래서, 이것보다 조금 더 많은 것이 있습니다. $ UserInput = 읽기 호스트.

    while (! $ ValidInput) try [int] $ UserInput = 읽기 호스트 -Prompt '생성 할 항목'$ ValidInput = $ true catch Write-Host '입력이 잘못되었습니다. 번호 만 입력하십시오. ' -ForegroundColor 빨간색

    위의 while 문은 $ ValidInput 값을 확인하고 무효화합니다. $ ValidInput이 false이거나 존재하지 않으면 스크립트 블록을 반복하여 루핑 할 것입니다.

    try 문은 Read-Host를 통해 사용자 입력을 받아 정수 값으로 변환하려고 시도합니다. (그것은 [int] Read-Host보다 먼저). 성공하면 while 루프가 종료 될 수 있도록 $ ValidInput을 true로 설정합니다. 성공하지 못하면 catch 블록은 오류를 게시하고 $ ValidInput이 설정되지 않았으므로 while 루프가 다시 돌아와 사용자에게 다시 묻습니다.

    일단 사용자가 입력으로 적절하게 번호를 부여하면 스크립트는 실제로 작업을 시작한 다음 스크립트를 실행하려고한다는 것을 알리고 싶습니다..

    Write-Host "n $ UserInput 이름과 전화 번호를 생성합니다. 기다려주십시오."1 "... $ UserInput | ForEach-Object 

    걱정하지 마세요. 임의의 이름 및 번호 생성기 코드를 알아내는 대신에 직접 해결하지 않을 것입니다. 이것은 다음 섹션 (실제 작업이 완료되는 부분)이 어디에 맞게 표시되는지 보여주는 자리 표시 자입니다..

    Write-Host 라인은 매우 간단합니다. 스크립트가 생성 할 이름과 전화 번호가 몇 개인 지 알려주고 스크립트가 작업을 수행하는 동안 사용자에게 인내심을 갖도록 요청합니다. 그만큼'엔 문자열의 시작과 끝은 입력 라인과 이름과 숫자의 목록을 시각적으로 구분하기 위해 출력 전후에 공백 행을 삽입하는 것입니다. 그것이 다시 눈금 (일명 "악센트 부호"- 일반적으로 탭 위의 키, 1의 왼쪽)이며 아포스트로피 또는 각각의 앞에 작은 따옴표가 아닙니다. .

    다음 부분에서는 ForEach-Object 루프를 사용할 수있는 다른 방법을 보여줍니다. 일반적으로 스크립트 블록을 특정 횟수만큼 실행하려면 일반 for 루프를 다음과 같이 설정해야합니다. for ($ x = 1; $ x -le $ UserInput; $ x ++) . ForEach-Object를 사용하면 정수 목록을 제공하여이 작업을 단순화 할 수 있으며 정수로 실제로 수행하도록 지시하는 대신 정수 대신 정수가 없을 때까지 실행할 정적 스크립트 블록을 제공합니다.

    3 부 : 임의의 이름 생성

    이름을 생성하는 것은이 프로세스의 나머지 부분 중 가장 간단한 비트입니다. 성을 선택하고, 성을 선택하고, 이름을 선택하는 3 단계로 구성됩니다. 우리는 Get-Random을 위해 만든 별칭을 기억하고 있습니까? 사용하기 시작하는 시간.

        $ 성 = 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"| 지

    첫 번째 행은 성 목록을 가져 와서 무작위 선택기로 보내고 선택한 이름을 $ Surname에 할당합니다..

    두 번째 줄은 우리의 성별을 선택합니다. Get-Random이 0부터 세는 방법과 0이 false이고 그 외 모든 것이 참인 방법을 기억하십니까? 그것이 우리가 사용하는 방법입니다. Get-Random 2 (또는 훨씬 더 짧은 g 2 우리의 별명 덕분에 - 우리는 사람이 남성인지 아닌지를 결정하기 위해 0과 1 중 하나를 선택하게됩니다). 이후 if / else 문은 임의로 남성 또는 여성 이름을 무작위로 선택합니다..

    4 부 : 임의 전화 번호 생성

    여기 재미있는 부분이 있습니다. 앞서, 우리는 잘못된 또는 가상의 전화 번호를 만들 수있는 몇 가지 방법이있는 방법을 보여주었습니다. 숫자가 너무 비슷해 보이기를 원하지 않으므로 매번 유효하지 않은 숫자 형식을 무작위로 선택합니다. 무작위로 선택한 형식은 해당 지역 번호 및 Exchange 코드로 정의되며, 총괄하여 $ Prefix.

        $ NumberFormat = g 5 스위치 ($ NumberFormat) 0 $ 접두사 = "($ 10) $ (g 10)) $ (g 10) $ (g 10) $ (g 10)"  1 $ 접두어 = "($ 10) 9 $ (g 10) $ (g 10) $ (g 10)" 2 ($ 10) $ (g 10) $ (g 10) $ (g 10) $ (g 10) $ (g 10) 11 " 4 $ 접두사 ="($ 10) $ (g 10)) 555 "

    첫 번째 줄은 전화 번호에 따라 어떤 형식을 사용할지 선택하는 간단한 난수 생성입니다. 그런 다음 switch 문은 임의의 선택을 취하여 그에 따라 $ Prefix를 생성합니다. 잘못된 전화 번호 유형 목록을 기억하십니까? $ NumberFormat 값 0-3은 해당 목록의 처음 네 개에 해당합니다. 값 4는 "555"교환 코드를 사용하기 때문에 마지막 두 개 중 하나를 생성 할 수 있습니다..

    여기서도 큰 따옴표를 사용하여 다른 트릭을 사용하는 것을 볼 수 있습니다. 큰 따옴표는 문자열이 출력되기 전에 변수를 해석하도록 허용하지 않으며 스크립트 블록을 처리 할 수도 있습니다. 그렇게하기 위해 다음과 같이 스크립트 블록을 래핑합니다. '$ ()'. 그래서 위에있는 것은 개별적으로 무작위로 추출 된 숫자입니다. 일부는 범위가 제한되거나 따라야하는 규칙에 따라 정적으로 설정됩니다. 각 문자열에는 괄호와 공백이 있으며 일반적으로 지역 코드와 Exchange 코드 쌍에서 볼 수 있습니다..

    이름과 전화 번호를 출력 할 준비가되기 전에 마지막으로해야 할 일은 가입자 ID를 생성하는 것입니다.이 ID는 $ 접미어로 저장됩니다.

        4 switch ($ Prefix)  '($ 10) $ (g 10) $ (g 10) " switch ($ NumberFormat)  800) 555 '$ Suffix ='0199 ' 기본값 $ Suffix = "01 $ (g 10) $ (g 10)"

    555 숫자에 대한 특별한 규칙 때문에, 우리 스크립트가 만들려고하는 모든 전화 번호의 마지막에 4 개의 임의의 숫자를 생성 할 수는 없습니다. 따라서 첫 번째 스위치는 555 번호를 처리하는지 확인합니다. 그렇지 않은 경우 네 개의 임의의 숫자가 생성됩니다. 555 번호 인 경우 두 번째 스위치는 800 개의 지역 코드를 확인합니다. 일치하는 경우 사용할 수있는 유효한 $ 접미어가 하나뿐입니다. 그렇지 않으면 0100-0199 사이의 항목을 선택할 수 있습니다..

    이 블록이 작성된 방식 대신에 몇 가지 다른 방법으로 작성 될 수 있습니다. 두 switch 문은 if / else 문으로 대체 될 수 있습니다. 각 문은 두 가지 선택 만 처리하기 때문입니다. 또한 첫 번째 switch 문에 대한 옵션으로 "4"를 명시 적으로 호출하는 대신 왼쪽 옵션 만 남았으므로 두 번째 명령문에서 수행 된 것과 비슷한 "default"를 사용할 수있었습니다. if / else vs. switch 또는 특정 값 대신 기본 키워드를 사용하는 위치 사이의 선택은 종종 개인적인 취향에 달려 있습니다. 작동하는 한 가장 안락한 것을 사용하십시오..

    이제 출력을위한 시간입니다..

        Write-Output "$ FirstName $ Surname $ Prefix- $ Suffix"

    이 스크립트는 스크립트 에서처럼 간단합니다. 공백으로 구분 된 이름과 성을 출력하고 전화 번호 앞에 다른 공백을 출력합니다. Exchange 코드와 구독자 ID 사이의 표준 대시가 추가되는 위치는 다음과 같습니다.

    아래쪽에있는 닫는 괄호는 이전의 ForEach-Object 루프의 끝입니다. 이미 가지고있는 경우 생략하십시오..

    5 부 : 스크립트 정리 및 실행

    모든 작업이 완료된 후에 좋은 스크립트는 자체적으로 정리하는 방법을 알고 있습니다. 다시 말하지만, 콘솔에서 스크립트를 실행하려는 경우 아래의 변수 제거가 실제로 필요하지 않지만 ISE에서 스크립트를 실행할 계획이라면 필요합니다..

    Remove-Item 별칭 : \ g Remove-Variable ScriptFolder, RequiredFiles, Surname, Male, FirstName, NumberFormat, Prefix, Suffix, ValidInput, UserInput

    모든 작업을 마친 후에는 이름 파일과 동일한 폴더에 ".ps1"확장명으로 스크립트를 저장하십시오. 스크립트가 실행될 수 있도록 ExecutionPolicy가 설정되어 있는지 확인하고 그 스크립트에 소용돌이.

    다음은 실제 스크립트의 스크린 샷입니다.

    PowerShell 스크립트가 포함 된 ZIP 파일과 이름 목록이있는 텍스트 파일을 아래 링크에서 다운로드 할 수도 있습니다.

    PowerShell 용 임의 이름 및 전화 번호 생성기