پاورشل برای برنامه‌نویسان

پاورشل برای برنامه‌نویسان

@programming_tips

پروژه – نوشتن یک Script برای Backup اتوماتیک پروژه‌ها

این درسنامه به صورت گام‌به‌گام توضیح می‌دهد که چطور در PowerShell یک اسکریپت بکاپ خودکار پروژه‌ها بنویسیم. این کار برای برنامه‌نویسانی که روی چند پروژه کار می‌کنند یا فایل‌های مهم دارند ضروری است، زیرا باعث می‌شود همیشه نسخه‌ی پشتیبان از کار خود داشته باشند بدون اینکه به‌صورت دستی این کار را انجام دهند.


۱. هدف پروژه

هدف از این اسکریپت این است که:

  • تمام پروژه‌ها از مسیر اصلی (مثلاً C:\Projects) خوانده شوند.
  • هر پروژه در مسیر مقصد (مثلاً D:\Backups) فشرده و ذخیره شود.
  • بکاپ‌ها به‌صورت خودکار نام‌گذاری شوند (مثلاً با تاریخ و ساعت).
  • تنها چند نسخه‌ی آخر نگه داشته شوند تا فضا پر نشود.

۲. پیش‌نیازها

برای اجرای این پروژه به موارد زیر نیاز دارید:

  • آشنایی با دستورات پایه PowerShell
  • آشنایی با کار با فایل‌ها و مسیرها
  • مجوز اجرا (Execution Policy) روی حالت RemoteSigned یا Unrestricted
  • داشتن فضای کافی در محل ذخیره‌ی بکاپ‌ها

۳. طراحی منطق اسکریپت

قبل از نوشتن کد، باید منطق کار مشخص باشد:

  1. تعیین مسیر پروژه‌ها و مسیر بکاپ.
  2. ساخت فولدر جدید با نام تاریخ روز.
  3. فشرده کردن هر پروژه در یک فایل ZIP جداگانه.
  4. حذف بکاپ‌های قدیمی‌تر از تعداد یا روز مشخص.
  5. ثبت گزارش عملیات در یک فایل لاگ.

۴. نوشتن کد مرحله‌به‌مرحله

مرحله ۱: تعیین مسیرها

ابتدا مسیر منبع و مقصد را مشخص می‌کنیم:

$sourcePath = "C:\Projects"
$backupPath = "D:\Backups"

مرحله ۲: ساخت فولدر بکاپ با نام تاریخ

نام فولدر را بر اساس تاریخ روز می‌سازیم:

$date = Get-Date -Format "yyyy-MM-dd_HH-mm"
$newBackupFolder = Join-Path $backupPath $date
New-Item -ItemType Directory -Path $newBackupFolder | Out-Null

مرحله ۳: فشرده کردن پروژه‌ها

تمام پوشه‌های داخل مسیر پروژه را پیدا می‌کنیم و یکی‌یکی فشرده می‌کنیم:

Get-ChildItem -Path $sourcePath -Directory | ForEach-Object {
    $projectName = $_.Name
    $zipPath = "$newBackupFolder\$projectName.zip"
    Compress-Archive -Path $_.FullName -DestinationPath $zipPath
    Write-Host "✅ Backup created for $projectName"
}

مرحله ۴: حذف بکاپ‌های قدیمی

برای جلوگیری از پر شدن فضا، مثلاً فقط ۵ نسخه‌ی آخر را نگه می‌داریم:

$backups = Get-ChildItem -Path $backupPath -Directory | Sort-Object CreationTime -Descending
$oldBackups = $backups | Select-Object -Skip 5
$oldBackups | ForEach-Object { Remove-Item $_.FullName -Recurse -Force }

مرحله ۵: ثبت گزارش

در انتهای کار یک فایل لاگ تولید می‌کنیم که عملیات بکاپ در آن ثبت شود:

$logFile = "$backupPath\backup_log.txt"
$logEntry = "$(Get-Date) - Backup completed successfully in $newBackupFolder"
Add-Content -Path $logFile -Value $logEntry

۵. خودکارسازی اجرای اسکریپت

برای اجرای خودکار این اسکریپت می‌توان از Task Scheduler ویندوز استفاده کرد:

  1. Task Scheduler را باز کنید.
  2. روی “Create Task” کلیک کنید.
  3. در تب “Triggers” تعیین کنید مثلاً هر شب ساعت ۲ صبح اجرا شود.
  4. در تب “Actions” مسیر اجرای PowerShell را بدهید و اسکریپت خود را به‌صورت زیر فراخوانی کنید:
powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\BackupProjects.ps1"
  1. روی OK بزنید تا زمان‌بندی فعال شود.

از این به بعد، PowerShell به‌صورت خودکار هر شب از پروژه‌ها بکاپ می‌گیرد.


۶. بهبودهای پیشنهادی

بعد از پیاده‌سازی نسخه‌ی پایه، می‌توانید ویژگی‌های زیر را هم اضافه کنید:

  • ارسال اعلان یا ایمیل بعد از اتمام بکاپ.
  • بررسی فضای خالی دیسک قبل از شروع عملیات.
  • هش کردن فایل‌ها برای اطمینان از صحت بکاپ.
  • رمزنگاری فایل‌های ZIP برای امنیت بیشتر.
  • استفاده از پارامترها (param()) برای تعیین مسیرها به‌صورت پویا.

۷. نمونه نهایی اسکریپت

param(
    [string]$sourcePath = "C:\Projects",
    [string]$backupPath = "D:\Backups"
)

$date = Get-Date -Format "yyyy-MM-dd_HH-mm"
$newBackupFolder = Join-Path $backupPath $date
New-Item -ItemType Directory -Path $newBackupFolder | Out-Null

Get-ChildItem -Path $sourcePath -Directory | ForEach-Object {
    $zipPath = "$newBackupFolder\$($_.Name).zip"
    Compress-Archive -Path $_.FullName -DestinationPath $zipPath
}

$backups = Get-ChildItem -Path $backupPath -Directory | Sort-Object CreationTime -Descending
$oldBackups = $backups | Select-Object -Skip 5
$oldBackups | ForEach-Object { Remove-Item $_.FullName -Recurse -Force }

$logFile = "$backupPath\backup_log.txt"
Add-Content -Path $logFile -Value "$(Get-Date) - Backup completed: $newBackupFolder"

جمع‌بندی

این پروژه به شما یاد داد که چگونه با استفاده از PowerShell یک سیستم بکاپ خودکار و قابل اطمینان بسازید. با کمی تغییر، می‌توانید آن را برای سرورها، فایل‌های کاری، یا حتی پوشه‌های شخصی هم به کار ببرید.

مزیت اصلی این روش، سادگی، قابل تنظیم بودن و اتوماتیک شدن فرآیند است — بدون نیاز به نرم‌افزارهای پیچیده یا پرداخت هزینه.

Report Page