إنشاء وحدة PowerShell في العالم الحقيقي: تشييد الوظائف

هل تواجه صعوبة في العثور على الوحدة المثالية لـ PowerShell التي تناسب حالتك الفريدة؟ مع الآلاف من الوحدات المتاحة، قد تشعر وكأنه ينبغي عليك الاكتفاء بما هو متاح. حسنًا، هذا قد يترك حلاك غير كامل أو غير كفء. لماذا لا تبدأ في إنشاء الوحدات بدلاً من ذلك؟

سيرشدك هذا الدليل خطوة بخطوة في إنشاء الوحدات لبناء حلول قوية وقابلة لإعادة الاستخدام تتناسب مع احتياجاتك.

حوّل نصوصك إلى كتل بناء قوية يمكنك إعادة استخدامها عبر مشاريع مختلفة!

بناء وحدة جرد الحواسيب

في هذا الدليل، سنقوم بإنشاء وحدة PowerShell لجمع معلومات عتاد الحاسوب. ستساعد هذه الوحدة مسؤولي النظام في جمع المعلومات والتقارير حول الذاكرة والتخزين وتفاصيل المعالج عبر أنظمة متعددة.

ستتميز وحدتنا بما يلي:

  • وظائف لجمع معلومات العتاد المحددة
  • دعم الأنظمة عن بعد باستخدام جلسات PowerShell
  • تنسيق الإخراج الموحد لتقارير متسقة

توضح هذه النموذج العملي مفاهيم تطوير الوحدات الأساسية أثناء إنشاء أداة مفيدة لإدارة النظام.

إعداد وحدة PowerShell

قد يصبح إدارة نصوصك عبر أنظمة متعددة فوضوية بسرعة. ولكن عندما تصبح سير عملك معركة صعبة، تكون الوحدات في PowerShell مفيدة. الوحدة هي طريقة منظمة لتجميع النصوص وإعادة استخدامها لتوفير الوقت وتقليل الأخطاء.

لنجمع بين المفاهيم الأساسية لبناء وحدة PowerShell.

ابدأ بإنشاء دليل الوحدة وتحديد الوحدة نفسها لتنظيم عملك.

## Create the module directory in the all-user location
mkdir 'C:\Program Files\PowerShell\Modules\ComputerInventory'

## Create the module to hold the module functions
Set-Content -Path 'C:\Program Files\PowerShell\Modules\ComputerInventory\ComputerInventory.psm1' -Value ''

الأمر Set-Content ينشئ وحدة تسمى ComputerInventory في مسار المستخدم العام. تم اختيار هذا الموقع لأنه يجعل الوحدة متاحة لأي شخص يقوم بتسجيل الدخول إلى الجهاز، وهو أمر حاسم في بيئات الشركات حيث يحتاج مستخدمون متعددون إلى الوصول إلى نفس وظائف PowerShell. على عكس المواقع المحددة لكل مستخدم، يضمن هذا المسار المركزي توافر الوحدة بشكل متسق وإدارة أسهل عبر النظام.

تحقق من توافر الوحدة:

## The module is already showing up as available
Get-Module ComputerInventory -ListAvailable

على الرغم من أنها تعمل حاليًا كغلاف، إلا أن هذا يؤكد أنها ستحمل بشكل جيد لاحقًا.

وظائف الهيكلة

الوحدة المنظمة بشكل جيد أمر حاسم، ولكن ما بداخلها يجعلها مفيدة حقًا. تجنب إضاعة الوقت في محاولة معرفة ما يقوم به كل جزء بدلاً من كونك إنتاجيًا من خلال إنشاء هياكل لوظائف وحدتك.

افتح الوحدة في محرر نصوص مثل VS Code، ثم قم بإنشاء هياكل للوظائف.

ابدأ بإنشاء وظائف علامة مكانية تحمل أسماء وصفية.

function Get-MemoryInfo {
    [CmdletBinding()]
    param()

}

function Get-StorageInfo {
    [CmdletBinding()]
    param()

}

function Get-ProcessorInfo {
    [CmdletBinding()]
    param()

}

تتبع أسماء الوظائف نمط تسمية الفعل-الاسم بشكل متسق.

تتبع أسماء الوظائف في PowerShell نمط تسمية الفعل-الاسم، وهو نمط تسمية موحد. في هذه الحالة، تم تسمية الوظائف على النحو التالي:

  • Get-MemoryInfo
  • Get-StorageInfo
  • Get-ProcessorInfo

يبدأ اسم كل وظيفة بالفعل “Get” (مما يشير إلى استرجاع المعلومات) تليه اسم يصف المعلومات التي يقوم بإحضارها (الذاكرة، التخزين، أو المعالج).

هذا التعيين المسمى مهم في PowerShell لأنه يجعل الوظائف قابلة للتنبؤ وأسهل فهمًا – يمكن للمستخدمين فهم ما تفعله الوظيفة بسرعة فقط من خلال النظر إلى اسمها.

تحقق من وجودهم عن طريق تشغيل الأمر التالي:

Get-Command -Module ComputerInventory

عند تشغيل الأمر Get-Command -Module ComputerInventory، سترى نتائج مماثلة لهذا:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-MemoryInfo                                     1.0.0      ComputerInventory
Function        Get-ProcessorInfo                                  1.0.0      ComputerInventory
Function        Get-StorageInfo                                    1.0.0      ComputerInventory

هذا الأمر يعرض جميع الوظائف المتاحة في وحدة ComputerInventory، والتي تتضمن الوظائف الثلاث التي أنشأناها: Get-MemoryInfo، Get-StorageInfo، و Get-ProcessorInfo.

في هذه المرحلة، تتضمن الوحدة أغلفة وظائف. دعونا نعزز هذه الوظائف من خلال تعريف إخراج متسق باستخدام كائنات مخصصة.

الإخراج الموحَّد باستخدام كائنات مخصصة

الإخراج غير المتسق عبر النصوص يمكن أن يحول مهمة بسيطة إلى كابوس من تحليل البيانات واستكشاف الأخطاء وإصلاحها. في تطوير PowerShell المهني، ضمان الإخراج المتسق يعد ركيزة أساسية للبرمجة الفعالة.

توحيد الإخراج باستخدام كائنات مخصصة يساعد في الحفاظ على التوافق عبر الوظائف.

في النص البرمجي التالي:

  • تتضمن الكائنات المخصصة الخصائص ComputerName، HardwareCategory، و Info.
  • تجمع خاصية HardwareCategory أنواع الأجهزة المماثلة، وتم تصميم ComputerName لقابلية التوسع عبر أجهزة الكمبيوتر المتعددة.
function Get-MemoryInfo {
    [CmdletBinding()]
    param()

    $outObject = @{
        'ComputerName'      = ''
        'HardwareCategory'  = 'Memory'
        'Info'              = $null
    }

    $outObject
}

function Get-StorageInfo {
    [CmdletBinding()]
    param()

    $outObject = @{
        'ComputerName'      = ''
        'HardwareCategory'  = 'Storage'
        'Info'              = $null
    }

    $outObject
}

function Get-ProcessorInfo {
    [CmdletBinding()]
    param()

    $outObject = @{
        'ComputerName'      = ''
        'HardwareCategory'  = 'Processor'
        'Info'              = $null
    }

    $outObject
}

أولاً، دعونا نقوم بإعادة استيراد الوحدة للتأكد من أن لدينا أحدث إصدار:

Import-Module ComputerInventory -Force

الآن يمكنك تشغيل الوظائف لرؤية إخراجها:

PS> Get-MemoryInfo
Name                           Value
----                           -----
Info                           
HardwareCategory              Memory
ComputerName                  

PS> Get-StorageInfo
Name                           Value
----                           -----
Info                           
HardwareCategory              Storage
ComputerName                  

PS> Get-ProcessorInfo
Name                           Value
----                           -----
Info                           
HardwareCategory              Processor
ComputerName

كل وظيفة تُرجع جدول تجزئة بخصائص ComputerName و Info فارغة، ولكن مع تعريف فئات الأجهزة الخاصة بها.

إضافة معلمة جلسة لدعم عن بُعد

تخيل الحاجة إلى تشغيل النصوص الخاصة بك عبر عشرات أو حتى مئات الحواسيب. إذا كانت كل وظيفة تتطلب تحديد اسم الكمبيوتر يدويًا، سيكون الأمر مُعقدًا ومُعرضًا للخطأ. لحسن الحظ، يوفر التشغيل عن بُعد في PowerShell حلاً.

بدلًا من معلمة ComputerName، استخدم معلمة Session للاستفادة من التشغيل عن بُعد في PowerShell:

function Get-MemoryInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Memory'
        'Info'              = $null
    }

    $outObject
}

function Get-StorageInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Storage'
        'Info'              = $null
    }

    $outObject
}

function Get-ProcessorInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Processor'
        'Info'              = $null
    }

    $outObject
}

تضمن هذه المعلمة المرونة عند توسيع النظام إلى أنظمة متعددة.

تم تصميم معلمة الجلسة لاستخدام التشغيل عن بُعد في PowerShell لتنفيذ الأوامر على الحواسيب عن بُعد. إليك ما يجعلها قوية:

  • تم تعريف معلمة الجلسة كمعلمة إلزامية تقبل كائن PSSession (بنوع System.Management.Automation.Runspaces.PSSession)
  • توفر معلمة الجلسة اسم الكمبيوتر تلقائيًا من خلال $Session.ComputerName، الذي يتم ملؤه في الكائن الناتج

تقدم هذه النهج عدة مزايا:

  • تسمح بتوسيع كفاءة العمل عند العمل مع أنظمة متعددة
  • بدلًا من إنشاء اتصالات جديدة لكل أمر، يمكنك إعادة استخدام نفس الجلسة لعمليات متعددة، مما يكون أكثر كفاءة من إنشاء اتصالات فردية لكل استدعاء للوظيفة
  • يمكنك اختبار الوظائف عن طريق إنشاء جلسة واحدة فقط واستخدامها عبر جميع وظائف المخزون، كما هو موضح في المثال حيث تم إنشاء جلسة اختبارية باستخدام: $testSession = New-PSSession -ComputerName SRV2

احفظ وأعد استيراد الوحدة:

ipmo ComputerInventory -Force

اختبار الوظائف

كيف تضمن أن تعمل الوحدة بعد بنائها؟ الاختبارات ضرورية للتأكد من أن وظائف الوحدة تعمل كما هو متوقع وتقوم بإرجاع بيانات دقيقة. تخطي هذه الخطوة قد يؤدي إلى مفاجآت في بيئات الإنتاج.

أنشئ جلسة عن بعد واختبر الوحدة:

$testSession = New-PSSession -ComputerName SRV2

Get-MemoryInfo -Session $testSession
Get-StorageInfo -Session $testSession
Get-ProcessorInfo -Session $testSession

يجب على كل وظيفة إرجاع كائن يحتوي على الخصائص المتوقعة واسم الكمبيوتر الصحيح. تشكل هذه الوظائف أساس أداة جرد قوية.

بناءً على الكود المعروض، عند اختبار هذه الوظائف مع جلسة عن بعد، سيكون الإخراج شيئًا مشابهًا لهذا:

PS> $testSession = New-PSSession -ComputerName SRV2
PS> Get-MemoryInfo -Session $testSession
Name                           Value
----                           -----
Info                           
HardwareCategory              Memory
ComputerName                  SRV2

PS> Get-StorageInfo -Session $testSession
Name                           Value
----                           -----
Info                           
HardwareCategory              Storage
ComputerName                  SRV2

PS> Get-ProcessorInfo -Session $testSession
Name                           Value
----                           -----
Info                           
HardwareCategory              Processor
ComputerName                  SRV2

تعيد كل وظيفة hashtable تحتوي على اسم الكمبيوتر (من الجلسة)، فئة الأجهزة المحددة، وحقل معلومات (حاليًا فارغ ولكنه مصمم لاحتواء المعلومات الفعلية للأجهزة).

الاستنتاج

في هذه المقالة، تعلمت لماذا إنشاء وحدات PowerShell الخاصة بك أمر أساسي لمواجهة التحديات الفريدة التي لا يمكن لأي وحدة جاهزة التعامل معها. استكشفنا كيف يمكن أن تكون الوحدات المخصصة محدثًا لإعدادات أو عمليات متخصصة داخل بيئتك.

هذا هو مجرد بداية رحلتنا مع وحدة ComputerInventory. في المقالات القادمة على المدونة، سنوسع هذه الأسس من خلال إضافة قدرات جمع معلومات الأجهزة الحقيقية، ومعالجة الأخطاء، وميزات الإدارة عن بعد المتقدمة.

ترقبوا كما نحوّل هذا الإطار الأساسي إلى أداة قوية لمديري النظام!

Source:
https://adamtheautomator.com/powershell-module-functions/