PowerShell Remove-Item ile Dosya Nasıl Silinir?


Dosyaları silmek ve dizinleri temizlemek, özellikle aynı görevi düzenli olarak birden fazla bilgisayarda gerçekleştirmeniz gerektiğinde, zaman alıcı bir iş olabilir. Ancak PowerShell ile Remove-Item cmdlet'ini kullanarak bir dosyayı hızlı ve verimli bir şekilde silecek küçük komut dosyaları oluşturabiliriz.

PowerShell yalnızca tek bir dosyayı değil, belirli kriterlere göre bir dizini veya bir grup dosyayı bile silmemize olanak tanır. Ayrıca bir dosyayı yalnızca varsa silmenin, x günden daha eski dosyaları veya joker karakter desenine göre dosyaları silmenin mümkün olduğunu biliyor muydunuz?

Bu yazımızda PowerShell'de dosya nasıl silinir konusuna bakacağız. Yalnızca belirli dosyaları silmek, silme eylemini doğrulamak ve daha fazlası için farklı seçeneklerin nasıl kullanılacağı.

PowerShell ile bir dosyayı silin

PowerShell ile dosyaları silmek için Remove-Item cmdlet'ini kullanmamız gerekir. Bu cmdlet, ölçütlere göre bir veya daha fazla öğeyi silebilir. Remove-Item cmdlet'i yalnızca dosyaları silmek için değil aynı zamanda klasörleri, kayıt defteri anahtarlarını, değişkenleri, işlevleri ve daha fazlasını silmek için de kullanılabilir. Bu yazımızda dosyaları silme konusuna odaklanacağız.

Remove-Item cmdlet'i ile aşağıdaki parametreleri kullanabiliriz:

-Path

Kaldırılması gereken öğelerin yolunu belirtin.

-LiteralPath

Öğenin tam yolu

-Include

Dahil edilecek bir yol öğesini belirtir; örneğin, *.txt

-Exclude

Hariç tutulacak bir yol öğesini belirtir; örneğin *.txt

-Recurse

Belirtilen konumdaki ve tüm alt klasörlerdeki öğeleri silin

-Force

Salt okunur dosyaları veya gizli öğeleri silmek için kullanılır

-Confirm

Onay istemi

Bu nedenle, PowerShell ile tek bir dosyayı silmek için yalnızca dosya adı dahil dosyanın tam yolunu belirtmemiz gerekir. Örneğin aşağıdaki klasörden readme.txt dosyasını silmek istiyorsak şunları yapabiliriz:

Remove-Item -Path C:\temp\files\readme.txt

Cmdlet'in onay istemeyeceğini, dosyanın anında silineceğini unutmayın. Bu nedenle, bir veya daha fazla dosyayı silecek PowerShell betiğinizi yazarken önce onu test etmeniz önemlidir. Bunu -confirm veya -whatif parametresini kullanarak yapabiliriz. Onayla, dosyayı silmek isteyip istemediğinizi belirten bir uyarı verecektir; burada öğeyi gerçekten silmeden cmdlet'in ne yapacağını gösterirse ne olur:

# Using Confirm
Remove-Item -Path C:\temp\files\readme.txt -Confirm

Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\temp\files\readme.txt".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): 

# Or using WhatIf
Remove-Item -Path C:\temp\files\readme.txt -whatif
What if: Performing the operation "Remove File" on target "C:\temp\files\readme.txt".

Bir Klasördeki Tüm Dosyaları Sil

Bir klasördeki tüm dosyaları silmek için de PowerShell'deki Remove-Item cmdlet'ini kullanabiliriz. Şimdi burada dikkat edilmesi gereken önemli nokta, cmdlet'in klasörleri de kaldırabilmesidir. Bu nedenle, yalnızca dosyaları silmek için, yalnızca adında . noktası bulunan öğeleri seçmek üzere joker karakter kullanacağız. Bu şekilde yalnızca dosyalar silinir, alt klasörler silinmez:

# Remove all files from the path c:\temp\files
# Tip: test the results first with the -whatif parameter
Remove-Item -Path C:\temp\files\*.*

Başka bir seçenek de, yalnızca dosyaları almak için Get-ChildItem cmdlet'ini -File parametresiyle kullanmak ve ardından Remove-Item cmdlet'ini PowerShell ile dosyaları kaldırın:

Get-ChildItem -Path C:\temp\files\ -File | Remove-Item

Klasör ve Alt Klasörlerdeki Dosyaları Kaldırma

Yalnızca klasördeki değil, alt klasördeki dosyaları da silmek için -Recurse parametresini kullanmanız gerekecektir. Tek bir sorun var; -Yinelemeli rekombinasyonu salt dosya seçim yöntemi *.* ile kullanamazsınız. Aşağıdaki örneği alın:

Remove-Item -Path C:\temp\files\*.* -Recurse

Muhtemelen bunun yalnızca klasör ve alt klasördeki dosyaları sileceğini bekliyorsunuz. Ancak yolda joker karakter kullanıldığında yalnızca yol adında . içeren öğeler (dosyalar) seçilir. Yani cmdlet herhangi bir alt klasörden geçmeyecektir.

Klasördeki tüm dosyaları ve tüm alt klasörleri kaldırmak için yalnızca üst klasörün yolunu belirtmemiz ve yalnızca dosyaları seçmek için -Include parametresini kullanmamız gerekecek:

# Delete all files from the folder c:\temp\files and it's subfolders
Remove-Item -Path C:\temp\files\ -Recurse -Include *.*

Diğer bir seçenek de ilk önce Get-ChildItem cmdlet'i ile dosyaları klasörden ve alt klasörden almak ve sonra bunları kaldırmaktır:

Get-ChildItem -Path C:\temp\files\ -File -Recurse | Remove-Item

Salt Okunur ve Gizli Dosyaları Sil

Salt Okunur ve gizli dosyalar varsayılan olarak silinmeye karşı korunur. Aşağıdaki örneğe bir göz atalım, “la-srv-dc01.log” dosyası salt okunur olarak işaretlenmiş ve şablon.html gizli bir dosyadır.

Klasördeki tüm dosyaları silmeye çalışırsak, salt okunur dosyada bu işlemi gerçekleştirmek için yeterli erişim hakkına sahip olmadığınızı belirten bir hata alırsınız. Gizli dosya hiç silinmedi bile.

Peki bu dosyaları nasıl sileceğiz? Salt okunur ve gizli dosyaları da silmek için -Force parametresini kullanmamız gerekecek:

# Remove all files, including read-only and hidden
Remove-Item -Path C:\temp\files\*.* -Force

PowerShell Dosya Varsa Sil

Komut dosyalarının içinde Remove-Item cmdlet'ini kullanırken, silmeye çalışmadan önce dosyanın var olup olmadığını test etmek iyi bir fikirdir. Bunu Test-Path cmdlet'ini kullanarak yapabiliriz. Bu, dosyanın var olup olmadığını kontrol edecek ve sonuca göre doğru veya yanlış değerini döndürecektir. Bunu bir if ifadesinin içinde kullanarak, dosyanın yalnızca mevcut olması durumunda silindiğinden emin olabiliriz:

$file = C:\temp\files\readme.txt

if (Test-Path -Path $file) {
    Remove-Item -Path $file
}

PowerShell'de Dosyaları Silmek için Filtreleri Kullanma

Şimdi PowerShell ile dosyaları silmek için bazı ilkelere baktık. Ancak tek bir dosyayı veya klasördeki tüm dosyaları silmenin yanı sıra, yalnızca x günden eski dosyaları veya belirli bir dosya türündeki dosyaları silmenizin yeterli olduğu durumlarla sıklıkla karşılaşacaksınız.

PowerShell ile sadece bu dosyaları seçip silmek için çeşitli yöntemler kullanabiliriz. Filtrelerle çalışırken, dosyaları gerçekten silmeden önce daima seçimi test ettiğinizden ve doğruladığınızdan emin olun.

Dahil Etme Filtresini Kullanma

Include parametresi, dosya adında belirli bir dize veya dizenin bir kısmı bulunan tüm dosyaları seçmemize olanak tanır. Örneğin, yalnızca .log dosyalarını klasörden kaldırmak istiyorsanız şunları yapabilirsiniz:

# Remove all .log items
Remove-Item -Path C:\temp\files\ -Include *.log

Include parametresi dosya uzantılarıyla sınırlı değildir; dosyaları, dosya adlarının bir kısmına göre de seçebilirsiniz. Ayrıca seçmek istediğiniz birden fazla "anahtar kelimeyi" belirtmeniz de mümkündür:

# Get all files that have the word app or process in their name.
Remove-Item -Path C:\temp\files\ -Include *app*, *process* -Recurse -WhatIf

# Result
What if: Performing the operation "Remove File" on target "C:\temp\files\subfolder\LT3452-process-errors.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\subfolder\LT3452-process.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\11032021-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\11032022-app.log".

Hariç Tutma Filtresini Kullanma

İnclude parametresinin prensibini takip ederek dosyaları da hariç tutabiliriz. Dahil etme ve hariç tutma birlikte kullanılabilir; böylece örneğin işlem günlüğü dosyaları dışındaki tüm günlük dosyalarını kaldırabilirsiniz:

Remove-Item -Path C:\temp\files\ -Include *.log -Exclude *process* -Recurse -WhatIf

# Result
What if: Performing the operation "Remove File" on target "C:\temp\files\11032021-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\11032022-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\la-srv-dc01.log".

PowerShell ile x Günden Eski Dosyaları Silin

Dizinleri temizlerken yaygın bir uygulama, yalnızca x günden daha eski dosyaları silmektir. Bunu yapmak için öncelikle dosya tarihini hesaplamamız gerekecek. diyelim ki 30 günden eski tüm dosyaları silmek istiyoruz, ardından ilk olarak 30 gün öncesindeki tarihi almamız gerekiyor:

# Get the date from today minus 30 days
$dateTime = (Get-Date).AddDays(-30)

Bir sonraki adım, verilen tarihten daha eski olan tüm dosyaları almaktır. Bunu yapmak için dosyanın lastwritetime değerini hesapladığımız datetime ile karşılaştıracağız:

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime }

Daha sonra dosyaları gerçekten silmek için yalnızca Remove-Item cmdlet'ini arkasına yönlendirmemiz gerekir:

$dateTime = (Get-Date).AddDays(-30)
$path = "C:\temp\files\"

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime } | Remove-Item

Şundan Büyük Dosyaları Sil:

Belirli bir boyuttan daha büyük olan tüm dosyaları silmek için öncelikle dosya boyutunu Mb'den kbit'e dönüştürmemiz gerekir. Doğru boyutta, verilen boyuttan daha büyük olan tüm dosyaları seçebilir ve bunları Remove-Item cmdlet'iyle kaldırabiliriz:

$path = "C:\temp\files\"

# Set file size
$sizeInMb = 500

# Calculate actual file size
$size = $sizeInMb*1024*1024

# Delete all files that are larger then given size
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.length -gt $size } | Remove-Item

Kapanış

PowerShell, dosyaları otomatik olarak yönetme ve silme konusunda harika bir araçtır. Verilen klasördeki büyük dosyaları hızla bulup silmek için her hafta eski dosyaları temizleyecek komut dosyaları yazabilirsiniz.

Dosyaların kalıcı olarak silindiğini unutmayın; bu nedenle, dosyaları gerçekten silmeden önce komutlarınızı ilk olarak parametresini kullanarak test ettiğinizden emin olun.

Umarım bu makaleyi faydalı bulmuşsunuzdur, herhangi bir sorunuz varsa aşağıya yorum bırakmanız yeterli.

İlgili makaleler