Powershell ile özellikle File Server üzerinde işlemler yaparken, genellikle değiştirilme tarihi, erişim bilgisi, sahiplik bilgisi gibi bilgileri çekmek için ya da dosyalara belli kurallarla müdahale edebilmek için, alt dizinlerdeki klasör ve dosyalara erişme aşamasında tüm işi otomatik yapacak bir yönteme ihtiyaç duyuyordum. Get-ChildItem komutu bir dizin için alt objeleri verirken, -Depth komutu ile alt dizin sayısını arttırabiliyoruz ama bu komutla da çıktıda sağlıklı bir çalışma planlayamıyordum. Bu sebeple kendi çalışma mantığıma uygun bir script geliştirme ihtiyacı hissettim ve temel işlemlerde yardımcı olacak, henüz test aşamasında ve geliştirmeye açık olan bu scripti hazırladım.Benim gibi ihtiyaç sahiplerinin kullanması için de paylaşmak istedim. Umarım yardımcı olur.
Scriptin Temel İşleyişi ve Kod Yapısı:
Temel işleyişinde script açılışta sizden kontol edeceği dosya yolunu istiyor. Ufak bir kontrolden sonra da PathAnalyzFile.csv dosyası oluşturarak ve burada oluşturduğu satırları tekrar kontrol ederek tüm alt klasör yollarını ve içlerindeki dosyaları bu csv dosyasının içerisine ekliyor. Scripti çalıştırmadan önce bu dosyanın kaydedilmesini istediğiniz yolu değiştirebilirsiniz. Varsayılan olarak geçerli kullanıcının “Documents” klasörü altına kaydetmektedir. Türkçe İşletim Sistemi kullanan kullanıcılarda bu klasörü otomatik oluşturur.
Script içerisinde csv dosya satırlarını incelerken do-while döngüsü kullanılıyor.
Test aşamasında 50000 adet\satıra kadar kontrollerde performans sorunu yaşatmadığı gözlemlendi. Kapasite arttıkça tarama hızı azalıyor.
Script Kod:
#Ekran temizleme ve info bilgileri#
cls
Write-Host -ForegroundColor Green "[..............................................AllSubPathAnalyz v1 ..............................................]"
Write-Host -ForegroundColor Green "[..........................Girilien bir path altındaki tüm dosya ve klasörleri listeler..........................]"
Write-Host -ForegroundColor Green "[....................Scripti test etmeden ve komutları incelemeden sisteminizde çalıştırmayın....................]"
Write-Host -ForegroundColor Green "[.....................Geliştirmeme önerilerinizi mail@ekremersoy.com adresine iletebilirsiniz....................]"
Write-Host -ForegroundColor Green "[..........................Linkedin : https://www.linkedin.com/in/ekrem-ersoy-5853a8a3/..........................]"
#Ekran temizleme ve info bilgileri Son#
#Temel değişken tanımları#
$RoorPath_ers = ""
$RootLocation = "$env:USERPROFILE\Documents" #Geçerli kullanıcının dökümanlarım klasörünü baz alır. İstenirse dosya kayıt yeri buradan değiştirilebilir.
$i = 0
#Temel değilen tanımları Son#
#.......................................................................................#
#.......................................................................................#
#Path girişinin kontrolünün yapıldığı komut satırı#
do {
if ($RoorPath_ers -like "exit") {exit}
Write-Host -ForegroundColor Yellow "Path girişinde sonda '\' karakteri kullanmayınız. Örnek C:\Users\Tools"
$RoorPath_ers = Read-Host -Prompt “Lütfen Tarama Dizinini Giriniz”
if (!(Test-Path $RoorPath_ers))
{
cls
Write-Host -ForegroundColor Yellow " Malesef belirttiğiniz dizine erişim sağlanamadı. Path yolunu kontrol edip, Powershell'i admin olarak açmayı deneyebilirsiniz."
Write-Host -ForegroundColor Yellow " Exit yazarak programdan çıkabilirsiniz."
}
} until (Test-Path $RoorPath_ers)
#.......................................................................................#
#.......................................................................................#
#.......................................................................................#
#.......................................................................................#
#Analiz dosyasının kayıt olacağı dizinin hazırlandığı komut satırları#
$PathAnalyzFile = $RootLocation +"\" +"PathAnalyzFile.csv"
Write-Host "Analiz dosyasının kayır yeri: " $PathAnalyzFile
$Table = @()
$Table = [pscustomobject]@{PathType="Root";PathName=$RoorPath_ers;Path=$RoorPath_ers}
$Table | Export-Csv -Path $PathAnalyzFile -NoTypeInformation -Encoding Default -Force
#.......................................................................................#
#.......................................................................................#
#.......................................................................................#
#Path analiz döngüsü ve çıktının oluşturulduğu komut satırı#
do {
$PathType_ers = ""
$Path_ers = ""
#.......................................................................................#
#Bu aralıkta dosya ve klasötleriniz için istediğiniz komutları uygulayabilirsiniz#
## Get-Acl -Path $Table[$i].Path # Klasör ya da dosyaya ait permission bilgilerini verir
#.......................................................................................#
#.......................................................................................#
If ($Table[$i].PathType -notlike "Dosya") {
$PathList = Get-ChildItem -Path $Table[$i].Path
foreach ($PathOne in $PathList) {
if ($PathOne.Mode -like "*d*"){ $PathType_ers = "Klasör"
} elseif ($PathOne.Mode -notlike "*d*"){ $PathType_ers = "Dosya"}
$Path_ers = $Table[$i].Path +"\"+$PathOne.Name
$CeatedLine = [pscustomobject]@{PathType=$PathType_ers;PathName=$PathOne.Name;Path=$Path_ers}
$CeatedLine # işlem yapılan pathi gösterir, işlemin ilerleyişini göstermek için eklendi, istenirse kaldırılabilir.
$CeatedLine | Export-Csv -Path $PathAnalyzFile -NoTypeInformation -Encoding Default -Append
$Table = Import-Csv -Path $PathAnalyzFile -Encoding Default
}
}
$i += 1
} while( $i -lt $Table.count )
#.......................................................................................#
#.......................................................................................#
Script Dosya:
Powershell dosyasını buradan indirebilirsiniz.
Önemli:
Kullanacağınız bu script parçasındaki kod yapısını incelemeden, güvenilirliğine emin olmadan ortamlarınızda çalıştırmayınız.
