هل تواجه صعوبة في العثور على الوحدة المثالية لـ 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/