Powershell Foreach Loop ve Foreach-Object fonksiyonlarını anlama


Microsoft PowerShell komut dosyası dilinde , cmdlet’ler üç işlemi gerçekleştirmek için kullanılır. Bilgi toplamak, bilgileri ayarlamak ve bilgileri silmek. Cmdlet’lerin dışında, PowerShell ayrıca bilgileri bir kereden fazla işlenmesini de sağlar. Çoğu PowerShell yöneticisinin kullandığı iki yerleşik PowerShell işlevi vardır. Bunlar ForEach Loop ve ForEach-Object’tir. PowerShell ForEach Loop, bir PowerShell değişkeninde toplanan bir dizi öğe üzerinde yineleme yapmanızı sağlar. Örneğin, Get-ADUser PowerShell cmdlet’ini kullanarak, Active Directory’den kullanıcı bilgilerini toplayabilirsiniz. Bu işlemin öncesinde her kullanıcının şehir bilgisine bakmanız gerekirse, ForEach Loop’u kullanabilirsiniz. ForEach-Object, bu makalede açıklayacağımız gibi doğrudan ve çoğunlukla pipeline nesnelerle çalışmak için kullanılabilir. ForEach Loop ve ForEach-Object fonksiyonlarının kullanıldığı bazı örneklere göz atalım.

ForEach Loop kullandığımız ilk örneğimiz Active Directory kullanıcılarının şehir bilgilerini kontrol etmek ve ardından bir işlem yapmaktır. Şehir bilgisi “Londra” olan kullanıcıları dışa aktarmak ve sonucu bir CSV dosyasına kaydetmek istediğinizi varsayalım. Powershell betiği aşağıdaki gibidir.

$CityReport = “C:\Temp\CityReport.CSV”
Remove-Item $CityReport -ErrorAction SilentlyContinue
$STR = “User Name, City”
Add-Content $CityReport $STR
$AllUsersNow = Get-ADUser –Filter * -SearchBase “OU=TestUsers,DC=Contoso,DC=Com” -Properties *
Foreach ($ThisUser in $AllUsersNow)
{
$CityOfUser = $ThisUser.City
$ThisUserNow = $ThisUser.CN
IF ($CityOfUser -eq “London”)
{
$STRNew = $ThisUserNow+”,”+$CityOfUser
Add-Content $CityReport $STRNew
}
}

Yukarıdaki senaryoda da görebileceğiniz gibi, raporun kaydedileceği CSV dosyasının yolunu saklayan $CityReport adlı bir değişken oluşturduk. Ardından, tüm kullanıcıları belirli bir organizasyon biriminden toplayıp tüm özellikleri $AllUsersNow değişkeninde saklıyoruz. Ardından ForEach Loop işlemi başlar. ForEach Loop işlevinde kullanıcının şehir bilgisini kontrol ediyoruz ve bir IF koşulu kullanarak, şehir bilgisi mevcut kullanıcı için “Londra” değerini tutup tutmadığını kontrol ediyoruz. Kullanıcı “London” değerini şehir değeri olarak tutuyorsa, geçerli kullanıcı adı ve şehir adı değerleri C:\Temp\CityReport.CSV dosyasına eklenir.

ForEach Loop kullanmanın diğer bir örneği, bir CSV dosyasında saklanan bilgileri işlemektir. Kullanıcı adı, şehir ve bölüm değerlerini tutan bir CSV dosyanız olduğunu varsayalım. Kullanıcının şehir ve bölüm özelliklerini CSV dosyasından değiştirmek istiyorsunuz. Bunu yapmak için aşağıdaki PowerShell betiğini kullanabilirsiniz.

$UserData = “C:\Temp\UserData.CSV”
$CSVFile = Import-CSV $UserData
Foreach ($ThisUser in $CSVFile)
{
$ModifyThisUser = $ThisUser
$NewDepartment = $ThisUser.Department
$NewCity = $ThisUser.City
Set-ADUser -Identity $ModifyThisUser -City $Newcity
Set-ADUser -Identity $ModifyThisUser -Department $NewDepartment
}

Yukarıdaki betikte gördüğünüz gibi, CSV dosyasının içeriğini $CSVFile değişkenine aktardık ve ForEach Loop’u kullanarak departman ve şehir değerlerini CSV dosyasından $NewDepartment ve $NewCity olarak saklıyoruz ve Set’i kullanıyoruz. -ADUser PowerShell cmdlet’ini kullanarak kullanıcı için departman ve şehir değerlerini güncelliyoruz.

Özetle, öğenin özellik değerine bağlı olarak belirli bir öğe üzerinde bir eylem gerçekleştirmeniz gerekiyorsa ve/veya nesne bilgilerini bir dosyadan değiştirmeniz gerektiğinde, bilgileri bir kereden fazla işlemeniz gerektiğinde PowerShell ForEach Loop’u kullanabilirsiniz.

ForEach Loop işlevi dışında, PowerShell ayrıca ForEach-Object sunar. ForEach-Object, adından da anlaşılacağı gibi, doğrudan nesnelerle çalışır ve çoğunlukla bir pipeline nesnesinde kullanılır. Örneğin, aşağıdaki komutta görebileceğiniz gibi, Get-Process cmdlet’i, yerel bilgisayardaki ve ForEach-Object üzerindeki tüm süreçleri alır, nesneleri işler ve sonra yalnızca işlem adını görüntüler.

Get-Process | ForEach-Object {$_.ProcessName}

Benzer şekilde, işlem kimliğini process ID ile birlikte görmeniz gerekirse, aşağıdaki komutu uygulayabilirsiniz.

Get-Process | ForEach-Object {$_.ProcessName, $_.ID}

ForEach-Object’i kullanmanın bir başka örneği, bir dizindeki tüm dosyaların uzunluğunu almaktır. C:\Temp klasöründeki tüm dosyaların uzunluğunu kontrol etmek istediğinizi varsayalım. Aşağıdaki örnekte betiği görebilirsiniz.

$ThisDir = “C:\Temp”
Get-ChildItem $ThisDir | ForEach-Object –Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; ” ” }}

Aşağıdaki ForEach-Object PowerShell örneğinde, eventleri Application Event Log dosyasından toplar ve ardından event mesajını bir metin dosyasına kaydedersiniz.

$AppEvents = Get-EventLog –LogName Application
$AppEvents | ForEach-Object –Process {Out-File –FilePath C:\Temp\AllAppEvents.TXT –Append –InputObject $_.Message}

Yani şimdi ForEach ve ForEach-Object dahili PowerShell işlevlerinin nasıl kullanılacağı hakkında bir fikriniz var. PowerShell ForEach Loop, bir PowerShell değişkeninde toplanan ve bir CSV dosyasında saklanan öğeler kümesi boyunca yinelemek için kullanılabilir. ForEach-Object fonksiyonu doğrudan nesnelerle çalışmak için kullanılabilir. Bu makaledeki ForEach Loop ve ForEach-Object işlevlerinin her ikisini de kullanarak sağladığımız örnekler, başlamanızı sağlamalı ve işinizde komutları kullanmanın yollarını düşünmenizi sağlamalı.

Microsoft PowerShell komut dosyası dilinde , cmdlet’ler üç işlemi gerçekleştirmek için kullanılır. Bilgi toplamak, bilgileri ayarlamak ve bilgileri silmek. Cmdlet’lerin dışında, PowerShell ayrıca bilgileri bir kereden fazla işlenmesini de sağlar. Çoğu PowerShell yöneticisinin kullandığı iki yerleşik PowerShell işlevi vardır. Bunlar ForEach Loop ve ForEach-Object’tir. PowerShell ForEach Loop, bir PowerShell değişkeninde toplanan bir dizi öğe üzerinde yineleme yapmanızı sağlar. Örneğin, Get-ADUser PowerShell cmdlet’ini kullanarak, Active Directory’den kullanıcı bilgilerini toplayabilirsiniz. Bu işlemin öncesinde her kullanıcının şehir bilgisine bakmanız gerekirse, ForEach Loop’u kullanabilirsiniz. ForEach-Object, bu makalede açıklayacağımız gibi doğrudan ve çoğunlukla pipeline nesnelerle çalışmak için kullanılabilir. ForEach Loop ve ForEach-Object fonksiyonlarının kullanıldığı bazı örneklere göz atalım.

ForEach Loop kullandığımız ilk örneğimiz Active Directory kullanıcılarının şehir bilgilerini kontrol etmek ve ardından bir işlem yapmaktır. Şehir bilgisi “Londra” olan kullanıcıları dışa aktarmak ve sonucu bir CSV dosyasına kaydetmek istediğinizi varsayalım. Powershell betiği aşağıdaki gibidir.

$CityReport = “C:\Temp\CityReport.CSV”
Remove-Item $CityReport -ErrorAction SilentlyContinue
$STR = “User Name, City”
Add-Content $CityReport $STR
$AllUsersNow = Get-ADUser –Filter * -SearchBase “OU=TestUsers,DC=Contoso,DC=Com” -Properties *
Foreach ($ThisUser in $AllUsersNow)
{
$CityOfUser = $ThisUser.City
$ThisUserNow = $ThisUser.CN
IF ($CityOfUser -eq “London”)
{
$STRNew = $ThisUserNow+”,”+$CityOfUser
Add-Content $CityReport $STRNew
}
}

Yukarıdaki senaryoda da görebileceğiniz gibi, raporun kaydedileceği CSV dosyasının yolunu saklayan $CityReport adlı bir değişken oluşturduk. Ardından, tüm kullanıcıları belirli bir organizasyon biriminden toplayıp tüm özellikleri $AllUsersNow değişkeninde saklıyoruz. Ardından ForEach Loop işlemi başlar. ForEach Loop işlevinde kullanıcının şehir bilgisini kontrol ediyoruz ve bir IF koşulu kullanarak, şehir bilgisi mevcut kullanıcı için “Londra” değerini tutup tutmadığını kontrol ediyoruz. Kullanıcı “London” değerini şehir değeri olarak tutuyorsa, geçerli kullanıcı adı ve şehir adı değerleri C:\Temp\CityReport.CSV dosyasına eklenir.

ForEach Loop kullanmanın diğer bir örneği, bir CSV dosyasında saklanan bilgileri işlemektir. Kullanıcı adı, şehir ve bölüm değerlerini tutan bir CSV dosyanız olduğunu varsayalım. Kullanıcının şehir ve bölüm özelliklerini CSV dosyasından değiştirmek istiyorsunuz. Bunu yapmak için aşağıdaki PowerShell betiğini kullanabilirsiniz.

$UserData = “C:\Temp\UserData.CSV”
$CSVFile = Import-CSV $UserData
Foreach ($ThisUser in $CSVFile)
{
$ModifyThisUser = $ThisUser
$NewDepartment = $ThisUser.Department
$NewCity = $ThisUser.City
Set-ADUser -Identity $ModifyThisUser -City $Newcity
Set-ADUser -Identity $ModifyThisUser -Department $NewDepartment
}

Yukarıdaki betikte gördüğünüz gibi, CSV dosyasının içeriğini $CSVFile değişkenine aktardık ve ForEach Loop’u kullanarak departman ve şehir değerlerini CSV dosyasından $NewDepartment ve $NewCity olarak saklıyoruz ve Set’i kullanıyoruz. -ADUser PowerShell cmdlet’ini kullanarak kullanıcı için departman ve şehir değerlerini güncelliyoruz.

Özetle, öğenin özellik değerine bağlı olarak belirli bir öğe üzerinde bir eylem gerçekleştirmeniz gerekiyorsa ve/veya nesne bilgilerini bir dosyadan değiştirmeniz gerektiğinde, bilgileri bir kereden fazla işlemeniz gerektiğinde PowerShell ForEach Loop’u kullanabilirsiniz.

ForEach Loop işlevi dışında, PowerShell ayrıca ForEach-Object sunar. ForEach-Object, adından da anlaşılacağı gibi, doğrudan nesnelerle çalışır ve çoğunlukla bir pipeline nesnesinde kullanılır. Örneğin, aşağıdaki komutta görebileceğiniz gibi, Get-Process cmdlet’i, yerel bilgisayardaki ve ForEach-Object üzerindeki tüm süreçleri alır, nesneleri işler ve sonra yalnızca işlem adını görüntüler.

Get-Process | ForEach-Object {$_.ProcessName}

Benzer şekilde, işlem kimliğini process ID ile birlikte görmeniz gerekirse, aşağıdaki komutu uygulayabilirsiniz.

Get-Process | ForEach-Object {$_.ProcessName, $_.ID}

ForEach-Object’i kullanmanın bir başka örneği, bir dizindeki tüm dosyaların uzunluğunu almaktır. C:\Temp klasöründeki tüm dosyaların uzunluğunu kontrol etmek istediğinizi varsayalım. Aşağıdaki örnekte betiği görebilirsiniz.

$ThisDir = “C:\Temp”
Get-ChildItem $ThisDir | ForEach-Object –Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; ” ” }}

Aşağıdaki ForEach-Object PowerShell örneğinde, eventleri Application Event Log dosyasından toplar ve ardından event mesajını bir metin dosyasına kaydedersiniz.

$AppEvents = Get-EventLog –LogName Application
$AppEvents | ForEach-Object –Process {Out-File –FilePath C:\Temp\AllAppEvents.TXT –Append –InputObject $_.Message}

KAYNAKPOWERSHELL