PowerShell Dosya/Klasör Numaralandırıcı

Programlama ve Script dilleri konusunda bilgi paylaşım alanıdır.
Cevapla
Kullanıcı avatarı
TRWE_2012
Zettabyte1
Zettabyte1
Mesajlar: 15377
Kayıt: 25 Eyl 2013, 13:38
cinsiyet: Erkek
Teşekkür etti: 2590 kez
Teşekkür edildi: 5460 kez

PowerShell Dosya/Klasör Numaralandırıcı

Mesaj gönderen TRWE_2012 »

Merhabalar

Bir sordum.net makalesinden etkilendim.O makale de tek bir .vbs betiği vardı.
Resim
https://www.sordum.net/57885/topluca-do ... istirilir/

***********************************************************************************************************

Bu PowerShell betiği, dosya ve klasörleri akıllı bir şekilde yeniden adlandırmak için tasarlanmıştır. Kullanıcılara işlem yapılacak dizini seçmeleri ve istenilen dosya veya klasör türüne göre adlandırma yapmaları için bir arayüz sunar.

Genel Yapı

Kütüphane Ekleme:
Add-Type -AssemblyName System.Windows.Forms: Windows formlarını kullanmak için gerekli olan temel kütüphane eklenir.

Ana Menü:
Kullanıcıdan dosya veya klasör türüne göre seçim yapması istenir. Bu seçim dört seçenek içerir:
Sadece dosyaları.
Sadece klasörleri.
Hem dosya hem klasörleri.
Önizleme modu (sadece göster).

Dizin Seçimi:
Kullanıcıdan işlem yapılacak ana dizini seçmesi istenir. Eğer bir dizin seçilmezse script sonlanır.

Önizleme Modu

Eğer kullanıcı önizleme modunu seçerse, klasörlerin veya dosyaların nasıl yeniden adlandırılacağı hakkında bir ön izleme görüntülenir. Bu seçimde kullanıcıya üç alternatif sunulur:

Sadece dosyalar.
Sadece klasörler.
Hem dosyalar hem de klasörler.

Dosya ve Klasör İşlemleri

Dosya ve Klasörlerin Alınması:
Get-ChildItem komutu kullanılarak seçilen dizindeki dosya ve klasörler elde edilir.
Dosyalar ve dizinler, tam adlarına göre sıralanır.

Ana Dizin İşlemleri:
Kullanıcıdan ana dizin için yeni bir isim girilmesi istenir. Dizin yeniden adlandırılır ve alt dizinlerin adlandırılması için bir temel isim girilmesi istenir.

Alt Dizinler:
Eğer alt dizinler varsa, kullanıcıdan bir temel isim alınır ve alt dizinler belirli bir formatta yeniden adlandırılır.

Dosyaları İşleme Fonksiyonu

Kod: Tümünü seç

function Process-Files {
    param([array]$files)
    foreach ($file in $files) {
        ...
    }
}
Bu fonksiyon, yeni dosya isimleri oluşturmak için bir döngü kullanır.
Dosya uzantılarını kontrol eder ve her uzantı için bir sayı sayacı tutar.
Kullanıcıdan yeni isim alır ve dosyaları yeniden adlandırır veya önizleme modunda sadece gösterir.

Değişikliklerin Listeleme ve Kapanış

Tüm yapılan değişiklikler kullanıcıya sunulur. Eğer değişiklik yoksa, bu da bir mesaj ile belirtilir.
Kullanıcıdan scriptin kapanıp kapanmayacağına dair onay alınır.

Bu PowerShell betiği, dosya ve klasörleri akıllıca yeniden adlandırma işlemlerini kullanıcı dostu bir arayüz ile yapmanızı sağlar. Esnekliği ve kullanıcıdan aldığı girdiler sayesinde ihtiyaca göre özelleştirme olanağı sunar. Yalnızca klasörler veya dosyalar üzerinde işlem yapma seçeneği, kullanıcıların görevlerini kolaylıkla icra etmelerini sağlar.

KOD İÇERİĞİ :

Kod: Tümünü seç

Add-Type -AssemblyName System.Windows.Forms

Write-Host "=== PowerShell Dosya/Klasör Akıllı Numaralandırıcı ==="
Write-Host ""

# Ana Menü
Write-Host "1) Sadece dosyaları"
Write-Host "2) Sadece klasörleri"
Write-Host "3) Dosya ve klasörler"
Write-Host "4) Önizleme modu (sadece göster)"
$mode = Read-Host "Lütfen işlem tipini seçiniz (1-4)"
Write-Host ""

$previewMode = $mode -eq "4"
$renamedList = @()

# --- Ana dizin seçimi ---
$fbd = New-Object System.Windows.Forms.FolderBrowserDialog
$fbd.Description = "İşlem yapılacak ana dizini seçin"
if ($fbd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
    $rootPath = $fbd.SelectedPath
} else {
    Write-Host "Dizin seçilmedi, çıkılıyor..."
    [void][System.Console]::ReadLine()
    exit
}

# Önizleme alt menüsü
if ($previewMode) {
    Write-Host "Önizleme modu seçimi:"
    Write-Host "A) Sadece dosyalar"
    Write-Host "B) Sadece dizinler"
    Write-Host "C) Dosya ve dizinler"
    $subMode = Read-Host "Seçiminizi yapın (A/B/C)"
    switch ($subMode.ToUpper()) {
        "A" { $subModeNum = 1 }
        "B" { $subModeNum = 2 }
        "C" { $subModeNum = 3 }
        default { Write-Host "Geçersiz seçim, çıkılıyor..."; exit }
    }
} else {
    $subModeNum = $mode
}

# --- Dosya ve klasörleri recursive al ---
$allFiles = Get-ChildItem -Path $rootPath -File -Recurse | Sort-Object FullName
$allDirs  = Get-ChildItem -Path $rootPath -Directory -Recurse | Sort-Object FullName

$extensionCounter = @{}

# --- Ana dizin işlemi (sadece klasör içeren modlar) ---
if ($subModeNum -eq 2 -or $subModeNum -eq 3) {
    $rootDir = Get-Item -LiteralPath $rootPath
    Write-Host ""
    Write-Host "Ana dizin adı: $($rootDir.Name)"
    $rootNewName = Read-Host "Ana dizin için yeni isim (benzersiz, alt tire eklemeye gerek yok)"
    $parentDir = Split-Path -Path $rootDir.FullName -Parent
    $newRootFullPath = Join-Path -Path $parentDir -ChildPath $rootNewName

    if (-not $previewMode) {
        Rename-Item -Path $rootDir.FullName -NewName $rootNewName -ErrorAction Stop
        $renamedList += "$($rootDir.FullName) -> $newRootFullPath"
    }
    $rootPath = $newRootFullPath

    # --- Alt dizinler ---
    $altDirs = Get-ChildItem -Path $rootPath -Directory -Recurse | Sort-Object FullName
    if ($altDirs.Count -gt 0) {
        Write-Host ""
        Write-Host "Tüm alt dizinler için kullanılacak tek isim girin:"
        $altBaseName = Read-Host "Alt dizinler için isim"
        $counter = 1
        foreach ($dir in $altDirs) {
            $newName = "$altBaseName" + "-$counter"
            $newFullPath = Join-Path -Path $dir.Parent.FullName -ChildPath $newName
            if ($previewMode) {
                Write-Host "[ONİZLEME-KLASÖR] $($dir.FullName) -> $newFullPath"
            } else {
                try {
                    Rename-Item -Path $dir.FullName -NewName $newName -ErrorAction Stop
                    $renamedList += "$($dir.FullName) -> $newFullPath"
                } catch {
                    Write-Host "HATA: $($dir.FullName) yeniden adlandırılamadı. $_"
                }
            }
            $counter++
        }
    }
}

# --- Dosya işleme fonksiyonu ---
function Process-Files {
    param([array]$files)
    foreach ($file in $files) {
        $ext = $file.Extension.ToLower()
        if (-not $extensionCounter.ContainsKey($ext)) {
            Write-Host ""
            Write-Host "Mevcut dosya adı: $($file.Name)"
            $userBase = Read-Host "Yeni isim (sadece base name, numara başa/sona eklenebilir)"
            $extensionCounter[$ext] = @{"BaseName" = $userBase; "Counter" = 1}
        } else {
            $extensionCounter[$ext]["Counter"]++
            $userBase = $extensionCounter[$ext]["BaseName"]
        }
        $number = $extensionCounter[$ext]["Counter"]
        $newName = "$userBase" + "_$number" + $ext
        $newFullPath = Join-Path -Path $file.DirectoryName -ChildPath $newName

        if ($previewMode) {
            Write-Host "[ONİZLEME-DOSYA] $($file.FullName) -> $newFullPath"
        } else {
            try {
                Rename-Item -Path $file.FullName -NewName $newName -ErrorAction Stop
                $renamedList += "$($file.FullName) -> $newFullPath"
            } catch {
                Write-Host "HATA: $($file.FullName) yeniden adlandırılamadı. $_"
            }
        }
    }
}

# --- Ana işlem ---
switch ($subModeNum) {
    1 { Process-Files -files $allFiles } # Sadece dosyalar
    2 {} # Klasörler zaten işlendi
    3 { Process-Files -files $allFiles } # Dosya ve klasörler
}

# --- Değişiklikleri Listele ---
Write-Host ""
Write-Host "=== YAPILAN DEĞİŞİKLİKLER ==="
if ($renamedList.Count -eq 0) {
    Write-Host "Hiçbir değişiklik yapılmadı."
} else {
    $renamedList | ForEach-Object { Write-Host $_ }
}

# --- Kapanış onayı ---
Write-Host ""
$exitConfirm = Read-Host "Betik kendini kapatabilir, onaylıyor musunuz? (E/H)"
if ($exitConfirm.ToUpper() -eq "E") {
    Write-Host "Betik kapanıyor..."
    exit
} else {
    Write-Host "Betik açık kalacak, manuel olarak kapatabilirsiniz."
    [void][System.Console]::ReadLine()
}
ÖRNEK ÇIKTI (HAYALİ BİR SENARYO) :

Betiği çalıştırdığınızı varsayalım; diyelim ki aşağıdaki gibi dizin yapısı var:

Kod: Tümünü seç

C:\Users\TRWE_2012
│
├─ DOSYALAR
│   ├─ resim.jpg
│   ├─ RESİM.jpg
│   └─ not.txt
│
└─ KLASORLER
    ├─ TÜRKİYE
    ├─ DENEME-1
    └─ DENEME-2

1) Ana Menü Seçimi

Kod: Tümünü seç

=== PowerShell Dosya/Klasör Akıllı Numaralandırıcı ===

1) Sadece dosyaları
2) Sadece klasörleri
3) Dosya ve klasörler
4) Önizleme modu (sadece göster)
Lütfen işlem tipini seçiniz (1-4): 3
2) Dizin Seçimi

Kod: Tümünü seç

İşlem yapılacak ana dizini seçin: C:\Users\TRWE_2012 (Kullanıcıya pencere ile seçtiriliyor)
3) Ana Dizin İsimlendirme (2 ve 3 modlar için)

Kod: Tümünü seç

Ana dizin adı: TRWE_2012
Ana dizin için yeni isim (benzersiz, alt tire eklemeye gerek yok): PROJE_YENİ
4) Alt Dizinler için Tek İsim + Numara

Kod: Tümünü seç

Tüm alt dizinler için kullanılacak tek isim girin: ALT_DIZIN
[ONİZLEME-KLASÖR] C:\Users\TRWE_2012\TÜRKİYE -> C:\Users\TRWE_2012\ALT_DIZIN-1
[ONİZLEME-KLASÖR] C:\Users\TRWE_2012\DENEME-1 -> C:\Users\TRWE_2012\ALT_DIZIN-2
[ONİZLEME-KLASÖR] C:\Users\TRWE_2012\DENEME-2 -> C:\Users\TRWE_2012\ALT_DIZIN-3
5) Dosya İşlemleri

Kod: Tümünü seç

Mevcut dosya adı: resim.jpg
Yeni isim (sadece base name, numara başa/sona eklenebilir): BENIM_RESIMLERIM
[ONİZLEME-DOSYA] C:\Users\TRWE_2012\DOSYALAR\resim.jpg -> C:\Users\TRWE_2012\DOSYALAR\BENIM_RESIMLERIM_1.jpg

Mevcut dosya adı: RESİM.jpg
[ONİZLEME-DOSYA] C:\Users\TRWE_2012\DOSYALAR\RESİM.jpg -> C:\Users\TRWE_2012\DOSYALAR\BENIM_RESIMLERIM_2.jpg

Mevcut dosya adı: not.txt
Yeni isim (sadece base name, numara başa/sona eklenebilir): NOTLAR
[ONİZLEME-DOSYA] C:\Users\TRWE_2012\DOSYALAR\not.txt -> C:\Users\TRWE_2012\DOSYALAR\NOTLAR_1.txt
6) Yapılan Değişiklikler

Kod: Tümünü seç

=== YAPILAN DEĞİŞİKLİKLER ===
C:\Users\TRWE_2012\DOSYALAR\resim.jpg -> C:\Users\TRWE_2012\DOSYALAR\BENIM_RESIMLERIM_1.jpg
C:\Users\TRWE_2012\DOSYALAR\RESİM.jpg -> C:\Users\TRWE_2012\DOSYALAR\BENIM_RESIMLERIM_2.jpg
C:\Users\TRWE_2012\DOSYALAR\not.txt -> C:\Users\TRWE_2012\DOSYALAR\NOTLAR_1.txt
C:\Users\TRWE_2012\TÜRKİYE -> C:\Users\TRWE_2012\ALT_DIZIN-1
C:\Users\TRWE_2012\DENEME-1 -> C:\Users\TRWE_2012\ALT_DIZIN-2
C:\Users\TRWE_2012\DENEME-2 -> C:\Users\TRWE_2012\ALT_DIZIN-3
7) Kapanış Onayı

Kod: Tümünü seç

Betik kendini kapatabilir, onaylıyor musunuz? (E/H): E
Betik kapanıyor...
Bu çıktı örneğinde dosya isimlendirme mekanizması tamamen korunmuş, klasörler tek isim + -1, -2, -3 mantığıyla otomatik numaralandırılır.

Güle güle kullanın...(İyi ki Sordum.net varsın...!!!)
En son TRWE_2012 tarafından 08 Eki 2025, 16:05 tarihinde düzenlendi, toplamda 3 kere düzenlendi.
Kullanıcı avatarı
TRWE_2012
Zettabyte1
Zettabyte1
Mesajlar: 15377
Kayıt: 25 Eyl 2013, 13:38
cinsiyet: Erkek
Teşekkür etti: 2590 kez
Teşekkür edildi: 5460 kez

Re: PowerShell Dosya/Klasör Numaralandırıcı

Mesaj gönderen TRWE_2012 »

Eğer dosya türleri "AYNI" ise kullanıcı ilk dosyanın adını değiştirir ve numara atar, diğer numara atama betik kendisi yapar.

Örnek :

Resimleri.jpg
RESİMLERİM.jpg ise

Kullanıcı ilk dosya'nın ismini değiştirir özgürce....

Resimleri.jpg --------------->>> BENİM_RESMLERİM-1

Betik ilk adlandırma yapısına bakar aynen tekrar eder yalnız numaralandırmayı kendisi yapar.

RESİMLERİM.jpg --------------------->>> BENİM_RESMLERİM-2 (2 sayısını betik atadı,kullanıcı sadece baktı duruma)

Eğer dosya uzantıları farklı ise kullanıcı her uzantı türü için dosyanın ismini kendisi "ÖZGÜRCE" yazacak eğer aynı dosyadan (dosya türünden) varsa gerisini betik otomatik yapacak...Büyük kolaylık PS ortamı...
Cevapla

“Programlama ve Script dilleri” sayfasına dön