أساسيّات أوامر PowerShell ── العمليّات الأولى الواجب تعلّمها والاستخدام الآمن
· آخر تحديث: · غو كومورا · PowerShell, Windows, سطر الأوامر, الأتمتة, الاستفادة من الأصول القائمة
سجل التعديلات (2 تحديثات، آخر تحديث 2 Sep، 2026)
سجل بالتغييرات التي أُجريت على هذا المقال. وحيثما حُفظت نسخة سابقة، تبقى متاحة للقراءة عبر رابط دائم يحمل معرّف DOI.
- أُعيدَت الترجمة العربية كترجمة كاملة عن النص الياباني الأصلي، وأُضيفَت خريطة المعرفة.
- أعيدت الترجمة كترجمة كاملة عن النص الياباني الأصلي. كانت النسخة العربية السابقة مختصراً يسقط أبواباً وجداول ورسوم Mermaid وتعليقات الأشكال وFAQ. أُعيدت هذه العناصر وفق الأصل الياباني، والادّعاءات التقنية مطابقة للنسخة اليابانية.
- النشر الأول
الاستشهاد بهذا المقال(DOI: 10.5281/zenodo.21621527)
هذا المقال محفوظ على Zenodo. يرد أدناه معرّف DOI الذي يشير دائمًا إلى أحدث نسخة، ومعرّف DOI المثبَّت على النسخة التي تقرؤها.
غو كومورا (2026). أساسيّات أوامر PowerShell ── العمليّات الأولى الواجب تعلّمها والاستخدام الآمن. شركة كومورا سوفت ذ.م.م.. https://doi.org/10.5281/zenodo.21621527 https://comcomponent.com/ar/blog/2026/05/29/powershell-command-basics/
- DOI (أحدث نسخة)
- 10.5281/zenodo.21621527
- DOI (هذه النسخة)
- 10.5281/zenodo.22240938
1. ما ينبغي معرفته أوّلاً
PowerShell بيئة أوامر تصلح لتأكيد إعدادات Windows، وترتيب الملفّات، وتحقيق السجلّات (logs)، ومعالجة CSV، والتحكّم في الخدمات (services)، وأتمتة الأعمال الروتينيّة.
لكن لا حاجة لكتابة سكربتات معقّدة منذ البداية. يكفي في البداية تذكّر التدفّق التالي لتصبح قادراً على الاستفادة منه إلى حدّ كبير في العمل الفعليّ.
ابحث ← اعرض ← ضيّق ← رتّب ← أخرج ← غيّر عند الحاجة
أساس PowerShell ليس «حفظ الأوامر الطويلة عن ظهر قلب». المهمّ هو الأمور الثلاثة التالية:
- القدرة على البحث عن الأوامر عبر
Get-CommandوGet-Help - القدرة على تمرير النتائج إلى الأمر التالي عبر خطّ الأنابيب
| - التحقّق من الأثر عبر
-WhatIfأو-Confirmقبل الحذف أو الإيقاف أو التغيير
يمكن لـ PowerShell تنفيذ «التحقيق» و«التغيير» على الشاشة نفسها. وهذا مريح، لكنّه يعني أيضاً أنّ الحذف أو الإيقاف يمكن تنفيذه فوراً، لذا فإنّ عادة البدء بالتحقّق للقراءة فقط أمر مهمّ.
كما أنّ الشيفرة الواردة في هذا المقال متاحة على GitHub كمجموعة عيّنات كاملة، تضمّ سكربتات مبوَّبة حسب فصول المقال (بتصميم يسمح بالتجربة الآمنة عبر إنشاء مساحة عمل تدريبيّة في مجلّد مؤقّت) واختبارات Pester.
powershell-command-basics - komurasoft-blog-samples (GitHub)
كيف تقرأ هذا المقال
في المقال 26 فصلاً. لا يلزم قراءتها من أوّلها إلى آخرها. بحسب الهدف، ابدأ من الفصول التالية حتّى لا تتوه.
| الهدف | الفصول التي تُقرأ |
|---|---|
| ستبدأ التعامل مع PowerShell الآن | الفصول 1–8 (الفكر، طريقة البحث، خطّ الأنابيب، عمليّات الملفّات) والفصل 24 (ترتيب التعلّم) |
| تريد تحقيق السجلّات أو الإعدادات | الفصل 9 (النصّ)، الفصل 12 (العمليّات والخدمات)، الفصل 13 (سجلّ الأحداث)، الفصل 21 (عيّنة التحقيق) |
| تريد معالجة CSV أو JSON | الفصول 10 و11 و15 |
| تريد جمع المعالجة في سكربت | الفصول 14 و16 و17 و18 |
| تريد تنفيذ الحذف أو النقل بأمان | الفصول 19 و22 و25 |
| تريد سحب الأوامر فحسب | الفصل 20 (قائمة الأوامر الأساسيّة)، الفصل 23 (العثرات الشائعة) |
ترتيب التعلّم نفسه ملخَّص في الفصل 24 «ترتيب تعلّم الأوامر». عند أوّل تجربة عمليّة، ضع أمامك المرحلة الأولى من الفصل 24 فقط (Get-Command، Get-Help، Get-Member، Get-Location، Set-Location، Get-ChildItem، Get-Content، Select-String) وتابع النصّ. إن فهمت هذه الثمانية، يكفي أن تبحث عن الباقي عند الحاجة.
كيف يختلف هذا المقال عن «مجموعة الأوامر العمليّة»
هناك مقال PowerShell آخر. الدور مختلف، فاستخدمهما كما يلي.
| المقال | ما يتناوله | متى تقرؤه |
|---|---|---|
| هذا المقال (الأساسيّات) | منظومة التشغيل. طريقة البحث عن الأوامر، فكر خطّ الأنابيب، ترتيب تنفيذ أوامر التغيير بأمان | اقرأه أوّلاً |
| مجموعة أوامر PowerShell العمليّة | قطع حسب الغرض. تجميع العدد والمجموع (Measure-Object)، التجميع حسب النوع (Group-Object)، مقارنة الفروق (Compare-Object)، تسجيل سجلّ العمل (Start-Transcript) وغيرها |
عندما يظهر في العمل الفعليّ «أريد أن أفعل هذا» |
CSV، والعمليّات، والخدمات، وسجلّ الأحداث، وتنبيهات Format-* تظهر في المقالين. هذا المقال يعالج «لماذا تُكتب بهذا الشكل»، ومجموعة الأوامر العمليّة تعالج «القطعة المستخدمة في ذلك الموقف».
في المخطّط، يشير الخطّ المتّصل إلى علاقة قائمة دائماً، ويشير الخطّ المتقطّع إلى علاقة مشروطة (شروط قيامها مذكورة في شرح كلّ علاقة في الصفحة التفصيليّة). القائمة الكاملة للعلاقات (المجموع 20، مع الأدلّة ودرجة اليقين) وتعريفات المفاهيم الرئيسة مجمّعة في صفحة تفاصيل خريطة المعرفة (باليابانية). البيانات: JSON-LD / Turtle
2. الفرق بين PowerShell وموجّه الأوامر
يبدو PowerShell شبيهاً بموجّه الأوامر التقليديّ (cmd.exe)، لكنّ الفكرة الداخليّة مختلفة.
| المحور | موجّه الأوامر | PowerShell |
|---|---|---|
| الإخراج الرئيسيّ | نصّ | كائن (object) |
| اسم الأمر | dir، copy وما شابه |
Get-ChildItem، Copy-Item وما شابه |
| معالجة النتائج | تتمحور حول معالجة النصّ | التصفية والترتيب باستخدام الخصائص (properties) |
| الأتمتة | ملفّ batch | سكربت .ps1 |
| مجال التفوّق | التوافق مع أصول الأوامر القديمة | إدارة Windows، وCSV، وJSON، وAPI، والأعمال الروتينيّة |
فمثلاً، عند الحصول على قائمة الملفّات، غالباً ما يُكتفى في cmd.exe بتأمّل نتيجة عرض dir كنصّ. أمّا في PowerShell فتُعامَل الملفّات ككائنات لها خصائص مثل Name وLength وLastWriteTime.
Get-ChildItem
عند فهم هذا الفرق، يصبح من الطبيعيّ كتابة معالجة مثل «عرض الملفّات التي حُدِّثت خلال 7 أيّام فقط، مرتَّبة من الأحدث إلى الأقدم بحسب تاريخ التحديث»:
Get-ChildItem -File |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } |
Sort-Object LastWriteTime -Descending |
Select-Object Name, Length, LastWriteTime
3. Windows PowerShell 5.1 وPowerShell 7.x
في Windows يوجد Windows PowerShell 5.1 المضمَّن منذ زمن، وPowerShell 7.x من السلالة الجديدة.
في العمل الفعليّ يسهل التفكير كما يلي.
| النوع | ملفّ التنفيذ | الاستخدام الرئيسيّ |
|---|---|---|
| Windows PowerShell 5.1 | powershell.exe |
الوحدات الخاصّة بـ Windows القديمة، والسكربتات القائمة، وصيانة الأصول الداخليّة |
| PowerShell 7.x | pwsh.exe |
السكربتات الجديدة، والعمل عبر المنصّات، والتحسين المستمرّ للوظائف |
عند التعلّم من جديد، لا مشكلة في اتّخاذ PowerShell 7.x أساساً. لكن سكربتات الإدارة القديمة داخل الشركة والوحدات الخاصّة بـ Windows قد تكون مبنيّة على افتراض Windows PowerShell 5.1.
لذلك، في العمل الفعليّ، ابدأ بتأكيد الإصدار.
$PSVersionTable
للسكربتات التي تريد تشغيلها بإصدار معيّن فأعلى، كتابة الشرط في البداية تقلّل الحوادث.
#Requires -Version 7.0
على أيّ إصدار تعمل عيّنات هذا المقال؟
العيّنات التالية مكتوبة، ما لم يُذكر خلاف ذلك، في نطاق يعمل كما هو على Windows PowerShell 5.1 وعلى PowerShell 7.x. غير أنّ النقاط التالية تغيّر النتيجة حتّى مع الأمر نفسه، فتحقّق منها قبل النسخ.
| موضع الاختلاف | Windows PowerShell 5.1 | PowerShell 7.x |
|---|---|---|
أعمدة العرض الافتراضيّة لـ Get-Process |
Handles، NPM(K)، PM(K)، WS(K)، CPU(s)، Id، SI، ProcessName |
NPM(K)، PM(M)، WS(M)، CPU(s)، Id، SI، ProcessName (الذاكرة بوحدة MB) |
معنى -Encoding UTF8 |
UTF-8 (مع BOM) | UTF-8 (بلا BOM). لإرفاق BOM حدّد utf8BOM |
عند إغفال -Encoding |
يختلف حسب الأمر (Out-File يعطي UTF-16LE، وSet-Content يعطي ANSI، وExport-Csv يعطي ASCII) |
الكلّ utf8NoBOM |
في عيّنات هذا المقال نُصرِّح بـ -Encoding UTF8 على أوامر الكتابة لتفادي ترميز غير مقصود. فكر وجود BOM ونهايات الأسطر نفسه مُعالَج في شرح ترميزات النصّ ونهايات السطور في Windows.
4. أسماء الأوامر (cmdlets) بصيغة Verb-Noun
الأوامر القياسيّة في PowerShell تكون أساساً على شكل فعل-اسم.
Get-Process
Get-Service
Get-ChildItem
Copy-Item
Remove-Item
Export-Csv
بتذكّر هذا الشكل يسهل البحث حتّى عن الأوامر غير المعروفة.
| الفعل | المعنى | مثال |
|---|---|---|
Get |
الحصول | Get-Process |
Set |
الضبط | Set-Location |
New |
الإنشاء | New-Item |
Copy |
النسخ | Copy-Item |
Move |
النقل | Move-Item |
Remove |
الحذف | Remove-Item |
Start |
البدء | Start-Service |
Stop |
الإيقاف | Stop-Process |
Import |
القراءة | Import-Csv |
Export |
الكتابة | Export-Csv |
الأسماء القصيرة مثل dir وls وcat وcd تعمل أيضاً، لكنّ كثيراً منها أسماء مستعارة (aliases).
Get-Command dir
عند الإبقاء على الأمر كسكربت، استخدام الاسم الرسميّ أأمن من الاسم المستعار.
# 読めるが、スクリプトでは避けたい
ls *.log
# 意図が明確
Get-ChildItem -Filter *.log
5. ثلاثة أوامر تحقيق تُتعلَّم أوّلاً
أوامر PowerShell كثيرة، لذا فإنّ تعلّم «طريقة البحث» أجدى في العمل من الحفظ عن ظهر قلب.
1. Get-Command ── البحث عن الأوامر المتاحة
Get-Command أمر للبحث عن الأوامر والدوالّ والأسماء المستعارة والتطبيقات المثبَّتة.
# Process という名詞を持つコマンドを探す
Get-Command -Noun Process
# Service 関連のコマンドを探す
Get-Command *Service*
# CSV 関連のコマンドを探す
Get-Command *Csv*
عندما يكون اسم الأمر غير واضح تماماً، استخدم حرف البدل.
Get-Command *Item*
Get-Command *Content*
Get-Command *Json*
2. Get-Help ── النظر في طريقة الاستخدام
Get-Help أمر لتأكيد وصف الأمر والمعاملات والأمثلة.
Get-Help Get-ChildItem
Get-Help Get-ChildItem -Examples
Get-Help Get-ChildItem -Full
Get-Help Get-ChildItem -Online
في البداية يكون -Examples مفيداً.
Get-Help Where-Object -Examples
إن كانت المساعدة قديمة أو ناقصة، حدِّثها من PowerShell بصلاحيات مدير.
Update-Help
قد تلزم اتّصال بالإنترنت أو صلاحيات بحسب البيئة. على حاسوب الشركة قد يفشل التحديث بسبب الوكيل (proxy) أو سياسة الإدارة.
3. Get-Member ── النظر في محتوى الكائن
إخراج PowerShell في معظم الحالات «كائن» لا «نصّ». بـ Get-Member يمكنك تأكيد الخصائص والعمليّات (methods) التي يملكها ذلك الكائن.
Get-Process | Get-Member
Get-Service | Get-Member
Get-ChildItem | Get-Member
مثلاً، للخدمة خصائص مثل Status وName.
Get-Service | Select-Object Name, Status
وللملفّ خصائص مثل Name وLength وLastWriteTime.
Get-ChildItem -File | Select-Object Name, Length, LastWriteTime
عندما «لا تعرف بماذا تضيّق»، ابدأ بتأكيد أسماء الخصائص عبر
Get-Member.
6. أساسيّات خطّ الأنابيب
| في PowerShell يمرّر نتيجة الأمر الأيسر إلى الأمر الأيمن.
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
هذا المثال ينفّذ المعالجات التالية من اليسار إلى اليمين.
الحصول على قائمة العمليّات
→ الترتيب تنازليّاً حسب استخدام CPU
→ عرض أعلى 10 فقط
كيف يظهر الإخراج؟
نتيجة Get-Process تُعرض افتراضيّاً كجدول بهذه الأعمدة. القيم تختلف بحسب البيئة، لذا ما ينبغي تأكيده هو «ترتيب الأعمدة».
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
| العمود | المعنى |
|---|---|
NPM(K) |
استخدام ذاكرة التجمع غير الصفحيّ (nonpaged pool) بوحدة KB |
PM(M) |
استخدام الذاكرة القابلة للترحيل (paged) بوحدة MB |
WS(M) |
حجم مجموعة العمل (working set؛ صفحات الذاكرة المُشار إليها حديثاً) بوحدة MB |
CPU(s) |
زمن المعالج المستخدم على كلّ المعالجات (بالثواني) |
Id |
معرّف العمليّة |
SI |
معرّف الجلسة |
ProcessName |
اسم العمليّة |
هذا هو العرض الافتراضيّ في PowerShell 7.x. في Windows PowerShell 5.1 يُضاف في المقدّمة Handles (عدد المقابض المفتوحة)، وتصير أعمدة الذاكرة PM(K) وWS(K) بوحدة KB. حتّى إن اختلفت أسماء الأعمدة، تبقى أسماء الخصائص التي تُمرَّر إلى Sort-Object وWhere-Object (CPU، WorkingSet، Id، Name وغيرها) مشتركة. اسم العمود المعروض واسم الخاصيّة شيئان مختلفان؛ إن لم يعمل شرط التضييق فأكّد اسم الخاصيّة الحقيقيّ عبر Get-Process | Get-Member.
التوليفات الشائعة كالتالي.
| الأمر | الدور | مثال |
|---|---|---|
Where-Object |
التضييق بشرط | الحصول على الخدمات المتوقّفة فقط |
Sort-Object |
الترتيب | الترتيب من الأحدث بحسب تاريخ التحديث |
Select-Object |
اختيار الأعمدة أو العدد | عرض الاسم والحجم فقط |
ForEach-Object |
معالجة كلّ عنصر | معالجة كلّ ملفّ على حدة |
Export-Csv |
الإخراج إلى CSV | حفظ نتيجة التحقيق |
Where-Object ── التضييق بشرط
# 停止中のサービスだけ表示
Get-Service | Where-Object { $_.Status -eq "Stopped" }
# 100MB を超えるファイルだけ表示
Get-ChildItem -File |
Where-Object { $_.Length -gt 100MB }
# 名前に backup を含むファイルだけ表示
Get-ChildItem -File |
Where-Object { $_.Name -like "*backup*" }
$_ يمثّل الكائن الحاليّ القادم عبر خطّ الأنابيب.
Where-Object { $_.Length -gt 100MB }
هذا يحكم «هل Length للملفّ الذي تنظر إليه الآن أكبر من 100MB».
منذ PowerShell 3.0 يمكن أيضاً استخدام الصيغة المختصرة.
Get-Service | Where-Object Status -EQ "Stopped"
غير أنّ صيغة scriptblock أسهل لمتابعة المعنى في مرحلة المبتدئ.
Get-Service | Where-Object { $_.Status -eq "Stopped" }
Sort-Object ── الترتيب
# メモリ使用量の大きい順
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet
# 更新日時の新しい順
Get-ChildItem -File |
Sort-Object LastWriteTime -Descending |
Select-Object -First 20 Name, LastWriteTime
Select-Object ── اختيار الأعمدة اللازمة فقط
Get-Process |
Select-Object Name, Id, CPU, WorkingSet
يُستخدم أيضاً لتضييق العدد.
Get-Process | Select-Object -First 5
Get-Process | Select-Object -Last 5
قبل الإخراج إلى CSV، ترتيب الأعمدة اللازمة فقط عبر Select-Object يجعل التعامل أيسر.
Get-Service |
Select-Object Name, DisplayName, Status, StartType |
Export-Csv .\services.csv -NoTypeInformation -Encoding UTF8
7. أوامر Format تُستخدم في النهاية
في PowerShell أوامر لتنسيق العرض.
Format-Table
Format-List
Format-Wide
هذه «للعرض على الشاشة». إن استُخدمت قبل الإخراج إلى CSV أو قبل تمرير النتيجة إلى معالجة لاحقة، يتحوّل المحتوى إلى كائن عرض بدل الخصائص الأصليّة.
# 避ける: CSV に表示用情報が混ざる
Get-Process |
Format-Table Name, CPU |
Export-Csv .\process.csv -NoTypeInformation
# 正しい: 先にプロパティを選んで CSV 出力
Get-Process |
Select-Object Name, CPU |
Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8
احفظ أنّ
Format-*«للعرض على الشاشة في النهاية»، فتقلّ الحوادث.
8. أساسيّات عمليّات الملفّات والمجلّدات
أكثر ما يُستخدم في PowerShell هو التعامل مع الملفّات والمجلّدات.
| ما تريد فعله | الأمر |
|---|---|
| النظر إلى المكان الحاليّ | Get-Location |
| الانتقال | Set-Location |
| عرض القائمة | Get-ChildItem |
| إنشاء ملفّ أو مجلّد | New-Item |
| النسخ | Copy-Item |
| النقل | Move-Item |
| إعادة التسمية | Rename-Item |
| الحذف | Remove-Item |
| تأكيد الوجود | Test-Path |
تأكيد المكان الحاليّ
Get-Location
للانتقال.
Set-Location C:\Work
إن احتوى المسار على مسافات فأحطه بعلامات اقتباس.
Set-Location "C:\Work Files\Reports"
عرض قائمة الملفّات
Get-ChildItem
Get-ChildItem -File
Get-ChildItem -Directory
Get-ChildItem -Recurse
عند التنفيذ يظهر، تحت عنوان المجلّد المستهدف، جدول بهذه الأعمدة.
Directory: C:\Work
Mode LastWriteTime Length Name
---- ------------- ------ ----
Mode حروف للسمات: d دليل، وa سمة أرشيف، وr للقراءة فقط، وh مخفيّ، وs نظام، وl رابط. في صفوف الأدلّة يبقى Length (الحجم) فارغاً. LastWriteTime وLength الظاهران هنا هما اسما الخاصيّتين نفسهما اللذان يمكن تمريرهما إلى Where-Object وSort-Object.
للتضييق بالامتداد يكون -Filter مفيداً.
Get-ChildItem -Filter *.log
للبحث مع المجلّدات الفرعيّة استخدم -Recurse.
Get-ChildItem C:\Logs -Filter *.log -Recurse
في المواضع ذات الملفّات الكثيرة، لا تبدأ بـ -Recurse فوراً؛ حدّد المجلّد المستهدف أوّلاً ثمّ نفّذ.
الإنشاء
# フォルダー作成
New-Item -ItemType Directory -Path .\archive
# 空ファイル作成
New-Item -ItemType File -Path .\memo.txt
إن كان الوجود محتملاً، فتأكّد أوّلاً.
if (-not (Test-Path .\archive)) {
New-Item -ItemType Directory -Path .\archive
}
النسخ
Copy-Item .\report.xlsx .\backup\report.xlsx
لنسخ المجلّد بالكامل استخدم -Recurse.
Copy-Item .\data .\backup\data -Recurse
إن كان الاستبدال وارداً، فتأكّد من الأثر مسبقاً.
Copy-Item .\data .\backup\data -Recurse -WhatIf
النقل
Move-Item .\old.log .\archive\old.log
عند نقل عدّة ملفّات بشرط، أضف -WhatIf أوّلاً.
Get-ChildItem .\logs -Filter *.log |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Move-Item -Destination .\archive -WhatIf
إن لم تكن هناك مشكلة فأزل -WhatIf.
Get-ChildItem .\logs -Filter *.log |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Move-Item -Destination .\archive
الحذف
الحذف يُعامل بحذر خاصّ.
Remove-Item .\old.log -WhatIf
نفّذ بعد تأكيد أنّ الهدف صحيح.
Remove-Item .\old.log
الجمع بين حرف البدل و-Recurse قويّ. لا تنفّذه من البداية على مجلّد إنتاج؛ تأكّد أوّلاً بعرض القائمة.
# まず対象を確認
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Select-Object FullName, Length, LastWriteTime
# 次に削除予定を確認
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Remove-Item -WhatIf
# 最後に実行
Get-ChildItem C:\Logs -Filter *.tmp -Recurse |
Remove-Item
9. قراءة الملفّات النصّيّة والبحث فيها والكتابة إليها
في تحقيق السجلّات تُستخدم عمليّات الملفّات النصّيّة كثيراً.
قراءة الملفّ
Get-Content .\app.log
للنظر إلى الذيل فقط استخدم -Tail.
Get-Content .\app.log -Tail 50
لمتابعة سجلّ يُلحَق إليه استخدم -Wait.
Get-Content .\app.log -Tail 20 -Wait
البحث عن سلسلة
Select-String -Path .\app.log -Pattern "ERROR"
يمكن استهداف عدّة ملفّات.
Select-String -Path .\logs\*.log -Pattern "ERROR", "WARN"
يمكن أيضاً استخراج اسم الملفّ ورقم السطر والمحتوى من نتيجة البحث وإخراجها إلى CSV.
Select-String -Path .\logs\*.log -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8
الكتابة إلى ملفّ
"hello" | Set-Content .\memo.txt -Encoding UTF8
"next line" | Add-Content .\memo.txt -Encoding UTF8
عند حفظ نتيجة أمر، قد يكون Export-Csv أو ConvertTo-Json أيسر في التعامل لاحقاً من Out-File.
Get-Process |
Select-Object Name, Id, CPU |
Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8
10. أساسيّات التعامل مع CSV
في أتمتة الأعمال يظهر CSV كثيراً جداً. في PowerShell يمكن التعامل مع CSV لا كنصّ بل كـ «كائنات ذات أعمدة».
قراءة CSV
افترض مثلاً وجود users.csv كالتالي.
Name,Department,Enabled
Suzuki,Sales,true
Tanaka,Accounting,false
Sato,Sales,true
اقرأ الملفّ.
$users = Import-Csv .\users.csv
$users
أسماء الأعمدة تصير خصائص.
$users | Select-Object Name, Department
التضييق بشرط
$users |
Where-Object { $_.Department -eq "Sales" }
قيم CSV كثيراً ما تدخل كنصوص، فانتبه عند التعامل مع true / false أو الأرقام.
$users |
Where-Object { $_.Enabled -eq "true" }
الإخراج إلى CSV
$users |
Where-Object { $_.Department -eq "Sales" } |
Export-Csv .\sales-users.csv -NoTypeInformation -Encoding UTF8
القاعدة الحديديّة: لا تضع Format-Table قبل Export-Csv.
# 避ける
$users | Format-Table | Export-Csv .\out.csv -NoTypeInformation
# 正しい
$users | Select-Object Name, Department, Enabled | Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8
11. أساسيّات التعامل مع JSON
يُستخدم JSON كثيراً أيضاً في ملفّات الإعداد وواجهات Web API.
$data = Get-Content .\settings.json -Raw | ConvertFrom-Json
$data
حوّل الكائن إلى JSON.
[pscustomobject]@{
Name = "BatchJob"
Enabled = $true
Retry = 3
} | ConvertTo-Json
عند وجود طبقات عميقة حدّد -Depth.
$config | ConvertTo-Json -Depth 10 | Set-Content .\settings.json -Encoding UTF8
12. أساسيّات العمليّات والخدمات
النظر إلى العمليّات
Get-Process
أكّد العمليّات الأكبر في استخدام الذاكرة.
Get-Process |
Sort-Object WorkingSet -Descending |
Select-Object -First 10 Name, Id, WorkingSet
ضيّق بالاسم.
Get-Process -Name notepad
الإيقاف يُنفَّذ بحذر.
Stop-Process -Name notepad -WhatIf
إن لم تكن هناك مشكلة فنفّذ.
Stop-Process -Name notepad
النظر إلى الخدمات
Get-Service
لعرض الخدمات المتوقّفة فقط.
Get-Service |
Where-Object { $_.Status -eq "Stopped" }
ضيّق بالاسم.
Get-Service -Name "Spooler"
عند إعادة التشغيل أيضاً، أكّد الهدف أوّلاً.
Get-Service -Name "Spooler"
Restart-Service -Name "Spooler" -WhatIf
التحكّم في الخدمات سهل أن يؤثّر في العمل، لذا في بيئة الإنتاج أكّد أوّلاً دليل الإجراءات ووقت الصيانة وطريقة الاستعادة.
13. أساسيّات سجلّ الأحداث
في تحقيق Windows لا غنى عن سجلّ الأحداث.
أكّد الأخطاء الأخيرة.
Get-WinEvent -LogName System -MaxEvents 100 |
Where-Object { $_.LevelDisplayName -eq "Error" } |
Select-Object TimeCreated, ProviderName, Id, Message
كيف يظهر الإخراج؟
نتيجة Get-WinEvent تُعرض افتراضيّاً بعنوان لكلّ مصدر سجلّ (ProviderName)، وتحته جدول بهذه الأعمدة.
ProviderName: PowerShell
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
كما في المثال أعلاه، إن اخترت الأعمدة بـ Select-Object اختفى عنوان المصدر وصار الجدول بالأعمدة المختارة فقط. Message طويل فينقطع في منتصف الشاشة. إن أردت قراءة عنصر واحد حتّى نهايته، ضيّق الهدف إلى عنصر واحد ثمّ اعرضه بـ Format-List.
Get-WinEvent -LogName System -MaxEvents 1 | Format-List *
في LevelDisplayName تدخل Critical وError وWarning وInformation وVerbose. في السجلّات ذات العدد الكبير، تمرير الشرط إلى -FilterHashtable أسرع من التضييق بـ Where-Object (Level = 3 تحذير، وLevel = 4 معلومات).
انظر إلى أحدث 50 عنصراً في سجلّ التطبيق.
Get-WinEvent -LogName Application -MaxEvents 50 |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
للتضييق بفترة زمنيّة.
$start = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = $start
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message
إن تركت نتيجة التحقيق في CSV صار تبادلها لاحقاً أيسر.
Get-WinEvent -LogName System -MaxEvents 500 |
Where-Object { $_.LevelDisplayName -in @("Error", "Warning") } |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Export-Csv .\system-events.csv -NoTypeInformation -Encoding UTF8
14. المتغيّرات والمصفوفات وجداول التجزئة
يمكن العمل بأوامر قصيرة وحدها، لكن عند إطالة الأمر تصير المتغيّرات مفيدة.
المتغيّرات
$path = "C:\Logs"
Get-ChildItem $path
متغيّرات PowerShell تبدأ بـ $.
$today = Get-Date
$limit = (Get-Date).AddDays(-30)
المصفوفات
$extensions = @("*.log", "*.txt", "*.csv")
foreach ($ext in $extensions) {
Get-ChildItem C:\Work -Filter $ext
}
جداول التجزئة
جدول التجزئة تركيب مفاتيح وقيم.
$params = @{
Path = "C:\Logs"
Filter = "*.log"
Recurse = $true
}
Get-ChildItem @params
هذه الكتابة بـ @params تُسمّى «splatting». تصير أيسر قراءة عندما تزيد المعاملات.
15. ترتيب النتائج بـ PSCustomObject
عندما تريد جمع نتائج التحقيق في شكل جدول، يكون [pscustomobject] مفيداً.
[pscustomobject]@{
ComputerName = $env:COMPUTERNAME
UserName = $env:USERNAME
CheckedAt = Get-Date
}
يمكن صنع نتائج متعدّدة وإخراجها إلى CSV.
Get-ChildItem C:\Logs -Filter *.log |
ForEach-Object {
[pscustomobject]@{
Name = $_.Name
FullName = $_.FullName
SizeMB = [math]::Round($_.Length / 1MB, 2)
LastWriteTime = $_.LastWriteTime
}
} |
Export-Csv .\log-files.csv -NoTypeInformation -Encoding UTF8
16. أساسيّات ملفّ السكربت .ps1
المعالجات المتكرّرة تُوضع في ملفّ .ps1.
كمثال، اصنع سكربتاً يُدرج السجلّات القديمة.
# Find-OldLogs.ps1
param(
[string]$Path = "C:\Logs",
[int]$Days = 30,
[string]$OutputPath = ".\old-logs.csv"
)
$limit = (Get-Date).AddDays(-$Days)
Get-ChildItem -Path $Path -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit } |
Select-Object FullName, Length, LastWriteTime |
Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
Write-Host "Exported: $OutputPath"
مثال تنفيذ.
.\Find-OldLogs.ps1 -Path C:\Logs -Days 60 -OutputPath .\old-logs.csv
استقبال الوسائط عبر param() يجعل تغيير الشروط لاحقاً أيسر.
17. أساسيّات سياسة التنفيذ
عند محاولة تنفيذ .ps1 قد يظهر خطأ كهذا.
このシステムではスクリプトの実行が無効になっているため...
عندئذ أكّد سياسة التنفيذ الحاليّة.
Get-ExecutionPolicy
Get-ExecutionPolicy -List
على جهاز تطوير شخصيّ، إن كان المراد تنفيذ سكربتات محلّيّة الصنع فحسب، فالشائع ضبط نطاق المستخدم الحاليّ على RemoteSigned.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
غير أنّ حواسيب الشركة قد تُضبط عبر نهج المجموعة. لا تلتف على ذلك بالقوّة؛ راجع المسؤول وقواعد التشغيل.
سياسة التنفيذ ميزة أمان تضبط شروط تنفيذ سكربتات PowerShell. غير أنّها ليست حدّاً أمنيّاً كاملاً. في المؤسّسة يلزم التفكير فيها مع التوقيع، وAppLocker، وMicrosoft Defender، وإدارة الصلاحيات، وتدقيق السجلّات.
18. أساسيّات معالجة الأخطاء
قد يواصل PowerShell المعالجة حتّى بعد ظهور خطأ.
في المعالجات المهمّة استخدم -ErrorAction Stop وtry/catch.
try {
Copy-Item .\source.txt .\backup\source.txt -ErrorAction Stop
Write-Host "Copy succeeded"
}
catch {
Write-Error "Copy failed: $($_.Exception.Message)"
}
عند معالجة عدّة ملفّات أيضاً، تسجيل الإخفاق يسهّل التتبّع لاحقاً.
$results = foreach ($file in Get-ChildItem .\input -File) {
try {
Copy-Item $file.FullName .\backup -ErrorAction Stop
[pscustomobject]@{
FileName = $file.Name
Status = "OK"
Message = ""
}
}
catch {
[pscustomobject]@{
FileName = $file.Name
Status = "NG"
Message = $_.Exception.Message
}
}
}
$results | Export-Csv .\copy-result.csv -NoTypeInformation -Encoding UTF8
19. ترتيب تنفيذ أوامر التغيير بأمان
في PowerShell، إجراء التعامل الآمن مع أوامر التغيير مثل الحذف والنقل والإيقاف أمر مهمّ.
الأساس هو الترتيب التالي.
1. اعرض الهدف بأوامر Get
2. ضيّق بـ Where-Object
3. أكّد قائمة الأهداف بـ Select-Object
4. سجّل بـ Export-Csv
5. أكّد خطّة التغيير بـ -WhatIf
6. نفّذ فعليّاً
كمثال، حذف ملفّات .tmp أقدم من 30 يوماً.
الخطوة 1: عرض الهدف
Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse
الخطوة 2: التضييق بشرط
$limit = (Get-Date).AddDays(-30)
Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit }
الخطوة 3: عرض الأعمدة اللازمة فقط
$targets = Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
Where-Object { $_.LastWriteTime -lt $limit }
$targets |
Select-Object FullName, Length, LastWriteTime
الخطوة 4: ترك أثر
$targets |
Select-Object FullName, Length, LastWriteTime |
Export-Csv .\delete-targets.csv -NoTypeInformation -Encoding UTF8
الخطوة 5: التأكيد بـ WhatIf
$targets | Remove-Item -WhatIf
الخطوة 6: التنفيذ
$targets | Remove-Item
بهذا الترتيب تقلّ حوادث من نوع «لا أعرف ماذا حُذف».
20. قائمة الأوامر الأساسيّة الشائعة
المكان والملفّات
| الغرض | مثال الأمر |
|---|---|
| عرض المجلّد الحاليّ | Get-Location |
| الانتقال بين المجلّدات | Set-Location C:\Work |
| عرض القائمة | Get-ChildItem |
| عرض الملفّات فقط | Get-ChildItem -File |
| عرض المجلّدات فقط | Get-ChildItem -Directory |
| البحث مع المجلّدات الفرعيّة | Get-ChildItem -Recurse |
| تأكيد الوجود | Test-Path .\file.txt |
| إنشاء مجلّد | New-Item -ItemType Directory .\backup |
| النسخ | Copy-Item .\a.txt .\backup\a.txt |
| النقل | Move-Item .\a.txt .\archive\a.txt |
| تأكيد خطّة الحذف | Remove-Item .\a.txt -WhatIf |
معالجة الكائنات
| الغرض | مثال الأمر |
|---|---|
| التضييق بشرط | Where-Object { $_.Status -eq "Running" } |
| الترتيب | Sort-Object LastWriteTime -Descending |
| اختيار الأعمدة | Select-Object Name, LastWriteTime |
| عرض الأعلى فقط | Select-Object -First 10 |
| معالجة كلّ عنصر | ForEach-Object { $_.Name } |
| فحص المحتوى | Get-Member |
الإدخال والإخراج
| الغرض | مثال الأمر |
|---|---|
| قراءة نصّ | Get-Content .\app.log |
| النظر إلى الذيل | Get-Content .\app.log -Tail 50 |
| البحث عن سلسلة | Select-String -Path .\app.log -Pattern "ERROR" |
| قراءة CSV | Import-Csv .\users.csv |
| إخراج CSV | Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8 |
| قراءة JSON | Get-Content .\a.json -Raw | ConvertFrom-Json |
| إخراج JSON | $obj | ConvertTo-Json -Depth 10 |
تحقيق Windows
| الغرض | مثال الأمر |
|---|---|
| قائمة العمليّات | Get-Process |
| قائمة الخدمات | Get-Service |
| سجلّ الأحداث | Get-WinEvent -LogName System -MaxEvents 100 |
| متغيّرات البيئة | Get-ChildItem Env: |
| إصدار PowerShell | $PSVersionTable |
| سياسة التنفيذ | Get-ExecutionPolicy -List |
21. عيّنة عمليّة: تحقيق السجلّات وصنع تقرير
افترض متطلّباً كهذا.
من ملفّات .log تحت C:\App\Logs، ابحث عن الأسطر المحدَّثة خلال آخر 7 أيّام والتي تحتوي ERROR، واجمعها في CSV.
لا تكتب الشكل النهائيّ دفعة واحدة؛ ابنه على مراحل.
الخطوة 1: البحث عن ملفّات السجلّ
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse
الخطوة 2: التضييق إلى آخر 7 أيّام
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since }
الخطوة 3: البحث عن ERROR
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern "ERROR"
الخطوة 4: الإخراج إلى CSV
$since = (Get-Date).AddDays(-7)
Get-ChildItem C:\App\Logs -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern "ERROR" |
Select-Object Path, LineNumber, Line |
Export-Csv .\error-report.csv -NoTypeInformation -Encoding UTF8
الخطوة 5: تحويله إلى سكربت
# Export-ErrorReport.ps1
param(
[string]$LogPath = "C:\App\Logs",
[int]$Days = 7,
[string]$Pattern = "ERROR",
[string]$OutputPath = ".\error-report.csv"
)
$since = (Get-Date).AddDays(-$Days)
Get-ChildItem $LogPath -Filter *.log -File -Recurse |
Where-Object { $_.LastWriteTime -ge $since } |
Select-String -Pattern $Pattern |
Select-Object Path, LineNumber, Line |
Export-Csv $OutputPath -NoTypeInformation -Encoding UTF8
Write-Host "Exported: $OutputPath"
مثال تنفيذ.
.\Export-ErrorReport.ps1 -LogPath C:\App\Logs -Days 14 -Pattern "ERROR|FATAL" -OutputPath .\errors.csv
22. عيّنة عمليّة: أرشفة الملفّات القديمة
المثال التالي نقل لا حذف.
من C:\Work\Reports، انقل ملفات .xlsx التي لم تُحدَّث منذ 90 يوماً فأكثر إلى C:\Work\Archive.
تأكيد الهدف
$source = "C:\Work\Reports"
$dest = "C:\Work\Archive"
$limit = (Get-Date).AddDays(-90)
$targets = Get-ChildItem $source -Filter *.xlsx -File |
Where-Object { $_.LastWriteTime -lt $limit }
$targets | Select-Object FullName, Length, LastWriteTime
إنشاء وجهة الأرشفة
if (-not (Test-Path $dest)) {
New-Item -ItemType Directory -Path $dest
}
إخراج الأثر
$targets |
Select-Object FullName, Length, LastWriteTime |
Export-Csv .\archive-targets.csv -NoTypeInformation -Encoding UTF8
التأكيد بـ WhatIf
$targets | Move-Item -Destination $dest -WhatIf
التنفيذ
$targets | Move-Item -Destination $dest
إن أمكن تكرار أسماء الملفّات، يفشل هذا كما هو. في العمل الفعليّ، احسم القاعدة أوّلاً: فصل مجلّدات حسب السنة والشهر، أو إلحاق تاريخ ووقت باسم الوجهة، أو التخطّي إن وُجد ملفّ قائم.
23. العثرات الشائعة
| العَرَض | السبب | المعالجة |
|---|---|---|
| الأوامر طويلة ولا تُحفَظ | محاولة الحفظ عن ظهر قلب | ابحث بـ Get-Command وGet-Help -Examples |
لا تفهم $_ |
نقص فهم القيمة الحاليّة في خطّ الأنابيب | احفظ الشكل Where-Object { $_.Name -like "*log*" } |
| محتوى CSV غريب | Export-Csv بعد Format-Table |
نفّذ Export-Csv بعد Select-Object |
| الفشل عند وجود مسافة في المسار | غياب علامات الاقتباس | أحطه مثل "C:\Work Files\a.txt" |
| تعذّر تنفيذ السكربت | سياسة التنفيذ | أكّد بـ Get-ExecutionPolicy -List |
| أهداف الحذف أكثر ممّا ينبغي | الشرط أوسع ممّا ينبغي | أكّد أوّلاً بـ Select-Object FullName و-WhatIf |
| لا تعرف اسم الخاصيّة | لم تنظر في بنية الكائن | استخدم Get-Member |
| ظهور حروف مشوّهة (mojibake) | افتراض الترميز مختلف | أكّد -Encoding في الإدخال والإخراج والتطبيق المستخدم |
24. ترتيب تعلّم الأوامر
لا يلزم حفظ كلّ الأوامر من البداية.
الترتيب التالي مُستحسَن.
المرحلة 1: العرض والبحث
Get-Command
Get-Help
Get-Member
Get-Location
Set-Location
Get-ChildItem
Get-Content
Select-String
المرحلة 2: التضييق والترتيب
Where-Object
Sort-Object
Select-Object
ForEach-Object
Format-Table
Format-List
المرحلة 3: الإدخال والإخراج
Import-Csv
Export-Csv
ConvertFrom-Json
ConvertTo-Json
Set-Content
Add-Content
Out-File
المرحلة 4: التغيير
New-Item
Copy-Item
Move-Item
Rename-Item
Remove-Item
Start-Service
Stop-Service
Restart-Service
Stop-Process
أوامر التغيير تُتعلَّم حتماً مع أوامر التأكيد.
# 見る
Get-ChildItem .\logs -Filter *.tmp
# 削除予定を見る
Get-ChildItem .\logs -Filter *.tmp | Remove-Item -WhatIf
# 実行
Get-ChildItem .\logs -Filter *.tmp | Remove-Item
25. قائمة تحقّق للتشغيل في الميدان
عند استخدام PowerShell في العمل، تأكيد النقاط التالية يزيد الأمان.
- أكّدت إن كان PowerShell المنفَّذ
powershell.exeأمpwsh.exe - أكّدت الإصدار عبر
$PSVersionTable - عرضت الهدف بأوامر
Get-*قبل التغيير - أكّدت شرط
Where-Objectعلى الشاشة - استخدمت
-WhatIfقبل الحذف أو النقل أو الإيقاف - حفظت قائمة الأهداف قبل التنفيذ في CSV
- أكّدت النسخ الاحتياطيّ أو إجراء الاستعادة في بيئة الإنتاج
- أكّدت سياسة تنفيذ السكربت والقواعد الداخليّة
- جهّزت إخراج سجلّ عند الخطأ
- في السكربتات المشتركة استخدمت الأسماء الرسميّة لا الأسماء المستعارة
26. الخلاصة
أساس PowerShell ليس حفظ كمّ كبير من الأوامر. ما ينفع في العمل هو اكتساب القالب التالي.
ابحث بـ Get-Command
انظر إلى طريقة الاستخدام بـ Get-Help
أكّد الخصائص بـ Get-Member
اعرض الهدف بـ Get-*
ضيّق بـ Where-Object
رتّب الأعمدة بـ Select-Object
اترك أثراً بـ Export-Csv
أكّد خطّة التغيير بـ -WhatIf
نفّذ في النهاية
خصوصاً أنّ PowerShell بيئة قويّة تصل إلى حذف الملفّات، وإيقاف الخدمات، وإنهاء العمليّات، والتحكّم في السجلّ. لذلك فإنّ ما ينبغي تعلّمه أوّلاً ليس «الأوامر الخطرة»، بل «إجراء تأكيد الهدف بأمان».
اعرض ← ضيّق ← سجّل ← جرّب ← نفّذ
إن التزمت بهذا الترتيب، لم يعد PowerShell شاشة سوداء فحسب، بل صار أداة عمليّة لترتيب أعمال Windows وتحقيقها وأتمتتها.
روابط مرجعية
- مجموعة عيّنات الشيفرة لهذا المقال (سكربتات حسب الموضوع واختبارات Pester) - komurasoft-blog-samples (GitHub)
- PowerShell Documentation - Microsoft Learn
- Install PowerShell on Windows - Microsoft Learn
- Differences between Windows PowerShell 5.1 and PowerShell 7.x - Microsoft Learn
- Get-Command - Microsoft Learn
- Get-Help - Microsoft Learn
- Get-Member - Microsoft Learn
- about_Pipelines - Microsoft Learn
- Where-Object - Microsoft Learn
- Select-Object - Microsoft Learn
- Get-Process - Microsoft Learn (يشمل شرح أعمدة العرض الافتراضيّة)
- Get-WinEvent - Microsoft Learn
- about_Character_Encoding (Windows PowerShell 5.1) - Microsoft Learn
- Import-Csv - Microsoft Learn
- Export-Csv - Microsoft Learn
- about_Execution_Policies - Microsoft Learn
مقالات ذات صلة
- مجموعة أوامر PowerShell العمليّة ── إضافة وظائف صغيرة شائعة الاستخدام في العمل اليوميّ
- شرح ترميزات النصّ ونهايات السطور في Windows
- دليل المراجعة الشاملة لـ VBA وExcel macro والأدوات الداخليّة استعداداً لإيقاف VBScript
- المزالق الشائعة في تطوير مكوّنات COM وOCX / ActiveX
الخدمات المرتبطة بهذا الموضوع
تطوير تطبيقات Windows
ندعم تطوير برمجيّات Windows مثل تطبيقات الأعمال، والتكامل مع الأجهزة، وأدوات الاتّصال.
الاستفادة من الأصول القائمة ودعم الانتقال
ندعم جرد الأصول القائمة التي تشمل الدفعات القديمة وVBScript وVBA وPowerShell وCOM / ActiveX، وتعديلها، وانتقالها.
مقالات ذات صلة
أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.
مجموعة أوامر PowerShell العمليّة ── إضافة وظائف صغيرة شائعة الاستخدام في العمل اليوميّ
نرتّب هنا أوامر PowerShell العمليّة المستخدَمة في العمل اليوميّ، مثل مواضع استخدام Measure-Object وGroup-Object وSelect-String وCompare-O...
طريقة تشغيل PowerShell من C# (CSharp) واستقبال النتيجة ككائن
نرتّب من منظور عمليّ طريقة تشغيل PowerShell من C# واستقبال النتيجة ككائن PSObject بدل نصّ، بدءًا من PowerShell SDK وAddCommand وAddParame...
تهيئة اختبارات PowerShell عبر Pester ── الأسلوب العمليّ لجعل سكربتات التشغيل أقلّ عرضةً للكسر
نُنظِّم الإجراءات العمليّة لاختبار سكربتات PowerShell عبر Pester v5، بدءاً من معالجة التواريخ وعمليّات الملفّات وعمليّات الحذف، مروراً با...
معالجة الأخطاء وتصميم إعادة التنفيذ في PowerShell ── من فخّ عدم نجاعة try/catch حتى القاعدة الثابتة لـ exit code وإعادة المحاولة
نرتّب من منظور عمليّ الفرق بين الخطأ المنهي وغير المنهي في PowerShell، وفخّ عدم نجاعة try/catch والقاعدة الثابتة لـ -ErrorAction Stop، وا...
سياسة تنفيذ PowerShell وتوقيع السكربتات ── دليل عمليّ للخروج من تشغيل «السدّ بـ Bypass»
سياسة تنفيذ PowerShell «جهاز أمان لا حدّ أمنيّ (security boundary)». نرتّب الفروق بين RemoteSigned وغيرها، وأولويّة النطاقات، وMark of th...
أين يتصل هذا الموضوع
ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.
تطوير تطبيقات ويندوز
ندعم تطوير برامج ويندوز للأعمال، وتكامل الأجهزة، وأدوات التواصل.
الأسئلة الشائعة
أسئلة شائعة حول موضوع هذه المقالة.
- من أين ينبغي أن أبدأ تعلّم PowerShell؟
- ليس بحفظ الأوامر، بل بتعلّم طريقة البحث عنها. الأمور المهمّة ثلاثة: القدرة على البحث عن الأوامر عبر Get-Command وGet-Help، وتمرير النتائج إلى الأمر التالي عبر خطّ الأنابيب (|)، والتحقّق من الأثر عبر -WhatIf أو -Confirm قبل الحذف أو الإيقاف أو التغيير. وعندما لا تعرف اسم خاصيّة (property) الكائن (object)، تحقّق من محتواه عبر Get-Member. التدفّق الأساسيّ هو «ابحث ← اعرض ← ضيّق ← رتّب ← أخرج ← غيّر عند الحاجة».
- ما الفرق بين PowerShell وموجّه الأوامر (Command Prompt)؟
- الفرق الأكبر هو أنّ إخراج موجّه الأوامر يتمحور حول النصّ، بينما إخراج PowerShell عبارة عن كائنات (objects). فمثلاً، يُعامَل الملفّ ككائن له خصائص (properties) مثل Name وLength وLastWriteTime، ما يجعل التصفية عبر Where-Object والترتيب عبر Sort-Object أموراً طبيعيّة الكتابة. كما أنّ أسماء الأوامر موحَّدة بصيغة فعل-اسم مثل Get-ChildItem وCopy-Item، ما يسهِّل البحث حتّى عن الأوامر غير المعروفة.
- أيّهما ينبغي استخدامه، Windows PowerShell 5.1 أم PowerShell 7.x؟
- عند التعلّم من جديد، لا مشكلة في اتّخاذ PowerShell 7.x (pwsh.exe) أساساً. لكن سكربتات الإدارة القديمة داخل الشركة والوحدات (modules) الخاصّة بـ Windows قد تكون مبنيّة على افتراض Windows PowerShell 5.1 (powershell.exe). في العمل الفعليّ، من المفيد التحقّق أوّلاً من الإصدار عبر $PSVersionTable، وكتابة شرط مثل #Requires -Version 7.0 في بداية السكربتات التي يُراد تشغيلها بإصدار معيّن فأعلى، لتقليل الحوادث.
- كيف يمكن تنفيذ الحذف أو التغيير بأمان في PowerShell؟
- بالالتزام بترتيب «اعرض ← ضيّق ← سجّل ← جرّب ← نفّذ». وبالتحديد: اعرض الهدف أوّلاً بأوامر Get، ثمّ صفِّه عبر Where-Object، وتحقّق من قائمة الأهداف عبر Select-Object، واحفظ أثراً في CSV عبر Export-Csv، وتحقّق من التغيير المُزمَع عبر -WhatIf قبل التنفيذ الفعليّ. بما أنّ PowerShell يُنفِّذ التحقيق والتغيير على الشاشة نفسها، فإنّ عادة البدء بالتحقّق للقراءة فقط أمر مهمّ.
الملف الشخصي للمؤلف
صفحة الملف الشخصي لمؤلف المقالة.
غو كومورا
مؤسّس شركة كومورا سوفت ذ.م.م.
يركّز على تطوير برامج ويندوز، والاستشارات التقنية، والتحقيق في الأخطاء، ويتميّز في المشاريع التي تبقى فيها الأصول القديمة ناشطة، وفي تشخيص الأعطال التي يصعب تحديد سببها.