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.txtCmdlet'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-ItemKlasö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\*.* -RecurseMuhtemelen 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-ItemSalt 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\*.* -ForcePowerShell 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 *.logInclude 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-ItemKapanış
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.

