Yeni Başlayanlar İçin PowerShell (Bölüm 8): PowerShell'in Gücü – Nesnelerle Temasa Geçmek (Üye Ol, Nesne Seç)


Yeni Başlayanlar için PowerShell (Bölüm 7): Boru (ve oynanacak birçok örnek) bölümünden sonra artık nesnelere odaklanacağız. Üzerine inşa edebileceğiniz temel bilgiler. Ancak bu kısımlara bir göz atmadan önce son alıştırmanın cevabına bakacağız. Ayrıca Bölüm 7'de şu ana kadar öğrendiklerimizi hızlı bir şekilde gözden geçireceğiz.

Serinin tüm bölümlerini burada bulabilirsiniz: Yeni Başlayanlar için PowerShell (Seri)

İnceleme (Bölüm 7)

Get-Hotfix'i çalıştırın. Liste biçiminde yalnızca düzeltmenin numarasını (KB) ve yükleme tarihini gösterin.

Bu 7. bölümün alıştırmasıydı. Tamam, Get-Hotfix'i çalıştırmamız gerekiyor. Daha sonra çıktıyı liste formatında biçimlendirmemiz ve yalnızca iki şeyi göstermemiz gerekiyor. Ad ve yükleme tarihi. Bunun için boru hattına ihtiyacımız var.

Adım adım yapalım.

Get-Hotfix'i herhangi bir parametre olmadan çalıştırdığınızda başlık adlarını görebilirsiniz (bunlara nesne nitelikleri diyelim, bu konuda daha fazla bilgi aşağıda). Artık elimizde isimler var. Bunu bir boruyla daha karmaşık bir komuta dönüştürmek kolaydır.

Buradayız.

Gözden geçirmek


Boru, borunun solundaki her şeyi alır ve borunun sağındaki komuta iletir. Format-Table, Format-List ve Format-Wide bir komutun çıktısını ayarlar.


Nesne tabanlı PowerShell'in gücünü hissedin

PowerShell nesne yönelimlidir. Bu ne anlama geliyor ve ne getiriyor? Nesne yönelimli ortamlarda birisi sizin için zaten bir şeyler yapmıştır. Çok hoş bir insan. O kimdi? Bilmiyorum. Elbette bir Micrsosoft geliştiricisi veya daha doğrusu birkaçı. ?

Bunu Windows PowerShell in Action'ın (İkinci Baskı) yazarı Bruce Payette'den daha iyi söyleyemem:

Başkasının sizin için tanımladığı nesneleri kullanırsınız.

Amaç ne? Sana bir örnek vereyim. İpconfig'i mutlaka biliyorsunuzdur, IP ayarlarınızı gösteren bir komuttur. Ipconfig düz metin çıktısı verir.

Şimdiye kadar, çok iyi. Peki ya yalnızca IPv4 Adresini görüntülemek istiyorsanız? Evet, yüksek sesle bağırdığınızı duyuyorum: “Bu mümkün, bul”u kullanın. Tamam hadi yapalım.

Şimdi tablo formatında sadece IPv4 Adresi ve IPv6 Adresini istediğimizi varsayalım. Şimdi gerçekten karmaşıklaşıyor. Bir metin çıktısından tek tek öğelerin çıktısını almak veya çağırmak büyük bir çaba gerektirir.

Tamam, ipconfig'e eşdeğer komut Get-NetIPAddress'tir.

Ve şimdi şuna bakın:

İkincisi çok daha tatlı. Size başka bir örnek vereyim: cmd'de dir ve PowerShell'de Get-ChildItem.

Dir (cmd olarak girildiyse) düz metin çıktısı verir.

Get-ChildItem nesnelerin çıktısını alır.

Yan Not: PowerShell'de dir çalıştırırsanız Get-ChildItem yürütülür. Bu biraz kafa karıştırıcı olabilir.

İşte gelecek konu için küçük bir tadımlık. Get-ChilIdtem ve Eylemdeki Nesneler.


Get-ChildItem -File C:\Temp | Select-Object Name,LastWriteTime,CreationTime,Directory,Length

Şimdi PowerShell Nesnelerine derinlemesine bir dalış yapacağız.

Birinin sizin için tanımladığı şeyleri keşfetmek (Get-Member, Select-Object)

Yukarıdaki örnek üzerinde durmaya devam edeceğiz. Komutu yerine getirdim


Get-ChildItem -File C:\Temp | Select-Object Name,LastWriteTime,CreationTime,Directory,Length

Şimdi Get-ChildItem'in “normal” çıktısına bir göz atalım. Size Modu, LastWriteTime'ı, Uzunluğu ve Adı gösterir.

Daha fazlasının olduğunu nasıl bildim? (CreationTime, Dizin)?

Üye Ol komutunda neler olup bittiğini görmek için önceden baktım.


Get-ChildItem | Get-Member

Ve orada 2 özellik buldum:

Ve sonra basitçe bu nitelikleri kullanıyorum.

Get-Member cmdlet'i nesnelerin özelliklerini ve yöntemlerini alır.


PowerShell'in Gücü nesne yönelimlidir. PowerShell'i diğer birçok araçtan ayıran şey budur. Nesnelerle uğraşmak zorundasınız. Aksi takdirde PowerShell'in gücünün farkına asla varamazsınız.

Nesneleri keşfetmek için Get-Member'ı kullanın.


Özellikleri ve yöntemleri nelerdir?

Niteliklere ve Yöntemlere Giriş (Get-Member)

Daha fazlasının olduğunu belirtmiştim. PowerShell ile basit çalıştırma komutlarından daha fazlasını yapabiliriz. PowerShell nesne yönelimlidir. Nitelikler ve yöntemler vardır. Önce niteliklere bir göz atalım. Tamam, şu anda yaptığımız işin öneminin altını çizeyim. İddia ediyorum: Nesnelere aşina değilseniz yardımları bile anlama şansınız yoktur. Bana inanmıyor musun?

Get-Date kolay bir komuttur. Ancak örneklere bakarsanız, bir örneğin zaten nesnelerle ilgili olduğunu göreceksiniz… Get-Help Get-Date -Online komutunu çalıştırıp 4 ve 5 numaralı örneğe kaydırırsanız ve orada neler olduğunu anlamazsanız o zaman başın dertte.


Get-Help Get-Date -Online

Bütün bunlar ne anlama geliyor? Noktanın anlamı nedir ve parantez nedir ve nereye bakacağımı nasıl bileceğim?

Yardımı bile anlamıyorsanız nasıl iyi bir PowerShell uzmanı olabilirsiniz? Umarım seni biraz kışkırtmışımdır. ? Tamam, başlayalım.

Nitelikler ve yöntemler arasında ayrım yaparız.

Nitelikler - Nesne Nedir?

Nitelikler size bir Nesnenin ne olduğunu gösterir. Bir nesne yeşil olabilir, bir tarih olabilir, doğru olabilir, yanlış olabilir veya başka bir şey olabilir.

Get-Volume örneğini ele alalım.

Get-Member, Get-Volume komutunun tüm özelliklerini görüntüler. Ve boruyu kullanmalısın.


Get-Volume | Get-Member -MemberType Properties

Artık bu özellikleri çağırabiliyoruz. Bunu yapmanın en iyi yolu Select-Object'i kullanmaktır. Diyelim ki sürücü harfini, boyutunu ve kalan boyutu göstermek istiyoruz. Bu arada: TAB kullanmayı unutmayın.


Get-Volume | Select-Object DriveLetter,Size,SizeRemaining

Başka bir örnek. Ağ kartınızın bağlantı hızı nedir?


Get-NetAdapter | Get-Member -MemberType property

LinkSpeed özelliğini bulacaksınız.


Get-NetAdapter | Select-Object LinkSpeed

Tamam, burada bir duralım. Buna ne için ihtiyacımız var? Bir örnek. Tüm dosya adlarını tek bir dosyaya kaydetmek istiyorsunuz. Bunun için tüm dosya adlarının listesine ve yalnızca adların listesine ihtiyacımız var. SADECE isimler! Tüm isimleri nasıl alabiliriz? Adım 1, dosya adının niteliğini bulmaktır.


Get-ChildItem C:\Temp | Get-Member -MemberType property

FullName adında bir özellik bulacaksınız. Buradayız.


Get-ChildItem -Path C:\Temp\ | Select-Object FullName

Ve bunu bir dosyaya kaydedin…


Get-ChildItem C:\Temp\ | Select-Object FullName | Out-File C:\Temp\test.txt

Bu kısımda sadece niteliklerin olduğunu ve bunların Get-member ile görüntülenebileceğini hatırlamanız önemlidir.

Bu konunun öneminin altını çizmek gerekirse: Nesnelerin nasıl fark yarattığını bilin. Normal PowerShell kullanıcıları ile iyi PowerShell kullanıcıları arasındaki fark.

Diyelim ki patronunuz alan adınızdaki tüm sunucuların bir listesine sahip olmak istiyor. Şimdi ne yapmalıyız? Ekran görüntüleri mi alıyorsunuz? 3. taraf bir araç mı satın alıyorsunuz? Gerekli değil. PowerShell'i kullanın.


Get-ADComputer -Filter {operatingsystem -like '*server*'} | Select-Object Name | Out-File C:\Temp\servers.txt

Bu listeyi alın ve patronunuza verin.

Yüklü tüm düzeltmelerin HTML biçiminde bir listesini mi istiyorsunuz? PowerShell'i çalıştırın.


Get-HotFix | Select-Object HotFixID,InstalledOn | ConvertTo-Html | Set-Content C:\Temp\hotfixes.htm

Ama bir dakika bekleyin. Bölüm 7'de (The Pipe) format komutlarıyla pek çok şey yapabileceğimizi öğrendik. Bu aynı zamanda Format Tablosu ile de çalışır mı? Cevap Evet. Ama bu iyi bir fikir değil.

Unutmayın: Format komutlarını (Format-Tablo, Format-List ve Format-Geniş) yalnızca sonda kullanın. Select-Object, nesneler söz konusu olduğunda arkadaşınızdır. Verileri ekranda listelemek istiyorsanız Format tablosunu kullanın. Diğer her şey için Select-Object'i kullanın. Select-Object verileri olduğu gibi iletir, format tablosu beklenmedik davranışlara yol açabilecek verileri değiştirir.


Nitelikler size bir Nesnenin ne olduğunu gösterir. Nitelikleri keşfetmek için Get-Member'ı kullanın. Nitelikleri almak için Select-Object'i kullanın. Select-Object ve Format komutları arkadaş değildir. Format-Table/List/Wide'ı yalnızca kodunuzun sonunda kullanın. Değişmeyen nesneleri elde etmek için Select-Object'i kullanın.


Yöntemler - Bir Nesnenin yapabilecekleri

Girişteki örneği ele alalım. Get-Date'in yardımını gösterir. Örneklerin çoğu niteliklere (Nesnenin ne olduğu) atıfta bulunur. Ama bir şeyleri değiştirmek istiyoruz, bir şeyler yapmak istiyoruz. Son bölümde Select-Object'i kullandık. Bu bölümde özel bir .NET metodu kullanacağız. Select-Object yerine bunu beğendin mi?

Tamam, yavaşlayalım. Select-Object'i veya a'yı kullanabilirsiniz. NET yöntemi(). Eğer kullanırsan. NET yönteminin bazı avantajları vardır. PowerShell'e aşağıdakini yazın:


(Get-Date).

Şimdi CTRL + Space tuşlarına basın. Vay be güzel görünüyor. Sunulan tüm nesneleri alırsınız. İstediğini al.

Braketler ne işe yarar? Parantez içindeki komutlar anında yürütülür. Bu, bir yöntemi kullandığınızda değerin zaten orada olduğu anlamına gelir. Tamam Addays diye bir yöntem var. Yedi yıl geriye sayalım. Çok fazla yazmaktan kaçınmak için TAB kullanmayı unutmayın.


(Get-Date).AddYears(-7)

Başka bir örnek Get-Service komutunun tüm yöntemlerini araştırmaktır.


Get-Service | Get-Member -MemberType method

Stop diye bir yöntem var. Kulağa hoş geliyor. Bu yöntemle hizmeti durdurabiliriz.


(Get-Service spooler).Stop()

Tamam, Stop-Service'i kullanarak hizmeti durdurmanın daha kolay olduğunu itiraf etmeliyim.

Peki ya dizeler? Adımı bir değişkende saklıyorum. Değişkenler bilgileri depolamak için kullanılır.


$string='Patrick Gruenauer'

Şimdi soru şu; bu isimle ne yapabiliriz? Diyelim ki ilk 2 harfi göstermek istiyoruz. Get-Member'ı biliyorsanız bu dizenin yöntemlerini keşfedebilirsiniz.


$string | Get-Member

Orada Substring yöntemini bulacaksınız.


$string.Substring(0,2)

Güzel. Verilen ad ve soyadını ayırmak istiyorsanız split yöntemini kullanın, bu yöntemi Get-Member üzerinden bulabileceğinizi belirtmemize gerek yok.

Bir ayırıcı aramalıyız. Ayırıcımız adım ve soyadım arasındaki boşluktur.

Tamam, adım $string'de kayıtlı. Şimdi split yöntemini kullanıyorum.


$string.Split('')

Güzel.


Yöntemler değişebilir veya bir şeyler yapabilir. Yöntemleri keşfetmek için Get-Member -MemberType Yöntemini çalıştırın. Komut ve yöntem değerlerini parantez içine alın.


Bütün bunlar ne için?

Yeterince bahsetmeden geçemeyeceğim. Sabırlı ol. Bir sonraki bölümde WMI'yı tartışacağız. O zaman nesnelerin gücünü hissedeceksiniz. Ancak bu kısmın sonuna gelmeden önce size bir örnek daha vereyim: Blogumdan pratik bir örnek. Kullanıcıların bir listesini alırsınız. Bu metin dosyasından kullanıcılar oluşturmak istiyorsunuz.

Bu kodu yeni başlayanlar için okuması biraz zor ama yapmak istediğim tek şey nesnelerle uğraşmanın öneminin altını çizmek. Bu kullanıcıların listesidir.

Ve bu kod:


Get-Content C:\temp\users.txt | ForEach-Object {$Split = $_.Split(" "); $given=$Split[0]; $sur=$Split[1]; New-ADUser -GivenName $given -Surname $sur -Name ($given + " " + $sur) -UserPrincipalName (($sur + "@" + "$env:userdnsdomain")).ToLower() -SamAccountName ($sur).ToLower() -AccountPassword (ConvertTo-SecureString -AsPlainText "Passw00rd123" -Force) -Enabled $true -ChangePasswordAtLogon $true -Verbose}

Metin dosyasındaki her nesne (dizeler) ayrılacaktır. Ve ayırıcı alandır. Bu komutu tam olarak anlamadıysanız endişelenmeyin. Active Directory'dir. Komut, her adı alır ve doğru ad ve soyadına sahip bir Active Directory Kullanıcısı oluşturur.

Makalenin tamamını burada bulabilirsiniz: PowerShell: Metin Dosyalarından Active Directory Kullanıcıları Ekleme (Toplu)

2 Adımlı Yöntem

Bu yönergeleri takip ederek PowerShell'den daha fazla yararlanabilirsiniz.

Hatırlamanız gereken tek şey iki adımlı bir yöntemdir. Güven bana.

1. Tüm olasılıkların sorgulanması: Get-Member komutunu çalıştırın


Get-Date | Get-Member

2. Özelliği veya yöntemi (). veya select-object veya seç


(Get-Date -Year 1976 -Month 03 -Day 23).dayofyear


(Get-Date -Year 1976 -Month 03 -Day 23).dayofweek


(Get-Date -Year 1976 -Month 03 -Day 23).AddDays(10)

Evet, bugün benim doğum günüm. Evet, artık 20 yaşında değilim. Evet, bu yazının neredeyse sonuna geldik. ;-). Bir örneğim daha var.

Bir Active Directory kullanıcısının özelliklerinin nasıl listeleneceğine dair bir başka harika örnek.


Get-ADUser petra -Properties * | Select-Object Name,LastLogonDate

Bir sonraki bölüme kadar egzersizi unutmadan önce.

Egzersiz yapmak

Bugünlük bu kadar. İşte bir sonraki bölüme kadar alıştırma.

Öznitellikler

Bir C:\Temp1 dizini oluşturun. C:\Temp1 konumunda testfile1.txt adlı bir metin dosyası oluşturun. Yalnızca PowerShell'i kullanın. Yardıma ihtiyacınız varsa yardımı kullanın (Get-Help). Dosyayı aç. Şimdi Select-Object veya başka bir teknikle şu nitelikleri gösterin: Dosyanın adı, dosya uzantısı ve son erişim tarihi.

Yöntemler

Get-Date'i kullanarak bugünden itibaren 10 yılı geriye doğru hesaplayın. Aşağıdaki soruyu cevaplayın: Bu yılın hangi günüydü? (1..365?)

Çözümü bir sonraki bölümde bulabilirsiniz.

Bir sonraki makalede görüşmek üzere: Yeni Başlayanlar için PowerShell (Bölüm 9): WMI'nın Gücü

Patrick Gruenauer, PowerShell'in MVP'si

İlgili makaleler