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

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

@programming_tips

پروژه – ساخت ابزار خط فرمان ساده (Mini CLI)

در این درسنامه یاد می‌گیریم چطور با استفاده از PowerShell یک ابزار خط فرمان (Command-Line Interface) ساده بسازیم که مثل ابزارهای واقعی CLI کار کند. یعنی بتواند ورودی از کاربر بگیرد، دستورات مختلف را پردازش کند و خروجی مناسب نمایش دهد. چنین ابزاری پایه‌ای برای ساخت Utilityهای مدیریتی، DevOps Scriptها یا حتی ابزارهای شخصی برای اتوماسیون کارهای روزمره است.


۱. مفهوم کلی CLI

ابزارهای خط فرمان (CLI) برنامه‌هایی هستند که از طریق متن و دستور با کاربر ارتباط برقرار می‌کنند، نه از طریق رابط گرافیکی. مثلاً دستور git commit، python script.py یا choco install همگی نمونه‌هایی از CLI هستند. در PowerShell هم می‌توانیم با چند خط کد، ابزار مشابهی بسازیم که از طریق آرگومان‌ها و پارامترها اجرا شود.

در این پروژه هدف ما این است که یک ابزار خط فرمان کوچک بسازیم که بتواند چند دستور ساده را پشتیبانی کند. مثلاً:

  • mycli greet Ali → پیام خوش‌آمد بگوید.
  • mycli time → زمان فعلی را نمایش دهد.
  • mycli sysinfo → اطلاعات سیستم را چاپ کند.

۲. طراحی ساختار کلی

ابتدا باید تصمیم بگیریم ابزار ما چگونه اجرا شود.

می‌خواهیم فایل ما مثلاً mycli.ps1 نام داشته باشد و در زمان اجرا، ورودی‌های کاربر را از $args بگیرد.

PowerShell آرایه‌ای به نام $args دارد که همه آرگومان‌های داده‌شده هنگام اجرای اسکریپت را در خود ذخیره می‌کند.

به عنوان مثال، اگر بنویسیم:

.\mycli.ps1 greet Ali

مقدار $args[0] برابر "greet" و $args[1] برابر "Ali" خواهد بود.


۳. پیاده‌سازی منطق دستورات

ابتدا بررسی می‌کنیم که اصلاً کاربر ورودی داده یا نه:

if ($args.Count -eq 0) {
    Write-Host "Usage: mycli <command> [arguments]"
    exit
}

بعد، دستور اصلی را از $args[0] می‌گیریم:

$command = $args[0]

حالا بر اساس اینکه دستور چه بوده، تصمیم می‌گیریم چه کاری انجام دهیم. برای این کار از switch استفاده می‌کنیم:

switch ($command) {
    'greet' {
        $name = if ($args.Count -gt 1) { $args[1] } else { 'User' }
        Write-Host "Hello, $name! Welcome to Mini CLI."
    }
    'time' {
        $time = Get-Date -Format "HH:mm:ss"
        Write-Host "Current time is: $time"
    }
    'sysinfo' {
        $os = (Get-CimInstance Win32_OperatingSystem).Caption
        $cpu = (Get-CimInstance Win32_Processor).Name
        $ram = [math]::Round((Get-CimInstance Win32_OperatingSystem).TotalVisibleMemorySize / 1MB, 2)
        Write-Host "OS: $os"
        Write-Host "CPU: $cpu"
        Write-Host "RAM: $ram MB"
    }
    Default {
        Write-Host "Unknown command: $command"
        Write-Host "Available commands: greet, time, sysinfo"
    }
}

در اینجا:

  • دستور greet یک پیام خوش‌آمد چاپ می‌کند.
  • دستور time زمان فعلی را نشان می‌دهد.
  • دستور sysinfo اطلاعات سیستم را برمی‌گرداند.
  • هر دستور ناشناخته پیغام خطا می‌دهد.

۴. افزودن کمک (Help)

برای اینکه ابزار حرفه‌ای‌تر شود، بهتر است دستور help هم اضافه کنیم تا راهنمای استفاده را نمایش دهد:

'help' {
    Write-Host "Mini CLI - Commands:"
    Write-Host "  greet [name]   - Display a greeting message"
    Write-Host "  time           - Show current system time"
    Write-Host "  sysinfo        - Show system information"
    Write-Host "  help           - Show this help menu"
}

حالا کاربر می‌تواند بنویسد:

.\mycli.ps1 help

و توضیحات همه دستورات را ببیند.


۵. بهبود تجربه کاربری

می‌توانیم ظاهر خروجی را با رنگ‌ها زیباتر کنیم. مثلاً:

Write-Host "Hello, $name!" -ForegroundColor Green
Write-Host "Current time: $time" -ForegroundColor Cyan
Write-Host "System Info:" -ForegroundColor Yellow

رنگ‌ها کمک می‌کنند خروجی جذاب‌تر و قابل‌خواندن‌تر باشد.


۶. اجرای راحت‌تر CLI

برای اینکه بتوانی CLI را مثل یک دستور واقعی از هر مسیر اجرا کنی، فایل mycli.ps1 را در یک پوشه مخصوص بساز و آن مسیر را به متغیر محیطی PATH اضافه کن.

یا در PowerShell می‌توانی یک alias تعریف کنی:

Set-Alias mycli "C:\Scripts\mycli.ps1"

حالا می‌توانی فقط با نوشتن mycli time آن را اجرا کنی.


۷. اسکریپت کامل Mini CLI

param(
    [Parameter(Mandatory=$false)]
    [string[]]$args
)

if ($args.Count -eq 0) {
    Write-Host "Usage: mycli <command> [arguments]"
    exit
}

$command = $args[0]

switch ($command) {
    'greet' {
        $name = if ($args.Count -gt 1) { $args[1] } else { 'User' }
        Write-Host "Hello, $name!" -ForegroundColor Green
    }
    'time' {
        $time = Get-Date -Format "HH:mm:ss"
        Write-Host "Current time: $time" -ForegroundColor Cyan
    }
    'sysinfo' {
        $os = (Get-CimInstance Win32_OperatingSystem).Caption
        $cpu = (Get-CimInstance Win32_Processor).Name
        $ram = [math]::Round((Get-CimInstance Win32_OperatingSystem).TotalVisibleMemorySize / 1MB, 2)
        Write-Host "OS: $os"
        Write-Host "CPU: $cpu"
        Write-Host "RAM: $ram MB"
    }
    'help' {
        Write-Host "Mini CLI Commands:" -ForegroundColor Yellow
        Write-Host "  greet [name]   - Display a greeting message"
        Write-Host "  time           - Show current system time"
        Write-Host "  sysinfo        - Show system information"
        Write-Host "  help           - Show this help message"
    }
    Default {
        Write-Host "Unknown command: $command" -ForegroundColor Red
        Write-Host "Type 'mycli help' for available commands."
    }
}

۸. گسترش پروژه

بعد از ساخت این CLI ساده، می‌توانی امکانات بیشتری به آن اضافه کنی:

  • مدیریت فایل‌ها (copy, move, delete)
  • اجرای تست پینگ (ping <host>)
  • بررسی وضعیت سرویس‌ها یا CPU
  • ذخیره خروجی‌ها در فایل لاگ

در نهایت، می‌توانی این CLI را با دستور Install-Module در قالب یک ماژول شخصی منتشر کنی تا روی هر سیستم PowerShell دیگری نصب شود.


۹. جمع‌بندی

در این درسنامه یاد گرفتیم چطور یک ابزار خط فرمان کوچک بسازیم که ورودی کاربر را از $args بگیرد، با switch تصمیم بگیرد چه کاری انجام دهد، و خروجی مناسب نمایش دهد. این پروژه ساده، پایه‌ی ساخت ابزارهای DevOps و Utilityهای بزرگ‌تر در PowerShell است و بهت کمک می‌کند طرز کار واقعی ابزارهایی مثل git یا npm را بهتر درک کنی.

Report Page