From c8adcb0886e9fca2a8b931e734aa3180a990b144 Mon Sep 17 00:00:00 2001 From: hololu Date: Mon, 15 Dec 2025 03:00:11 +0300 Subject: [PATCH] first commit --- BackupFolder.ps1 | 181 +++++++++++++++++++++++++++++++++++++++++++++-- README.md | 33 ++++++--- yapi.md | 11 ++- 3 files changed, 211 insertions(+), 14 deletions(-) diff --git a/BackupFolder.ps1 b/BackupFolder.ps1 index 9ae4b86..6c5da6c 100644 --- a/BackupFolder.ps1 +++ b/BackupFolder.ps1 @@ -25,12 +25,126 @@ function Show-Message { [System.Windows.Forms.MessageBox]::Show($Message, $Title, 0, $icon) | Out-Null } +# Function to show confirmation dialog with Yes/No options +function Show-Confirmation { + param( + [string]$Message, + [string]$Title = "Klasör Yedekleme" + ) + + [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null + $result = [System.Windows.Forms.MessageBox]::Show($Message, $Title, 4, 64) # 4 = YesNo buttons, 64 = Information icon + return ($result -eq "Yes") +} + +# Function to show advanced options dialog +function Show-AdvancedOptions { + param( + [string]$Message, + [string]$Title = "Geliþtirme Klasörleri Bulundu" + ) + + # Create a form with custom buttons + Add-Type -AssemblyName System.Windows.Forms + + $form = New-Object System.Windows.Forms.Form + $form.Text = $Title + $form.Size = New-Object System.Drawing.Size(400, 200) + $form.StartPosition = "CenterScreen" + $form.FormBorderStyle = "FixedDialog" + $form.Topmost = $true + + # Add label with message + $label = New-Object System.Windows.Forms.Label + $label.Location = New-Object System.Drawing.Point(10, 20) + $label.Size = New-Object System.Drawing.Size(360, 80) + $label.Text = $Message + $label.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 9) + $form.Controls.Add($label) + + # Add "Include All" button + $buttonIncludeAll = New-Object System.Windows.Forms.Button + $buttonIncludeAll.Location = New-Object System.Drawing.Point(10, 120) + $buttonIncludeAll.Size = New-Object System.Drawing.Size(100, 30) + $buttonIncludeAll.Text = "Tümünü Dahil Et" + $buttonIncludeAll.DialogResult = "OK" + $form.Controls.Add($buttonIncludeAll) + + # Add "Skip Dev Folders" button + $buttonSkip = New-Object System.Windows.Forms.Button + $buttonSkip.Location = New-Object System.Drawing.Point(120, 120) + $buttonSkip.Size = New-Object System.Drawing.Size(120, 30) + $buttonSkip.Text = "Dev Klasörleri Atla" + $buttonSkip.DialogResult = "Yes" + $form.Controls.Add($buttonSkip) + + # Add "Cancel" button + $buttonCancel = New-Object System.Windows.Forms.Button + $buttonCancel.Location = New-Object System.Drawing.Point(250, 120) + $buttonCancel.Size = New-Object System.Drawing.Size(100, 30) + $buttonCancel.Text = "Ýptal" + $buttonCancel.DialogResult = "No" + $form.Controls.Add($buttonCancel) + + # Set default button + $form.AcceptButton = $buttonIncludeAll + $form.CancelButton = $buttonCancel + + # Show dialog and return result + $result = $form.ShowDialog() + return $result +} + # Check if folder exists if (-not (Test-Path $FolderPath)) { Show-Message -Message "Belirtilen klasör mevcut deðil: $FolderPath" -Type 1 exit 1 } +# Define common development folders that should be excluded +$ExcludedFolders = @("node_modules", "vendor", "build", "dist", ".git", ".svn", "bin", "obj") + +# Check if the folder contains any development directories +$HasDevFolders = $false +$FoundDevFolders = @() +$SkipDevFolders = $false + +foreach ($excludedFolder in $ExcludedFolders) { + $devFolderPath = Join-Path $FolderPath $excludedFolder + if (Test-Path $devFolderPath) { + $HasDevFolders = $true + $FoundDevFolders += $excludedFolder + } +} + +# If development folders are found, prompt user for action +if ($HasDevFolders) { + $folderList = ($FoundDevFolders -join ", ") + $message = "Bu klasör aþaðýdaki geliþtirme klasörlerini içeriyor:`n$folderList`n`nBu klasörleri yedeklemeye ne yapmak istersiniz?" + + $userChoice = Show-AdvancedOptions -Message $message -Title "Geliþtirme Klasörleri Bulundu" + + switch ($userChoice) { + "No" { + # Cancel backup + Show-Message -Message "Yedekleme iptal edildi." -Type 2 + exit 0 + } + "Yes" { + # Skip dev folders + $SkipDevFolders = $true + } + "OK" { + # Include all folders - continue normally + } + default { + # Cancel backup for any other response + Show-Message -Message "Yedekleme iptal edildi." -Type 2 + exit 0 + } + } +} + # Get folder name $FolderName = Split-Path $FolderPath -Leaf @@ -75,8 +189,8 @@ if ($UseWinRar) { } try { - if ($UseWinRar) { - # Use WinRAR + if ($UseWinRar -and -not $SkipDevFolders) { + # Use WinRAR (full backup) # Change to the parent directory and use relative path to avoid full path in archive Push-Location $OutputDir try { @@ -87,8 +201,24 @@ try { Pop-Location } } - elseif ($UseSevenZip) { - # Use 7-Zip + elseif ($UseWinRar -and $SkipDevFolders) { + # Use WinRAR with exclusion patterns + Push-Location $OutputDir + try { + # Build exclusion arguments for each dev folder + $ExcludeArgs = "" + foreach ($excludedFolder in $ExcludedFolders) { + $ExcludeArgs += " -x`".\$FolderName\$excludedFolder\*`"" + } + $Arguments = "a -r $ExcludeArgs `"$OutputFile`" `".\$FolderName`"" + Start-Process -FilePath $WinRarPath -ArgumentList $Arguments -Wait -NoNewWindow + } + finally { + Pop-Location + } + } + elseif ($UseSevenZip -and -not $SkipDevFolders) { + # Use 7-Zip (full backup) # Change to the parent directory and use relative path to avoid full path in archive Push-Location $OutputDir try { @@ -99,12 +229,53 @@ try { Pop-Location } } + elseif ($UseSevenZip -and $SkipDevFolders) { + # Use 7-Zip with exclusion patterns + Push-Location $OutputDir + try { + # Build exclusion arguments for each dev folder + $ExcludeArgs = "" + foreach ($excludedFolder in $ExcludedFolders) { + $ExcludeArgs += " -x!$FolderName\$excludedFolder\*" + } + $Arguments = "a $ExcludeArgs `"$OutputFile`" `".\$FolderName`"" + Start-Process -FilePath $SevenZipPath -ArgumentList $Arguments -Wait -NoNewWindow + } + finally { + Pop-Location + } + } else { # Use PowerShell built-in Compress-Archive # Fix the path issue by changing to the parent directory and using relative path Push-Location $OutputDir try { - Compress-Archive -Path ".\$FolderName" -DestinationPath $OutputFile -Force + if ($SkipDevFolders) { + # For PowerShell, we need to manually filter out dev folders + # Get all items except the excluded ones + $ItemsToCompress = Get-ChildItem -Path ".\$FolderName" -Recurse | Where-Object { + $itemPath = $_.FullName.Substring((Resolve-Path ".\$FolderName").Path.Length) + $shouldExclude = $false + foreach ($excludedFolder in $ExcludedFolders) { + if ($itemPath -like "\$excludedFolder*" -or $itemPath -like "*\$excludedFolder*" -or $itemPath -like "*\$excludedFolder\*") { + $shouldExclude = $true + break + } + } + -not $shouldExclude + } + + if ($ItemsToCompress) { + Compress-Archive -Path $ItemsToCompress.FullName -DestinationPath $OutputFile -Force + } else { + # If no items left after filtering, create an empty archive with just the folder structure + Compress-Archive -Path ".\$FolderName" -DestinationPath $OutputFile -Force + # Then remove the dev folders from the archive (this is complex, so we'll just warn the user) + Show-Message -Message "NOT: PowerShell ile dev klasörlerini atlamak tam olarak mümkün deðildir. Tüm klasörler yedeklendi.`n`nGelecek sürümlerde bu özellik WinRAR veya 7-Zip ile daha iyi çalýþacaktýr." -Type 2 + } + } else { + Compress-Archive -Path ".\$FolderName" -DestinationPath $OutputFile -Force + } } finally { Pop-Location diff --git a/README.md b/README.md index 1955d0e..d0c9f50 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ Bu araç, klasörler için Windows saÄŸ tık menüsüne "Yedekle ve Sıkıştır - WinRAR, 7-Zip veya PowerShell'in yerleÅŸik sıkıştırma özelliÄŸini destekler - Türkçe karakterleri doÄŸru ÅŸekilde iÅŸler - Aynı gün içinde yapılan çoklu yedeklemeler için otomatik numaralandırma +- GeliÅŸtirme klasörlerini (node_modules, vendor, vs.) yedeklemeden önce kullanıcıya sorar +- GeliÅŸmiÅŸ seçenekler: "Tümünü Dahil Et", "Dev Klasörleri Atla", "İptal" ### Kurulum @@ -21,7 +23,11 @@ Bu araç, klasörler için Windows saÄŸ tık menüsüne "Yedekle ve Sıkıştır 1. Windows Explorer'da herhangi bir klasörün veya boÅŸ alanın üzerine saÄŸ tıklayın 2. "Yedekle ve Sıkıştır" seçeneÄŸini seçin -3. Yedekleme, aÅŸağıdaki formatta aynı dizinde oluÅŸturulacak: +3. EÄŸer klasörde geliÅŸtirme klasörleri (node_modules, vendor, build, dist, .git, vs.) varsa, üç seçenek sunulur: + - "Tümünü Dahil Et": Tüm klasörleri yedekler (önceki davranış) + - "Dev Klasörleri Atla": GeliÅŸtirme klasörlerini hariç tutar (yer ve zaman tasarrufu saÄŸlar) + - "İptal": Yedekleme iÅŸlemini iptal eder +4. Yedekleme, aÅŸağıdaki formatta aynı dizinde oluÅŸturulacak: `__.rar` (veya WinRAR mevcut deÄŸilse .zip) ### Kaldırma @@ -33,7 +39,7 @@ Bu araç, klasörler için Windows saÄŸ tık menüsüne "Yedekle ve Sıkıştır - Windows 10 veya 11 - PowerShell 5.1 veya sonrası -- İsteÄŸe baÄŸlı: Daha iyi sıkıştırma seçenekleri için WinRAR veya 7-Zip +- İsteÄŸe baÄŸlı: Daha iyi sıkıştırma ve dışlama seçenekleri için WinRAR veya 7-Zip ## English Description @@ -49,6 +55,8 @@ This tool adds a "Yedekle ve Sıkıştır" (Backup and Compress) option to the W - Handles Turkish characters correctly with ANSI encoding - Automatic numbering for multiple backups in the same day - All messages and interface elements are available in both Turkish and English +- Asks user before backing up development folders (node_modules, vendor, etc.) +- Advanced options: "Include All", "Skip Dev Folders", "Cancel" ## Installation @@ -59,7 +67,11 @@ This tool adds a "Yedekle ve Sıkıştır" (Backup and Compress) option to the W 1. Right-click on any folder or in empty space in Windows Explorer 2. Select "Yedekle ve Sıkıştır" -3. The backup will be created in the same directory with the format: +3. If the folder contains development folders (node_modules, vendor, build, dist, .git, etc.), three options are presented: + - "Tümünü Dahil Et" (Include All): Backs up all folders (previous behavior) + - "Dev Klasörleri Atla" (Skip Dev Folders): Excludes development folders (saves space and time) + - "İptal" (Cancel): Cancels the backup operation +4. The backup will be created in the same directory with the format: `__.rar` (or .zip if WinRAR is not available) ## Uninstallation @@ -71,15 +83,17 @@ This tool adds a "Yedekle ve Sıkıştır" (Backup and Compress) option to the W - Windows 10 or 11 - PowerShell 5.1 or later -- Optional: WinRAR or 7-Zip for better compression options +- Optional: WinRAR or 7-Zip for better compression and exclusion options ## How It Works The installer adds registry entries that integrate with Windows Explorer context menus. When selected, it runs the PowerShell script that: 1. Determines the next backup number by scanning existing backups -2. Uses WinRAR, 7-Zip, or PowerShell's Compress-Archive (in order of preference) -3. Creates the backup with the proper naming convention -4. Shows success or error messages in Turkish or English +2. Checks for development folders and prompts user for inclusion +3. Uses WinRAR, 7-Zip, or PowerShell's Compress-Archive (in order of preference) +4. Applies exclusion patterns when "Skip Dev Folders" is selected +5. Creates the backup with the proper naming convention +6. Shows success or error messages in Turkish or English ## Recent Improvements @@ -87,4 +101,7 @@ The installer adds registry entries that integrate with Windows Explorer context - Updated all messages and interface elements to support both Turkish and English - Improved file naming consistency with proper variable expansion - Enhanced path handling to compress only selected folder content without full directory paths -- Added admin rights checking for installation and uninstallation scripts \ No newline at end of file +- Added admin rights checking for installation and uninstallation scripts +- Added development folder detection and user confirmation before backup +- Added advanced options dialog with "Include All", "Skip Dev Folders", and "Cancel" choices +- Implemented exclusion patterns for WinRAR and 7-Zip (PowerShell limitation noted) \ No newline at end of file diff --git a/yapi.md b/yapi.md index 2e4589a..9a32adf 100644 --- a/yapi.md +++ b/yapi.md @@ -29,6 +29,15 @@ Windows gezgininde bir klasör üzerindeyken saÄŸ tıkladığımda çıkan menü - Sıkıştırma baÅŸarısız olursa hata mesajı göster - Yedekleme baÅŸarılı olursa bildirim göster +6. **GeliÅŸtirme Klasörü Tespiti:** + - node_modules, vendor, build, dist, .git gibi geliÅŸtirme klasörlerini tespit et + - Bu klasörler bulunursa kullanıcıya yedeklemeye dahil edilip edilmeyeceÄŸini sor + - Üç seçenek sun: "Tümünü Dahil Et", "Dev Klasörleri Atla", "İptal" + +7. **Dışlama İşlevi:** + - "Dev Klasörleri Atla" seçilirse, WinRAR veya 7-Zip için dışlama kalıpları uygula + - PowerShell için sınırlı dışlama desteÄŸi (uyarı mesajı ile) + **Çıktı:** - Gerekli tüm dosyaları içeren çalışır bir çözüm (batch script, PowerShell script veya küçük bir executable) - Registry deÄŸiÅŸikliklerini otomatik yapan kurulum scripti @@ -38,4 +47,4 @@ Windows gezgininde bir klasör üzerindeyken saÄŸ tıkladığımda çıkan menü **Teknik Notlar:** - Windows 10/11 uyumlu olmalı - Yönetici hakları gerektiriyorsa bunu belirt -- Türkçe karakterleri (ÅŸ, ÄŸ, ü, ö, ç, ı) doÄŸru iÅŸlemeli +- Türkçe karakterleri (ÅŸ, ÄŸ, ü, ö, ç, ı) doÄŸru iÅŸlemeli \ No newline at end of file