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

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

@programming_tips

درسنامه: کار با داده‌ها در Pipeline


۱. انتخاب Propertyهای دلخواه — Select-Object

دستور Select-Object به شما امکان می‌دهد فقط ویژگی‌های مورد نظر یک شی را نمایش دهید یا خروجی را محدود کنید.

مثال:

Get-Process | Select-Object -First 3
  • -First 3 سه شی اول خروجی را می‌گیرد.
Get-Process | Select-Object ProcessName, Id
  • فقط دو Property ProcessName و Id را نمایش می‌دهد.

ویژگی‌های پیشرفته

  • -Property: مشخص می‌کند چه ویژگی‌هایی نمایش داده شوند.
  • -ExcludeProperty: ویژگی‌های مشخص شده را حذف می‌کند.
  • -Unique: خروجی یکتا برمی‌گرداند.
Get-Service | Select-Object -Property Name, Status -Unique

۲. فیلتر کردن اشیا — Where-Object

Where-Object اجازه می‌دهد فقط اشیائی که شرایط مشخصی دارند عبور کنند. برای ارزیابی شرط، از متغیر خودکار $_ استفاده می‌کنیم که به شی فعلی در Pipeline اشاره دارد.

مثال:

Get-Process | Where-Object { $_.CPU -gt 50 }
  • این دستور فقط فرآیندهایی را نشان می‌دهد که CPU بیشتری از 50 مصرف می‌کنند.
Get-Service | Where-Object { $_.Status -eq "Running" }
  • فقط سرویس‌های در حال اجرا را نمایش می‌دهد.

نکات:

  • -eq, -ne, -gt, -lt, -ge, -le عملگرهای مقایسه‌ای هستند.
  • شرط می‌تواند ترکیبی باشد:
Get-Process | Where-Object { $_.CPU -gt 50 -and $_.Handles -gt 1000 }

۳. اجرای دستور روی هر شی — ForEach-Object

ForEach-Object اجازه می‌دهد روی هر شی در Pipeline عملیات خاصی انجام دهید.

مثال ساده:

Get-Process | ForEach-Object { $_.ProcessName }
  • نام همه فرآیندها را چاپ می‌کند.
Get-Service | ForEach-Object { 
    if ($_.Status -eq "Running") { 
        Write-Output "$($_.Name) is running" 
    }
}
  • این دستور برای هر سرویس وضعیت آن را بررسی و چاپ می‌کند.

تفاوت Where-Object و ForEach-Object

  • Where-Object: فیلتر می‌کند، یعنی فقط اشیاء مطابق شرط را عبور می‌دهد.
  • ForEach-Object: کاری روی هر شی انجام می‌دهد، می‌تواند اشیاء را تغییر دهد، چاپ کند یا خروجی جدید تولید کند.

ترکیب دستورات

PowerShell قدرتمند است چون می‌توان این دستورات را با هم ترکیب کرد:

Get-Process | 
    Where-Object { $_.CPU -gt 50 } |
    Select-Object -Property ProcessName, CPU |
    ForEach-Object { Write-Output "Process $($_.ProcessName) uses $($_.CPU) CPU" }

در این مثال:

  1. ابتدا فرآیندهایی که CPU زیادی مصرف می‌کنند فیلتر می‌شوند.
  2. سپس فقط ویژگی‌های ProcessName و CPU انتخاب می‌شوند.
  3. در نهایت برای هر شی پیغام مشخصی چاپ می‌شود.

جمع‌بندی

  • Select-Object: انتخاب ویژگی‌های خاص از هر شی
  • Where-Object: فیلتر کردن اشیاء بر اساس شرط
  • ForEach-Object: اجرای دستورات روی هر شی

با ترکیب این سه دستور، می‌توان خروجی‌های پیچیده را به راحتی پردازش و تبدیل کرد بدون اینکه نیازی به نوشتن حلقه‌های طولانی یا پردازش متن باشد.


تمرین پیشنهادی:

  1. خروجی Get-Service را بگیر و فقط سرویس‌هایی که در حال اجرا هستند را با Where-Object نمایش بده.
  2. از Select-Object استفاده کن و فقط نام و وضعیت آن‌ها را چاپ کن.
  3. با ForEach-Object برای هر سرویس پیام بده: "Service <Name> is <Status>".

Report Page