10Sep
Test veya gösteri için bir veri setine ihtiyaç duyduğunuzda ve bu setin Kişisel Olarak Belirlenen Bilgileri( PII) temsil etmesi gerekiyorsa, genellikle gerçek insanları temsil eden gerçek verileri kullanmak istemezsiniz. Burada, böyle bir vesileyle rastgele isimlerin ve telefon numaralarının bir listesini oluşturmak için PowerShell'i nasıl kullanabileceğinizle ilgili olarak size yol göstereceğiz.
İhtiyacınız Olanlar
Başlamadan önce, bazı araçlara ve sahip olmanız gereken bilgileri bulacaksınız:
PowerShell
Bu betik, PowerShell 4.0 kullanılarak geliştirilmiştir ve ayrıca PowerShell 2.0 ile uyumluluk açısından test edilmiştir. PowerShell 2.0 veya üstü, Windows 7'den bu yana Windows'a dahili olarak kurulmuştur. Windows Yönetim Çerçevesinin( WMF) bir parçası olarak Windows XP ve Vista için de mevcuttur. Aşağıda bazı ayrıntılı bilgiler ve indirilen dosyalar bulunmaktadır.
- PowerShell 2.0, Windows 7 ile birlikte verilir. Windows XP SP3 ve Vista( SP1 veya sonraki sürümü) kullanıcıları KB968929'da Microsoft'tan uygun WMF sürümünü indirebilir. XP SP2 veya altı veya SP1'i olmayan Vista'da desteklenmez.
- PowerShell 4.0, Windows 8.1 ile birlikte gelir. Windows 7 SP1 kullanıcıları, WMF güncelleştirmesinin bir parçası olarak Microsoft Yükleme Merkezi'nden yükseltebilirler. XP veya Vista için mevcut değildir.
isimleri
Rasgele üreticiye gönderilecek bazı isim listelerine ihtiyacınız olacak. adlarının bir lotu için büyük bir kaynağı ve popülaritesi ile ilgili bilgiler( ancak bu betik için kullanılamayacak), Birleşik Devletler Sayım Bürosu'dur. Aşağıdaki bağlantılardaki listeler çok geniştir; bu nedenle, bir kerede çok sayıda isim ve numara üretmeyi planlıyorsanız, onları biraz düzeltmek isteyebilirsiniz. Test sistemimizde her isim / numara çifti, tam listeleri kullanarak üretmek için yaklaşık 1,5 saniye sürdü, ancak kilometreğiniz kendi sistem spesifikasyonlarınıza bağlı olarak değişecektir.
- Soyadı
- Erkek Adları
- İlk Soyadları
Kullandığınız kaynak ne olursa olsun, komut dosyasının adını seçmek için havuzlar olarak kullanabileceği üç metin dosyası oluşturmanız gerekecektir. Her dosyada yalnızca adlar bulunmalı ve her satıra yalnızca bir isim verilmelidir. Bunların PowerShell komut dosyanızla aynı klasöre depolanması gerekir.
Surnames.txt , komut dosyasının seçilmesini istediğiniz soyadları içermelidir.Örnek:
Smith Johnson Williams Jones BrownMales.txt , komut dosyasının seçilmesini istediğiniz erkek ilk adlarını içermelidir.Örnek:
James John Robert Michael WilliamFemales.txt , komut dosyasının seçilmesini istediğiniz dişi ilk adları içermelidir.Örnek:
Mary Patricia Linda Barbara ElizabethTelefon Numaraları Kuralları
Telefon numaranızın gerçek bir telefon numarasıyla eşleşmediğinden emin olmak istiyorsanız, en kolay yol bilinen "555" Değişim Kodu'nu kullanmaktır. Ancak, çok sayıda telefon numarasına sahip bir veri seti gösteriyorsanız, 555 oldukça hızlı monoton görünmeye başlayacaktır.İşleri daha ilginç kılmak için Kuzey Amerika Numaralandırma Planı( NANP) kurallarını ihlal eden başka telefon numaraları üretiriz. Aşağıda, bu komut dosyası tarafından üretilecek her sınıf sınıfını temsil eden bazı geçersiz telefon numaraları verilmektedir:
- ( 157) 836-8167
Alan Kodları 1 veya 0 ile başlayamadığı için bu numara geçersizdir - ( 298) 731-6185
Bu numara geçersiz çünkü NANP 9 ile ikinci haneli alan kodları atamıyor. - ( 678) 035-7598
Bu numara, Exchange Kodları 1 veya 0 ile başlayamadığı için geçersiz. - ( 752) 811-1375
Bu numara geçersiz çünkü Exchange Kodları iki 1 ile bitemez. - ( 265) 555-0128
Bu numara, Exchange Kodu 555, ve olduğu için geçersizdir; Abone Kimliği, hayali numaralar için ayrılmış aralıktadır. - ( 800) 555-0199
Bu numara, hayali bir numara olarak kullanılmak üzere ayrılmış olan 555 Değiştirme Kodlu yalnızca 800 numaradır.
Yukarıdaki kuralların değiştirilebileceğini ve yargı yetkisine göre değişiklik gösterebileceğini unutmayın. Telefon numaralarını üreteceğiniz yerel ayar için geçerli geçerli kuralları doğrulamak için kendi araştırmanızı yapmanız gerekir.
Ortak Komutları
Bu betik boyunca kullanılacak oldukça yaygın komutlar var, bu yüzden bunu yazarken içine girmeden önce bunun anlamı hakkında temel bir fikir edinmelisiniz.
- ForEach-Nesne nesnelerin bir dizisini veya listesini alır ve her biri üzerinde belirtilen işlemi gerçekleştirir. Bir ForEach-Nesne komut dosyası bloğunda, $ _ değişkeni işlenmekte olan geçerli öğeye işaret etmek için kullanılır.
- if. .. else ifadeleri, yalnızca belirli koşullar yerine getirildiğinde bir işlemi gerçekleştirmenize izin verir ve( isteğe bağlı olarak) bu koşul karşılanmadığında yapılması gerekenleri belirtmenizi sağlar.
- anahtarı deyimleri, eğer daha fazla seçeneğe sahip if ifadeleriyse gibidir. Switch bir nesneyi çeşitli koşullara karşı kontrol eder ve nesnenin eşleştiği koşullar için belirtilen komut bloklarının çalıştırılmasını sağlar.İsteğe bağlı olarak, yalnızca başka bir koşul eşleştirilmediğinde çalışacak bir varsayılan blok belirtebilirsiniz. Anahtar ifadeleri, işlenmekte olan geçerli öğeye işaret etmek için $ _ değişkenini de kullanır.
- ise ifadeleri belirli bir koşul sağlandığında komut dosyası bloğunu sürekli olarak tekrarlamanıza izin verir. Komut dosyası bloğu bittiğinde durumun artık doğru olmaymasına neden olan bir şey olduğunda, döngü sona erer.
- denemek. .. catch deyimleri hata işleme ile yardımcı olur. Denemek için belirtilen komut dosyası bloğu ile ilgili herhangi bir yanlışlık olursa, catch bloğu çalışacaktır.
- Get-Content teneke kutuda söyleneni yapar. Belirli bir nesnenin içeriğini alır - genellikle bir dosya. Bu, konsolda bir metin dosyasının içeriğini görüntülemek için kullanılabilir veya bu komut dosyasındaki gibi içeriği diğer komutlarla kullanılacak boru hattı boyunca iletir.
- Yazma-Ana Bilgisayar , konsolda bir şeyler koyar. Bu, iletileri kullanıcıya sunmak için kullanılır ve çıktı yönlendirilirse komut dosyasının çıktısına dahil edilmez.
- Yazma Çıktısı aslında çıktı üretir. Normalde, bu konsola boşaltılır ancak diğer komutlarla da yönlendirilebilir.
Senaryoda başka komutlar da var, fakat biz bunları ilerledikçe açıklayacağız.
Komut Dosyasını Oluşturma
Artık ellerimizi kirletmenin zamanı geldi.
Bölüm 1:
'ye Başlarken Başlangıç senaryosunu temiz bir konsoldan çalıştırmaya başlamak istersen, burada ilk satırını bulursun.
Clear-HostArtık temiz bir ekrana sahibiz, sonra yapmak istediğimiz şey, komut dosyasının gereken her şeyin yerinde olduğundan emin olmaktır. Bunu yapmak için, nereye bakacağını ve neye bakacağını söyleyerek başlamalıyız.
$ ScriptFolder = Ayrı Yol $ MyInvocation. MyCommand. Definition -Parent $ RequiredFiles =( 'Males.txt', 'Females.txt', 'Surnames.txt')İlk satır, herhangi bir komut dosyası için çok yararlıdır. Komut dosyasını içeren klasörü işaret eden bir değişkeni tanımlar. Senaryonuzun, kendisiyle aynı dizinde bulunan diğer dosyaları( veya bu dizinden gelen bilinen bir göreli yol) ihtiyacı varsa, bu, eğer başka bir yerde olduğunuzda senaryoyu çalıştırmayı denerseniz hatalarla karşılaşırsınız, çünkü bu çok önemlidir.çalışma dizini.
İkinci satır, komut dosyasının düzgün çalışması için gereken bir dizi dosya adı oluşturur. Bunu, $ ScriptFolder değişkeniyle birlikte, bu dosyaların mevcut olduğundan emin olduğumuz bir sonraki bölümde kullanacağız.
$ Gerekli Dosyalar |ForEach-Nesne{ if( !( Test Yolu "$ ScriptFolder \ $ _")){ Write-Host "$ _ Bulunamadı."-ForegroundColor Red $ MissingFiles ++}}Bu komut kütüğü, $ RequiredFiles dizisini bir ForEach-Nesne bloğuna gönderir. Bu komut dosyası bloğunda, if deyimi, aradığımız dosyanın ait olduğu yer olup olmadığını görmek için Test-Path'ı kullanır. Test-Path, bir dosya yolu verildiğinde, yolun var olan bir şeyle ilgili olup olmadığını bize bildirmek için basit veya yanlış bir yanıt döndüren basit bir komuttur.İçindeki ünlem işareti değil, operatörü olup, if ifadesine geçmeden önce Test-Path'ın yanıtını tersine çevirir. Test-Path false döndürürse( yani, aradığımız dosya yoksa), if deyiminin komut dosyası bloğunu yürütmesi için true olarak dönüştürülür.
Bu yazıda sıklıkla kullanılacak olan, dikkat edilmesi gereken bir diğer nokta da, tek tırnak işaretleri yerine çift tırnak işaretleri kullanılmasıdır. Tek tırnaklar içine bir şey koyduğunuzda, PowerShell onu statik bir dize olarak değerlendirir. Tek tırnak içindekiler aynen olduğu gibi aktarılır.Çift tırnak işaretleri, PowerShell'e, değişkenleri ve diğer bazı özel öğeleri dizede geçirmeden önce çevirmesini söyler. Burada, çift tırnak işaretleri, Test-Path '$ ScriptFolder \ $ _' 'yi çalıştırmak yerine Test-Path 'C: \ Scripts \ Surnames.txt' gibi bir şey yapacağız anlamına gelir.komut dosyası C: \ Scripts'de ve ForEach-Object şu anda 'Surnames.txt' üzerinde çalışıyor).
Bulunamayan her dosya için Write-Host, hangi dosyanın eksik olduğunu bildirmek için kırmızı bir hata mesajı gönderecektir. Ardından, bir sonraki parçada kullanılacak $ MissingFiles değişkenini artırır ve eksik olan dosyalar olursa hata yapar ve çıkar.
if( $ MissingFiles){ Write-Host "$ MissingFiles kaynak dosyası( ları) bulunamadı. Komut dosyası iptal edildi."-ForegroundColor Kırmızı Kaldır-Değişken ScriptFolder, RequiredFiles, Eksik Dosyalar Çıkmak}If ifadeleri ile yapabileceğiniz başka bir temiz hüner var. Tablolar size, eşleşen bir durumu kontrol etmek için bir operatör kullanmanızı söyleyecekse, göreceğiniz kılavuzların çoğunu.Örneğin, eğer burada $ MissingFiles'ın sıfırdan büyük olup olmadığını görmek için 'yi( $ MissingFiles -gt 0) kullanabilirsiniz. Bununla birlikte, zaten gerekli olmadığı bir boolean değerini döndüren komutları( Test-Yolunu kullandığımız önceki bloğdaki gibi) kullanıyorsanız. Ayrıca, böyle bir durumda, yalnızca bir sayının sıfır olup olmadığını test etmeye çalışırken, bunun olmadan da yapabilirsiniz. Sıfır olmayan herhangi bir sayı( pozitif veya negatif) sıfırdan( veya burada bulunmayan bir değişkene) false olarak değerlendirilir.
$ Eksik Dosyalar varsa ve sıfırdan farklıysa, Write-Host eksik dosyaları ve komut dosyasının iptal edileceğini bildiren bir mesaj gönderecektir. Ardından Remove-Variable, oluşturduğumuz tüm değişkenleri temizler ve Exit komut dosyasından çıkacaktır. Normal PowerShell konsolunda, Remove-Variable'ın bu özel amaç için gerçekten gerekli olmadığı, çünkü komut dosyası tarafından ayarlanan değişkenler, komut dosyası çıktığında normalde atılır. Bununla birlikte, PowerShell İMKB biraz farklı davranıyor, betiği oradan çalıştırmayı planlıyorsanız bunu saklamak isteyebilirsiniz.
Her şey yolundaysa, senaryo devam edecektir. Yapacak bir diğer hazırlık daha sonra sahip olmaktan mutluluk duyacağımız bir takma ad.
Yeni-Alias g Get-RandomAliases, komutlar için alternatif isimler oluşturmak için kullanılır. Bunlar, yeni arayüzle tanışmamıza yardımcı olmak için yararlı olabilir( örneğin, PowerShell, dir -> Get-ChildItem ve kedi -> Get-Content gibi dahili takma adlara sahiptir) veya kısa referanslar yapmak için kullanışlı olabilirSık kullanılan komutlar için. Burada, için Get-Random komutu için çok kısa bir süre önce kısaca referans yapıyoruz. Bu komut daha sonra kullanılacaktır.
Get-Random adından da anlaşılacağı gibi. Giriş olarak bir dizi( isimler listesi gibi) verilirse, diziden rasgele bir madde alır ve dışarı tükürür. Rasgele sayılar oluşturmak için de kullanılabilir. Get-Random ve sayılar hakkında hatırlanması gereken şey, diğer birçok bilgisayar işlemi gibi sıfırdan saymaya başlamasıdır. Bu nedenle, Get-Random 10 yerine "doğal olarak" 1'den 10'a bir sayı ver "anlamına gelir" gerçekten bana "0'dan 9'a bir sayı verin" anlamına gelir. Numara seçimi hakkında daha spesifik olabilir,-Random, doğal olarak beklediğiniz gibi daha fazla davranıyor, ancak bu betiğe ihtiyacımız yok.
Bölüm 2: Kullanıcı Girişi Almak ve İşe Almak İçin
Sadece bir rastgele isim &telefon numarası harika, çok daha iyi, senaryo kullanıcıya kaç tane isim & amp;numaralarını tek bir partide almak istiyorlar. Maalesef, kullanıcılara her zaman geçerli girdi vermesine güvenemiyoruz. Yani, sadece bunun için biraz daha fazla var $ UserInput = Read-Host .
while( ! $ ValidInput){ try{ [int] $ Kullanıcı Girişi = Oku Ana Bilgisayar -Prompt 'Oluşturulacak öğeler' $ ValidInput = $ true} catch{ Write-Host 'Geçersiz giriş.Yalnızca bir sayı girin. '-ForegroundColor Red}}Yukarıdaki while ifadesi, $ ValidInput değerini denetler ve reddeder.$ ValidInput yanlışsa veya mevcut değilse, komut dosyası bloğu boyunca döngüye devam edecektir.
try deyimi, Read-Host aracılığıyla kullanıcı girdisini alır ve onu bir tamsayı değerine dönüştürmeye çalışır.( [int] , Read-Host'dan önce.) Başarılıysa, while döngüsü çıkabilmek için $ ValidInput değerini true olarak ayarlar. Başarısız olursa catch bloğu bir hata mesajı gönderir ve $ ValidInput ayarlanmadığı için while döngüsü tekrar döner ve kullanıcıyı tekrar isteyecektir.
Kullanıcı girdi olarak doğru bir sayı verdikten sonra, komut dosyasının, aslında işini yapmaya başlayacağını ve ardından bunu gerçekleştirmek üzere olduğunu duyurmasını istiyoruz.
Write-Host "` n $ UserInput adlarını ve telefon numaralarını silin. Lütfen sabırlı olun. `N" 1. . $ UserInput |Her Yer İçin{ & lt; # RANDOM NAME & INSERTNUMER GENERATOR HERE # & gt;}Endişelenmeyin, rastgele adı & amp; amp; amp; amp; ı bulmak için sizi yalnız bırakmayacağız.sayı üreteci kodu. Bu, sonraki bölümün( gerçek işin nerede yapıldığı) uyum sağlayacağı yeri size göstermek için yalnızca bir yer tutucu yorumdur.
Yazma-Sunucusu satırı oldukça basittir. Yalnızca kaç tane ismin ve telefon numarasının üretileceğini söyler ve komut dosyası çalışırken kullanıcıdan sabırlı olmasını ister. Dizgenin başındaki ve sonundaki `n , çıktıdan önce ve sonra boş satır eklemeniz, sadece giriş satırıyla adlar & amp;sayılar. Bu, her n 'nin önünde bir kesme işareti veya tek tırnak işareti değil, geri onay işareti( AKA "mezar aksanı" - genelde 1'in solundaki sekme üstü tuşudur) olduğuna dikkat edin.
Sonraki bölüm, bir ForEach-Nesne döngüsü kullanmanın farklı bir yolunu göstermektedir. Normalde, komut dosyası bloğunun belirli bir sayıda çalıştırılmasını istediğinizde,( $ x = 1; $ x -le $ UserInput; $ x ++) için gibi düzenli bir döngü kurarsınız.{ & Lt; # INSERT SCRIPTBURAYA # & gt;}. ForEach-Object, onu bir tamsayı listesi besleyerek basitleştirmemize ve bunun yerine tamsayılarla bu tamsayılar yapmasını söylememize izin verir; bunun için tam sayıları dolana kadar çalışması için statik bir komut dosyası bloğu veririz.
Bölüm 3: Rastgele Bir İsim Yaratmak
Ad üretmek, bu işlemin geri kalanının en basit bitidir. Yalnızca üç adımdan oluşur: Soyadı seçme, toplumsal cinsiyet seçme ve ilk adı seçme. Get-Random için yaptığımız takma adı hatırlıyor musun? Kullanmaya başlama zamanı.
$ Soyadı = Get-Content "$ ScriptFolder \ Surnames.txt" |g $ Erkek = g 2 if( $ Erkek){ $ İlk Ad = Al İçeriği "$ ScriptFolder \ Males.txt" |g} başka{ $ İlkAdı = Alma İçeriği "$ ScriptFolder \ Females.txt" |g}İlk satır, soyad listemizi alır, rasgele seçiciye gönderir ve seçilen adı $ Soyadına atar.
İkinci satırda kişinin cinsiyeti belirlenir. Get-Random'ın sıfırdan saymaya nasıl başladığını ve sıfırın yanlış ve her şeyin doğru olduğunu hatırlıyor musun? Kişinin erkek olup olmadığına karar vermek için Get-Random 2 ( veya takma adımız sayesinde çok daha kısa g 2 - hem sıfır hem de bir seçenek arasında seçim yapılır) kullanıyoruz. If / else ifadesi daha sonra rastgele bir erkek veya kadın ilk adı seçer.
Bölüm 4: Rasgele Bir Telefon Numarası Yaratma
İşte gerçekten eğlenceli kısım. Daha önce, geçersiz veya hayali bir telefon numarası oluşturmanın çeşitli yollarının nasıl olduğunu size gösterdik. Tüm numaralarımız birbirine çok benzemek istemediğimizden her seferinde geçersiz sayı biçimi seçeceğiz. Rastgele seçilen formatlar, Alan Kodu ve Döviz Kodu ile tanımlanır ve toplu olarak $ Önek olarak saklanır.
$ NumberFormat = g 5 geçiş( $ NumberFormat){ 0{ $ Önek = "($( g 2) $( g 10) $( g 10) $( g 10) $( g 10) $( g 10)"} 2{ $ Önek ="( $( g 10) 9 $( g 10)) $( g 10) $( g 10) $( g 10)$( g 10) $( g 10) $( g 10) $( g 10) $( g 2) $( g 10) $( g 10) "} 3{ $ Önek =") 555 "}}İlk satır, hangi formatın seçileceğini açıklayan basit bir rasgele sayı üretme yöntemidir( GD 10)telefon numarasını takip edeceğiz. Daha sonra, switch ifadesi bu rasgele seçimi alır ve buna göre bir $ Önek oluşturur. Geçersiz telefon numarası türlerinin listesini hatırlıyor musun?$ NumberFormat değerleri 0-3, listedeki ilk dört numaraya karşılık gelir. Her ikisi de "555" Exchange Kodu kullandıklarından, Değer 4 son iki koddan birini oluşturabilir.
Burada çift tırnak kullanan başka bir numara kullandığımızı görebilirsiniz.Çift tırnak işaretleri, bir dize çıktı alınmadan önce değişkenleri yorumlamanıza izin vermez - ayrıca komut dosyası bloklarını işleme imkânı tanır. Bunu yapmak için, komut dosyası bloğunu şu şekilde kaydırın: "$( <
İsmimizi & amp; dizinimizi çıktılamaya hazır olmadan önce yapmamız gereken son şey;telefon numarası, $ Sonek olarak saklanacak bir Abone Kimliği oluşturmaktır.
anahtarı( $ NumberFormat){ {$ _ -lt 4}{ $ Ek = "$( g 10) $( g 10) $( g 10) $( g 10)"} 4{ (800) 555 '{$ Ek =' 0199 '} varsayılan{ $ Ek = "01 $( g 10) $( g 10)"}}}}555 sayıları için özel kurallar nedeniyle yalnızcasenaryomun yapacağı her telefonun sonuna dört rasgele basamak üret.İlk anahtarda 555 numara ile uğraşıp müsade edilemediğimiz kontrol edilir. Değilse, dört adet rastgele basamak üretir.555 numara ise, ikinci anahtar 800 alan kodunu denetler. Bu eşleşiyorsa, kullanabileceğimiz yalnızca geçerli bir $ Sonek var. Aksi takdirde, 0100-0199 arasında herhangi bir yerden seçim yapabilir.
Bu blok yerine yazıldığı gibi birkaç farklı yol olduğunu unutmayın. Her iki geçiş deyimi de, her ikisi de yalnızca iki seçeneği işlediğinden, if / else ifadeleri ile değiştirilebilirdi. Ayrıca, özel olarak "4" i ilk switch ifadesi için bir seçenek olarak çağırmak yerine, "varsayılan", kullanılan tek seçenek olduğundan ikinci sırada nasıl yapıldığına benzer şekilde kullanılabilirdi. If / else vs anahtarı ya da belirli değerler yerine varsayılan anahtar kelimeyi nereden kullanacakları arasında seçim genellikle kişisel tercih meselesine dönüşüyor.Çalıştığı sürece, en rahat olduğunuz şeyleri kullanın.
Şimdi, çıktı zamanı.
Yazma Çıktısı "$ İsim Soyadı $ Önek - $ Sonek"}Bu, betiğe girdiği kadar basittir. Boşluklarla ayrılmış soyadını ve soyadını, ardından telefon numarasından önce başka bir boşluk bırakır. Exchange Kodu ve Abone Kimliği arasındaki standart çizginin de eklendiği yer.
Altındaki kapanış ayracı, daha önce gelen ForEach-Nesne döngüsünün sonudur - zaten sahipseniz bunu atlayın.
Bölüm 5: Komut Dosyasını Temizleme ve Çalıştırma
Tüm çalışmalar bittikten sonra, iyi bir betik kendisinden sonra nasıl temizleneceğini bilir. Ayrıca, yalnızca konsoldan komut dosyasını çalıştırırsanız, aşağıdaki İfadelerde çalıştırmayı planlıyorsanız bunu isteyeceksiniz.
Kaldır-Öğe takma adı: \ g Kaldır-Değişken ScriptFolder, Gerekli Dosyalar, Soyadı, Erkek, İsim, Numara Formatı, Önek, Sonek, Geçerli Giriş, Kullanıcı Girişiİşlemin tamamlanmasından sonra, komut dosyasını ".ps1" uzantısıyla kaydedinisim dosyalarınızla aynı klasörde. ExecutionPolicy öğesinin, komut dosyasının çalışabilmesi için ayarlandığından ve bir fikir verebileceğinden emin olun.
Burada komut dosyasının bir ekran görüntüsü var:
Bu PowerShell komut dosyasını içeren bir ZIP dosyasını ve ad listelerine sahip metin dosyalarını aşağıdaki bağlantıdan indirebilirsiniz.
Rastgele İsim ve amp;PowerShell için Telefon Numarası Üreticisi