Cuma Eğlencesi: Son Dosyaları Alın
Tahmin edebileceğiniz gibi hafta boyunca birçok farklı dosya üzerinde çalışıyorum. Bazen her şeyi düz tutmak zordur. Dün üzerinde çalıştığım senaryoya geri dönmek istiyorum ama ona ne isim verdiğimi hatırlayamıyorum. Bu yüzden onu bulana kadar birkaç dakikamı arayıp filtreleyerek geçiriyorum. Bu çok uzun sürüyor. Öyleyse neden basit bir PowerShell aracı oluşturup onu profilime yüklemiyorsunuz?
Öncelikle filtrelemek için bir tarihe ihtiyacım var. Dün en son değiştirilen tüm dosyaları bulmak istiyorum.
$y = (Get-Date).AddDays(-1).DateEğer AddDays yöntemini kullansaydım, şu andan itibaren saat dahil tam olarak 24 saat sonrasını alırdım. Ama gece yarısından beri istiyorum. Date özelliğinin bana kazandırdığı şey bu. $y'nin değeri 19 Mart 2015 Perşembe 12:00:00 gibi bir şeydir. Artık bir dizin listesi almak ve bu tarihe göre filtrelemek basit bir meseledir.
dir -file | where {$_.lastwritetime -ge $y} | Sort LastWriteTimeSonuçları sıraladığımdan emin olmam gerekiyor ancak bunu sonunda yapıyorum, böylece PowerShell filtrelenen sonuçları sıralıyor.
Doğal olarak bunu sürekli yazmak zorunda kalmak istemiyorum. İşte benim için işi yapacak bir fonksiyon.
#requires -version 3.0
Function Get-RecentFile {
[cmdletbinding()]
Param(
[Parameter(Position=0)]
#make sure path exists and it belongs to the FileSystem provider
[ValidateScript({
if ((Test-Path -path $_) -AND ((Resolve-Path -path $_).Provider.Name -eq "FileSystem")) {
$True
}
else {
Throw "Verify path exists and is a FileSystem path."
}
})]
[string]$Path = ".",
[ValidateScript({$_ -ge 0})]
[int]$Days = 1,
[ValidateNotNullorEmpty()]
[DateTime]$Since = (Get-Date).AddDays(-$Days).Date,
[int]$Newest,
[ValidateNotNullorEmpty()]
[string]$Filter = "*"
)
Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"
#get a full path path for verbose messages
$Path = Resolve-Path -Path $Path
Write-Verbose -Message "Getting files [$filter] from $path since $($Since.ToShortDateString())"
#sort last
$files = Dir -path $Path -filter $Filter -File |
where {$_.LastWriteTime -ge $Since} |
Sort LastWriteTime
if ($Newest) {
Write-Verbose -message "Getting $newest newest files"
$files | Select-Object -last $Newest
}
else {
$files
}
Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
} #end function
#define an optional alias
Set-Alias -Name grf -Value Get-RecentFileVarsayılanı, dünden bu yana en son değiştirilen geçerli klasördeki tüm dosyaları bulacak şekilde ayarladım. Ayrıca sonuçları en yeni X dosya sayısıyla sınırlama seçeneği de ekledim. Komut dosyaları klasörümde 10 yıllık dosyalar var, bu yüzden bu çok faydalı.
grf -Days 30 -filter *.txt -Newest 3Hatta bir takma ad bile oluşturdum.
Bu arada, Days parametresini 0 olarak ayarlarsanız, dosyaların bugün değiştirildiğini görürsünüz. Ayrıca üzerinde çalıştığım şeyi görmemi de kolaylaştırıyor.
get-recentfile -days 30 | group extensionKomut dosyalarınızda yararlı bulabileceğiniz bir özelliğe daha dikkat çekmek istiyorum. Parametre doğrulamayı çok kullandığımı fark edeceksiniz. Doğrulama testi başarısız olursa PowerShell bir özel durum oluşturur. Ancak bazen biraz daha şık bir şey isteyebilirsiniz. Bu fonksiyonda yolun var olduğunu ve bunun bir Dosya Sistemi yolu olduğunu doğrulamak istedim. HKLM: gibi bir yol Doğru olarak test edilir ancak işlevin amacı açısından geçersiz olur.
İşte doğrulama özelliği:
[ValidateScript({
if ((Test-Path -path $_) -AND ((Resolve-Path -path $_).Provider.Name -eq "FileSystem")) {
$True
}
else {
Throw "Verify path exists and is a FileSystem path."
}
})]
ValidateScript'i kullandığınızda, komut dosyası bloğunun $True veya $False değerini döndürmesi gerekir. $False ise tipik istisnayı alırsınız. Bu durumda, yol testlerimi geçerse PowerShell'e sorun olmadığını ($True) söyleyebilirim ve işlevin devam ettiğini söyleyebilirim. Ancak yol testimde başarısız olursa kendi hata mesajımı yazacağım.
PowerShell'de sıklıkla olduğu gibi, araçlarınızı veya komut dosyanızı kimin kullanacağını ve bunların hatalara nasıl yanıt vereceğini düşünmeniz gerekir.
Yapmadığım tek şey yoruma dayalı yardım eklemek, o yüzden bunu size bırakıyorum. Eğlence!



