PowerShell Kullanarak Bir Dosyadaki Birden Çok Dizeyi Değiştirme


Son zamanlarda birisi benden bir dosyadaki birden çok dizeyi değiştirmek için eksiksiz bir PowerShell betiği yazmamı istedi. Bu eğitimde size farklı yöntemler kullanarak PowerShell kullanarak bir dosyadaki birden çok dizeyi nasıl değiştireceğinizi göstereceğim.

PowerShell kullanarak bir dosyadaki birden çok dizeyi değiştirmek için -replace operatörünü zincirleme bir şekilde kullanabilirsiniz. Öncelikle Get-Content'i kullanarak dosya içeriğini okuyun, ardından istenen dizeleri güncellemek için birden fazla -replace işlemi uygulayın ve son olarak, Set-Content'i kullanarak değiştirilen içeriği dosyaya geri yazın. Örneğin:

$filePath = "C:\MyFolder\file.txt"
$content = Get-Content $filePath
$content = $content -replace "OLD_STRING1", "NEW_STRING1" -replace "OLD_STRING2", "NEW_STRING2"
Set-Content -Path $filePath -Value $content

Bu komut dosyası, OLD_STRING1 ve OLD_STRING2'yi etkili bir şekilde sırasıyla NEW_STRING1 ve NEW_STRING2 ile değiştirir.

PowerShell Kullanarak Bir Dosyadaki Birden Çok Dizeyi Değiştirme

Bu PowerShell betiği özellikle sistem yöneticileri ve Windows ortamlarını yöneten BT uzmanları için yararlı olacaktır. Yapılandırma dosyaları, günlükler veya veri dosyaları gibi bir dosyadaki birden çok dizeyi değiştirmek için kullanılabilir.

Yöntem 1: -replace Operatörünü Kullanma

-replace operatörü, PowerShell'deki dizeleri değiştirmek için kullanılır. Birden çok dizeyi değiştirmek için birden çok -replace işlemini birbirine zincirleyebilirsiniz.

Size bir örnek göstereyim.

Bir web uygulaması için güncellenmesi gereken bir yapılandırma dosyanız olduğunu varsayalım. Dosya, gerçek değerlerle değiştirilmesi gereken yer tutucular içeriyor:

ServerName: PLACEHOLDER_SERVER
DatabaseName: PLACEHOLDER_DB

Bu yer tutucuları değiştirmek için aşağıdaki PowerShell betiğini kullanabilirsiniz:

$filePath = "C:\Logs\config.txt"
$content = Get-Content $filePath

$content = $content -replace "PLACEHOLDER_SERVER", "us-west-server"
$content = $content -replace "PLACEHOLDER_DB", "us-west-db"

Set-Content -Path $filePath -Value $content

Bu örnekte, PLACEHOLDER_SERVER, us-west-server ile değiştirildi ve PLACEHOLDER_DB, us-west-db.

PowerShell'de Bir Dizedeki Bir Alt Dizenin Sayım Oluşumlarına göz atın

Yöntem 2: Birden Çok Değiştirme için foreach Döngüsünü Kullanma

Yapmanız gereken çok sayıda değişiklik varsa foreach döngüsünü kullanmak komut dosyanızı daha yönetilebilir hale getirebilir.

PowerShell foreach döngüsünü kullanarak bir dosyadaki birden çok dizeyi değiştirmenin bir örneğini burada bulabilirsiniz.

Hassas bilgiler için yer tutucu değerleriyle olayları kaydeden bir günlük dosyası düşünün:

User: PLACEHOLDER_USER logged in from IP: PLACEHOLDER_IP

Değişikliklerinizi saklamak için bir sözlük ve bunları uygulamak için bir foreach döngüsü kullanabilirsiniz:

$filePath = "C:\MyFolder\log.txt"
$content = Get-Content $filePath

$replacements = @{
    "PLACEHOLDER_USER" = "JohnDoe"
    "PLACEHOLDER_IP" = "192.168.1.1"
}

foreach ($key in $replacements.Keys) {
    $content = $content -replace $key, $replacements[$key]
}

Set-Content -Path $filePath -Value $content

Bu komut dosyasında, PLACEHOLDER_USER, JohnDoe ile ve PLACEHOLDER_IP, 192.168.1.1 ile değiştirildi.

Yöntem 3: Büyük/Küçük Harfe Duyarsız Değiştirmeler için -creplace Kullanımı

-creplace operatörü, büyük/küçük harfe duyarlı olmayan değiştirmeler gerçekleştirir; bu, değiştirdiğiniz metnin farklı küçük harflerle görünmesi durumunda yararlı olabilir.

İşte bir örnek.

Tutarsız durum kısaltmalarına sahip bir veri dosyanız olduğunu varsayalım:

NY, new york
ca, California
TX, texas

Durum kısaltmalarını standartlaştırmak için -creplace komutunu kullanabilirsiniz:

$filePath = "C:\MyFolder\data.txt"
$content = Get-Content $filePath

$content = $content -creplace "ny", "NY"
$content = $content -creplace "ca", "CA"
$content = $content -creplace "tx", "TX"

Set-Content -Path $filePath -Value $content

Yukarıdaki PowerShell betiğini çalıştırdığınızda, tüm durum kısaltmalarının aynı şekilde büyük harfle yazılmasını sağlar. Çıktıyı aşağıdaki ekran görüntüsünde de görebilirsiniz:

PowerShell Kullanarak Dizelerdeki Yer Tutucuları Değiştirme konusuna göz atın

Yöntem 4: Büyük Dosyalar İçin StringBuilder'ı Kullanma

Çok büyük dosyalar için StringBuilder'ı kullanmak, dizeleri tekrar tekrar değiştirmenin getirdiği ek yükten kaçınarak performansı artırabilir.

Örnek: Büyük Bir CSV Dosyasını Güncelleme

Eski şehir adlarına sahip büyük bir CSV dosyasını düşünün:

City,State,Population
Los Angeles,CA,4000000
new york city,NY,8500000
chicago,IL,2700000

Şehir adlarını etkili bir şekilde değiştirmek için StringBuilder'ı kullanabilirsiniz:

Add-Type -AssemblyName "System.Text"
$filePath = "C:\MyFolder\largefile.csv"
$content = [System.Text.StringBuilder]::new((Get-Content $filePath -Raw))

$content.Replace("new york city", "New York City")
$content.Replace("chicago", "Chicago")

[System.IO.File]::WriteAllText($filePath, $content.ToString())

Bu komut dosyası, performans açısından daha verimli bir şekilde new york city'i New York City olarak ve chicago'yu Chicago olarak günceller.

Çözüm

PowerShell, bir dosyadaki birden çok dizeyi değiştirmek için çeşitli yöntemler sunar. Burada her yöntemi örneklerle anlattım, umarım işinize yarar.

İlgili makaleler