مجموعة أوامر PowerShell العمليّة ── إضافة وظائف صغيرة شائعة الاستخدام في العمل اليوميّ

· آخر تحديث: · · PowerShell, Windows, سطر الأوامر, الأتمتة, تحسين كفاءة العمل, الاستفادة من الأصول القائمة

سجل التعديلات (2 تحديثات، آخر تحديث 2 Sep، 2026)

سجل بالتغييرات التي أُجريت على هذا المقال. وحيثما حُفظت نسخة سابقة، تبقى متاحة للقراءة عبر رابط دائم يحمل معرّف DOI.

أُعيدَت الترجمة العربية كترجمة كاملة عن النص الياباني الأصلي، وأُضيفَت خريطة المعرفة.
أعيدت الترجمة كترجمة كاملة عن النص الياباني الأصلي. كانت النسخة العربية السابقة مختصراً يسقط أبواباً وجداول ورسوم Mermaid وتعليقات الأشكال وFAQ. أُعيدت هذه العناصر وفق الأصل الياباني، والادّعاءات التقنية مطابقة للنسخة اليابانية.
النشر الأول
الاستشهاد بهذا المقال(DOI: 10.5281/zenodo.21621531)

هذا المقال محفوظ على Zenodo. يرد أدناه معرّف DOI الذي يشير دائمًا إلى أحدث نسخة، ومعرّف DOI المثبَّت على النسخة التي تقرؤها.

غو كومورا (2026). مجموعة أوامر PowerShell العمليّة ── إضافة وظائف صغيرة شائعة الاستخدام في العمل اليوميّ. شركة كومورا سوفت ذ.م.م.. https://doi.org/10.5281/zenodo.21621531 https://comcomponent.com/ar/blog/2026/06/02/002-powershell-practical-command-recipes/

DOI (أحدث نسخة)
10.5281/zenodo.21621531
DOI (هذه النسخة)
10.5281/zenodo.22240942

1. ما ينبغي الإلمام به أوّلاً

بعد إتقان أساسيّات PowerShell، تصبح الخطوة التالية زيادة «الوظائف الصغيرة الشائعة الاستخدام»، ما يجعله أسهل استخداماً في العمل الفعليّ.

المقصود هنا بالوظائف الصغيرة ليس الأسماء المستعارة (aliases) القصيرة. في هذا المقال، لن نستخدم اختصارات مثل ls أو cat، بل أسماء الأوامر الرسميّة مثل Get-ChildItem وGet-Content وSelect-String.

وبناءً على ذلك، سنجعل من الممكن تنفيذ الأعمال التالية بسطر واحد أو بضعة أسطر من الأوامر.

عدّ العناصر
معرفة الحجم الإجماليّ
حذف التكرارات
التجميع حسب النوع
استخراج القيم المطلوبة فقط
مقارنة نتيجتين
عرض الأسطر المحيطة في السجلّ (log)
الإرسال إلى الحافظة (clipboard)
حفظ نتيجة التنفيذ مع عرضها على الشاشة في آنٍ واحد
التحقّق من متغيّرات البيئة والشبكة

PowerShell مفيد حتّى دون كتابة سكربتات طويلة. لنبدأ بزيادة «القطع الشائعة الاستخدام»، بحيث يمكن تركيبها تدريجيّاً في العمل اليوميّ.

الأهمّ ليس حفظ الأوامر عن ظهر قلب، بل أن تتذكّر «في هذا الموقف يمكن استخدام هذه القطعة».

كما أنّ الشيفرة الواردة في هذا المقال منشورة على GitHub كمجموعة أمثلة كاملة قابلة للتنفيذ (سكربتات الوصفات واختبارات Pester)، مرتَّبة حسب الموضوع وفق تبويب الفصول.

powershell-practical-command-recipes - komurasoft-blog-samples (GitHub)

الفرق عن المقال السابق

هذا المقال تتمّة لـ أساسيّات أوامر PowerShell ── العمليّات الأولى الواجب تعلّمها والاستخدام الآمن. الأدوار مقسومة كما يلي.

  أساسيّات أوامر PowerShell هذا المقال
الهدف أن تصير قادراً على لمس PowerShell أن تصير قادراً على عدّ النتائج المستخرجة وتجميعها ومقارنتها وإبقائها
المركز النحو وخطّ الأنابيب وطريقة البحث عن الأوامر قطع التجميع والمقارنة والاستخراج والإخراج
CSV / JSON أساسيّات القراءة والكتابة جانب تضييق النتيجة المقروءة بشرط وتجميعها
العمليّات / الخدمات / سجلّ الأحداث أساسيّات الحصول على القائمة جانب عدّ القائمة المحصَّلة حسب النوع وأخذ الفروق
أوامر التغيير ترتيب التنفيذ الآمن نفسه أوامر التحقيق والأثر التي تُدرَج في ذلك الترتيب

أي أنّ المقال السابق يصل إلى «القدرة على استخراج القيمة»، وهذا المقال هو «كيف تتعامل مع القيمة المستخرجة».

أساسيّات أوامر الحصول مثل Get-ChildItem وGet-Content وImport-Csv وGet-Service، وسياسة التنفيذ، وكتابة .ps1، ومعالجة الأخطاء، موجودة في المقال السابق. هذا المقال يمضي قُدماً على ذلك الفرض. تظهر في المقالين أيضاً أمور مثل استخدام أوامر Format في النهاية وExport-Csv -Encoding UTF8، لكنّ هذا المقال يعالجها من زاوية «كيف تُدخلها في التجميع والمقارنة».

في المخطّط، يشير الخطّ المتّصل إلى علاقة قائمة دائماً، ويشير الخطّ المتقطّع إلى علاقة مشروطة (شروط قيامها مذكورة في شرح كلّ علاقة في الصفحة التفصيليّة). القائمة الكاملة للعلاقات (المجموع 26، مع الأدلّة ودرجة اليقين) وتعريفات المفاهيم الرئيسة مجمّعة في صفحة تفاصيل خريطة المعرفة (باليابانية). البيانات: JSON-LD / Turtle

2. الفكر المتَّبع هنا

الافتراضات الثلاثة كالتالي.

  1. تُكتَب أسماء الأوامر بصيغتها الرسميّة
  2. التركيز على الأوامر القرائيّة
  3. أوامر التغيير تُدرَس دائماً مع تأكيد الهدف أو مع -WhatIf

مثلاً، أأمن من حفظ أمر حذف الملفّات مباشرة اكتساب التدفّق التالي أوّلاً.

اعرض الهدف
  → ضيّقه بشرط
  → عُدّ العناصر
  → إن لزم فاتركه في CSV
  → أكّد خطّة التغيير
  → نفّذ

في هذا المقال نركّز على التحقيق والتجميع والمقارنة والإخراج، أكثر من العمليّات القويّة مثل الحذف والإيقاف.

3. خريطة الأوامر الشائعة

الأوامر الرئيسيّة المستخدمة هنا. في الطرف الأيمن الفصل الذي يتناولها بالتفصيل.

ما تريد فعله الأمر الفصل
معرفة العدد أو المجموع Measure-Object 4، 5
استخراج القيم المطلوبة فقط Select-Object -ExpandProperty 6
ترتيب التكرارات Sort-Object -Unique 7
التجميع حسب النوع Group-Object 8
إخراج الأعمدة اللازمة أو صنع عمود محسوب Select-Object 9
الترتيب Sort-Object 10
البحث عن سلسلة Select-String 12
مقارنة نتيجتين Compare-Object 14
حساب قيمة التجزئة (hash) Get-FileHash 15
استخدام الحافظة Set-Clipboard / Get-Clipboard 16
الإخراج إلى الشاشة والملفّ معاً Tee-Object 17
إبقاء سجلّ العمل Start-Transcript 18
تأكيد وصول الشبكة Test-Connection / Test-NetConnection 26
قياس زمن المعالجة Measure-Command 28
النظر في تفاصيل الخطأ Get-Error 31
معالجة كلّ عنصر ForEach-Object في الفصول حسب الحاجة

لا يلزم حفظ الكلّ دفعة واحدة. المستحسَن الحفظ مقروناً بالغرض: «للعدّ Measure-Object»، «للتجميع Group-Object»، «للمقارنة Compare-Object».

خريطة الفصول حسب الغرض

من الفصل 4 إلى الفصل 36 تنقسم إلى الكتل التالية. اقرأ من الموضع الذي تريده.

الفئة الفصول ما تتناوله
التجميع والترتيب 4–11 العدد، والمجموع، والحدّ الأقصى والمتوسّط، واستخراج القيم، وإزالة التكرار، والتجميع حسب النوع، والعمود المحسوب، والترتيب، وموضع أوامر Format
تحقيق النصّ والسجلّات 12–14 البحث عن السلاسل والأسطر المحيطة، والاستبدال، ومقارنة قائمتين
محتوى الملفّات والبيانات 15، 19، 20 تأكيد قيمة التجزئة، وتضييق CSV، وقيم إعداد JSON
الإخراج والأثر 16–18 الإرسال إلى الحافظة، والإخراج المتزامن إلى الشاشة والملفّ، وسجلّ العمل
تحقيق النظام 21–25، 31 متغيّرات البيئة، والملفّ الشخصيّ، والعمليّات، والخدمات، وسجلّ الأحداث، وتفاصيل الخطأ
الشبكة 26، 27 تأكيد الوصول، واستجابة الويب
أسلوب التنفيذ 28–30 قياس زمن التنفيذ، والتنفيذ في الخلفيّة، وسجلّ الأوامر
تأكيد النحو 32 عوامل المقارنة
وصفات جاهزة للاستخدام 33، 34 11 وصفة عمليّة، وتنبيهات التركيب مع أوامر التغيير
جدول سريع 35 ورقة غشّ للتذكّر انطلاقاً من الغرض

إن كانت «المسألة التي تريد تحقيقها محدَّدة لكنّك لا تتذكّر أيّ أمر»، فأقصر طريق هو الدخول من الجدول السريع في الفصل 35.

4. عدّ العناصر ── Measure-Object

أوّل ما يُستخدم كثيراً هو عدّ العناصر.

عُدّ ملفّات المجلّد الحاليّ.

Get-ChildItem . -File | Measure-Object

للعدّ مع المجلّدات الفرعيّة.

Get-ChildItem . -File -Recurse | Measure-Object

Count في نتيجة Measure-Object هو العدد.

إن أردت مجموع أحجام الملفّات فجمّع Length.

Get-ChildItem . -File -Recurse |
  Measure-Object -Property Length -Sum

غير أنّ الرقم يبقى بالبايت فيصعب على الإنسان قراءته قليلاً، لذا حوّله إلى وحدة GB.

$size = Get-ChildItem . -File -Recurse |
  Measure-Object -Property Length -Sum

[math]::Round($size.Sum / 1GB, 2)

هذا مفيد عندما تريد نظرة تقريبيّة إلى حجم المجلّد ككلّ.

5. النظر أيضاً إلى الحدّ الأقصى والمتوسّط

Measure-Object يُخرج لا المجموع فحسب، بل أيضاً القيمة القصوى والمتوسّط.

Get-ChildItem . -File |
  Measure-Object -Property Length -Sum -Average -Maximum -Minimum

يُستخدم عند النظر إلى تباين أحجام الملفّات.

يمكن أيضاً جمع زمن CPU التراكميّ للعمليّات. CPU في Get-Process ليس معدّل الاستخدام، بل ثواني زمن المعالج المستخدمة منذ إقلاع العمليّة.

Get-Process |
  Measure-Object -Property CPU -Sum

غير أنّ هذه القيمة تراكميّة لا معدّل استخدام لحظيّ، فتتغيّر حسب توقيت التنفيذ ومدة تشغيل العمليّة.

تكفي للنظر في التحقيق، لكنّ المراقبة الدقيقة تحتاج أيضاً أداة مراقبة مخصَّصة وتصميم سجلّ.

6. استخراج القيمة وحدها ── Select-Object -ExpandProperty

Select-Object يُستخدم كثيراً لاختيار الأعمدة.

Get-Process |
  Select-Object Name, Id, CPU

هذا يُخرج «كائناً له أعمدة Name وId وCPU».

ومن جهة أخرى، لاستخراج القيمة وحدها استخدم -ExpandProperty.

Get-Process -Name notepad -ErrorAction SilentlyContinue |
  Select-Object -ExpandProperty Id

واستخراج اسم الملفّ وحده كذلك.

Get-ChildItem . -File |
  Select-Object -ExpandProperty Name

عندما تريد تمرير نتيجة الأمر إلى أمر آخر أو إلى ملفّ نصّي، يكون -ExpandProperty مفيداً.

مثلاً، احفظ قائمة أسماء الملفّات فقط.

Get-ChildItem . -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\file-names.txt -Encoding UTF8

Select-Object Name وSelect-Object -ExpandProperty Name متشابهان، لكنّ شكل النتيجة مختلف.

Select-Object Name
  → جدول له عمود اسمه Name

Select-Object -ExpandProperty Name
  → قيمة Name نفسها

إن أردت CSV فالإبقاء كعمود أفضل، وإن أردت التمرير إلى معالجة نصّيّة أخرى فالقيمة وحدها أيسر تعاملاً.

7. حذف التكرار ── Sort-Object -Unique

عندما تريد قائمة بامتدادات الملفّات فقط.

Get-ChildItem . -File |
  Select-Object -ExpandProperty Extension |
  Sort-Object -Unique

عند التنفيذ تُعرض الامتدادات بعد إزالة التكرار، مثل .txt و.log و.csv.

يمكن أيضاً النظر إلى أنواع أسماء العمليّات فقط.

Get-Process |
  Select-Object -ExpandProperty ProcessName |
  Sort-Object -Unique

مثال استخراج قائمة أسماء الأقسام فقط من CSV لمستخدمين.

Import-Csv .\users.csv |
  Select-Object -ExpandProperty Department |
  Sort-Object -Unique

عندما «تظهر القيمة نفسها كثيراً في القائمة فيصعب النظر»، يفيد أن تتذكّر أوّلاً Sort-Object -Unique.

8. التجميع حسب النوع ── Group-Object

إن أردت لا حذف التكرار فحسب، بل «ماذا يوجد وبكم عدداً»، فاستخدم Group-Object.

عُدّ الملفّات حسب الامتداد.

Get-ChildItem . -File |
  Group-Object -Property Extension -NoElement |
  Sort-Object -Property Count -Descending

الإخراج بهذا الشكل. العدد والامتداد يتغيّران بحسب محتوى المجلّد، لكنّ ترتيب الأعمدة واحد.

Count Name
----- ----
   42 .log
   18 .csv
    7 .txt
    3

الصفّ الذي Name فيه فارغ هو ملفّ بلا امتداد.

إن أزلت -NoElement زاد عمود Group وظهرت العناصر الداخلة في تلك المجموعة نفسها.

Count Name  Group
----- ----  -----
   42 .log  {app-20260601.log, app-20260602.log, app-20260603.log...}
   18 .csv  {export-01.csv, export-02.csv, export-03.csv...}

عندما تريد النظر إلى العدد فقط، يملأ عمود Group الشاشة، لذا تُضاف -NoElement. وبالعكس لا تُضاف عندما تريد تأكيد ما دخل في تلك المجموعة.

عُدّ حسب حالة الخدمة.

Get-Service |
  Group-Object -Property Status -NoElement

عُدّ حسب مستوى سجلّ الأحداث.

Get-WinEvent -LogName System -MaxEvents 500 |
  Group-Object -Property LevelDisplayName -NoElement

Group-Object يناسب الإمساك بالصورة الكلّيّة في أوّل التحقيق.

أيّ امتداد أكثر
أيّ حالة خدمة أكثر
أيّ مستوى خطأ أكثر
أيّ بيانات قسم أكثر

يُستخدم عندما تريد النظر إلى التوزيع أوّلاً قبل المحتوى التفصيليّ.

9. صنع الأعمدة اللازمة ── إضافة عمود محسوب

حجم الملفّ يُؤخذ من Length، لكنّ الوحدة بايت. النظر إلى البايت في كلّ مرّة مرهق، لذا يفيد صنع عمود محوَّل إلى MB أو KB.

Get-ChildItem . -File |
  Select-Object Name, @{Name="SizeKB"; Expression={ [math]::Round($_.Length / 1KB, 1) }}, LastWriteTime

مثال النظر بالترتيب من الأكبر، مع المجلّدات الفرعيّة.

Get-ChildItem . -File -Recurse |
  Sort-Object -Property Length -Descending |
  Select-Object -First 20 FullName, @{Name="SizeMB"; Expression={ [math]::Round($_.Length / 1MB, 2) }}, LastWriteTime

@{Name="..."; Expression={ ... }} كتابة لصنع عمود محسوب. تبدو طويلة قليلاً في البداية، لكنّها تُستخدم كثيراً في العمل.

مثلاً يمكن عرض استخدام ذاكرة العمليّة بوحدة MB.

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}

عند الإخراج في تقرير، يصير عمود مثل SizeMB أيسر قراءة من Length الأصليّ.

10. النظر من الأحدث والأقدم والأكبر

في PowerShell الترتيب هو Sort-Object.

انظر إلى الملفّات المحدَّثة حديثاً.

Get-ChildItem . -File |
  Sort-Object -Property LastWriteTime -Descending |
  Select-Object -First 10 Name, LastWriteTime

انظر إلى الملفّات القديمة.

Get-ChildItem . -File |
  Sort-Object -Property LastWriteTime |
  Select-Object -First 10 Name, LastWriteTime

انظر إلى الملفّات الكبيرة.

Get-ChildItem . -File -Recurse |
  Sort-Object -Property Length -Descending |
  Select-Object -First 10 FullName, Length

هذه الثلاثة تُستخدم كثيراً.

من الأحدث → LastWriteTime -Descending
من الأقدم   → LastWriteTime
من الأكبر → Length -Descending

توليفة يكثر ظهورها في تحقيق السجلّات وترتيب الملفّات غير اللازمة وتحقيق سعة القرص.

11. أوامر Format للعرض على الشاشة في النهاية فقط

عندما تريد تيسيراً للنظر على الشاشة استخدم Format-Table أو Format-List.

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, WorkingSet |
  Format-Table -AutoSize

للنظر في تفاصيل عنصر واحد يكون Format-List مفيداً.

Get-Process -Id $PID |
  Format-List *

غير أنّ Format-Table وFormat-List «للعرض».

أأمن ألا تُستخدم قبل الإخراج إلى CSV أو قبل المعالجة بأمر لاحق.

# 避ける
Get-Process |
  Format-Table Name, Id |
  Export-Csv .\process.csv -NoTypeInformation

للإخراج إلى CSV اختر الأعمدة بـ Select-Object.

# 正しい
Get-Process |
  Select-Object Name, Id |
  Export-Csv .\process.csv -NoTypeInformation -Encoding UTF8

إن تردّدت فكّر كما يلي.

للنظر على الشاشة فقط → Format-Table / Format-List
للاستخدام لاحقاً      → Select-Object

12. جعل بحث السجلّات أيسر قليلاً ── Select-String

للبحث عن سلسلة استخدم Select-String.

Select-String -Path .\logs\*.log -Pattern "ERROR"

يمكن أيضاً تحديد أنماط متعدّدة.

Select-String -Path .\logs\*.log -Pattern "ERROR", "WARN", "FATAL"

للنظر إلى الأسطر المحيطة أيضاً استخدم -Context.

Select-String -Path .\logs\*.log -Pattern "ERROR" -Context 2

هذا يعرض أيضاً سطرين قبل السطر المطابق وبعده، فيفيد عندما تريد تأكيد السياق حول الخطأ.

للبحث كسلسلة بسيطة استخدم -SimpleMatch.

Select-String -Path .\logs\*.log -Pattern "[ERROR]" -SimpleMatch

-Pattern في Select-String يُعامل عادة كتعبير نمطيّ. إن أردت البحث عن رموز مثل [ أو . كما هي، فإنّ إضافة -SimpleMatch أوضح.

عندما تريد التمييز بين الأحرف الكبيرة والصغيرة.

Select-String -Path .\logs\*.log -Pattern "Error" -CaseSensitive

يمكن أيضاً إبقاء نتيجة البحث في CSV.

Select-String -Path .\logs\*.log -Pattern "ERROR" |
  Select-Object Path, LineNumber, Line |
  Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8

13. استبدال السلاسل

لاستبدال جزء من النصّ استخدم -replace.

"server01.example.com" -replace "\.example\.com$", ""

عند استبدال محتوى ملفّ، أأمن ألا تكتب فوق الملفّ الأصليّ فوراً. أخرج أوّلاً إلى ملفّ آخر.

(Get-Content .\appsettings.json -Raw) -replace "localhost", "db01" |
  Set-Content .\appsettings.preview.json -Encoding UTF8

بعد التأكيد، طبِّق على الملفّ الأصليّ إن لزم.

في ملفّات الإعداد والاستبدال الجماعيّ، إن كثرت أهداف الاستبدال وقعت حوادث. أأمن أن تؤكّد الأهداف أوّلاً بـ Select-String ثمّ تستبدل.

Select-String -Path .\appsettings.json -Pattern "localhost" -SimpleMatch

14. مقارنة نتيجتين ── Compare-Object

Compare-Object أمر للنظر في الفرق بين قائمتين.

متى يُستخدم: عندما تؤكّد أنّ التكوين لم يتغيّر قبل العمل وبعده، أو عندما تقابل قائمتي إعداد أو برمجيّات مثبَّتة على حاسوبين، أو عندما تقارن تكوين الخدمات بين الإنتاج والاختبار. ينفع في استعمال «يفترض أنّه لم يتغيّر».

مثلاً، قارن قائمتي أسماء ملفّات قبل التغيير وبعده.

Compare-Object `
  -ReferenceObject (Get-Content .\before.txt) `
  -DifferenceObject (Get-Content .\after.txt)

إن احتوى before.txt على a.log وb.log وc.log، وafter.txt على b.log وc.log وd.log، صار الإخراج كالتالي.

InputObject SideIndicator
----------- -------------
d.log       =>
a.log       <=

b.log وc.log الموجودان في الاثنين لا يُعرضان افتراضيّاً. ما يُعرض هو الفرق فقط.

معنى SideIndicator كالتالي.

العرض المعنى
<= في الجانب الأيسر فقط، أي في ReferenceObject
=> في الجانب الأيمن فقط، أي في DifferenceObject
== في الاثنين. يُعرض عند إضافة -IncludeEqual

اتّجاه السهم يسهل حفظه إن قرأته كميل إلى جانب ReferenceObject (اليسار) أو DifferenceObject (اليمين). في المثال أعلاه، a.log في اليسار (قبل التغيير) فقط فهو ملفّ اختفى، وd.log في اليمين (بعد التغيير) فقط فهو ملفّ زاد.

مثال حفظ قائمة أسماء ملفّات مجلّد ثمّ مقارنتها.

Get-ChildItem .\before -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\before-list.txt -Encoding UTF8

Get-ChildItem .\after -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\after-list.txt -Encoding UTF8

Compare-Object `
  -ReferenceObject (Get-Content .\before-list.txt) `
  -DifferenceObject (Get-Content .\after-list.txt)

يمكن أيضاً النظر في تغيّر قائمة الخدمات.

Get-Service |
  Select-Object Name, Status |
  Export-Csv .\services-before.csv -NoTypeInformation -Encoding UTF8

بعد التغيير أخرج مرّة أخرى.

Get-Service |
  Select-Object Name, Status |
  Export-Csv .\services-after.csv -NoTypeInformation -Encoding UTF8

ثمّ قارن.

Compare-Object `
  -ReferenceObject (Import-Csv .\services-before.csv) `
  -DifferenceObject (Import-Csv .\services-after.csv) `
  -Property Name, Status

إبقاء الفرق قبل العمل وبعده يسهّل التحقيق والتقرير.

15. تأكيد قيمة تجزئة الملفّ ── Get-FileHash

عندما تريد تأكيد أنّ ملفّاً نزّلته أو ملفّ توزيع هو نفسه، استخدم قيمة التجزئة.

Get-FileHash .\installer.exe -Algorithm SHA256

لتأكيد ملفّات مجلّد مجتمعة.

Get-ChildItem .\downloads -File |
  ForEach-Object { Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 }

يمكن أيضاً إبقاؤها في CSV.

Get-ChildItem .\downloads -File |
  ForEach-Object { Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 } |
  Select-Object Path, Hash |
  Export-Csv .\hashes.csv -NoTypeInformation -Encoding UTF8

قد يبدو الملفّان متماثلين بالاسم ويختلف المحتوى. في موادّ التوزيع والنسخ الاحتياطيّ وعمل الانتقال، إبقاء قيمة التجزئة يسهّل التأكيد.

16. الإرسال إلى الحافظة ── Set-Clipboard

متى يُستخدم: عندما تلصق نتيجة التحقيق كما هي في ردّ استفسار أو تقرير عطل، أو عندما تلصقها في Excel جدولاً. تُحذف دفعة واحدة خطوات صنع ملفّ وفتحه وتحديده ونسخه.

عندما تريد لصق نتيجة أمر في بريد أو محادثة، الإرسال إلى الحافظة مفيد.

Get-Service |
  Select-Object Name, Status |
  ConvertTo-Csv -NoTypeInformation |
  Set-Clipboard

للنظر في محتوى الحافظة.

Get-Clipboard

للصق في Excel بفصل جدوليّ، اجعل فاصل ConvertTo-Csv جدولاً.

Get-Process |
  Select-Object Name, Id, CPU |
  ConvertTo-Csv -NoTypeInformation -Delimiter "`t" |
  Set-Clipboard

إن كان المراد مشاركة النتيجة مؤقّتاً فقط، فهذا أسهل من صنع ملفّ في كلّ مرّة. لكن إن أردت إبقاء أثر فاحفظ في ملفّ عبر Export-Csv.

17. العرض على الشاشة والإبقاء في ملفّ معاً ── Tee-Object

عندما تريد النظر إلى النتيجة على الشاشة وإبقاءها في ملفّ في آنٍ واحد استخدم Tee-Object.

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, WorkingSet |
  Tee-Object -FilePath .\top-process.txt

Tee-Object يمرّر نتيجة خطّ الأنابيب في اتجاهين.

يعرض على الشاشة
ويحفظ أيضاً في ملفّ

يناسب استعمال «انظر بينما تسجّل» أثناء التحقيق. غير أنّ Export-Csv أيسر تعاملاً إن أردت الفتح لاحقاً في Excel.

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, WorkingSet |
  Export-Csv .\top-process.csv -NoTypeInformation -Encoding UTF8

يسهل التفكير: للشاشة Tee-Object، ولإبقاء بيانات جدول Export-Csv.

18. إبقاء سجلّ العمل ── Start-Transcript

متى يُستخدم: عند العمل في بيئة إنتاج، وعندما يلزم لاحقاً التقرير عن «ماذا نُفِّذ وبأيّ ترتيب». يُضرب مرّة قبل البدء كأثر لمعالجة عطل أو عمل صيانة.

عندما تريد تسجيل سلسلة عمليّات استخدم Start-Transcript.

Start-Transcript -Path .\work-log.txt

بعد ذلك تُسجَّل الأوامر المنفَّذة وإخراج الشاشة.

للإنهاء.

Stop-Transcript

في عمل التحقيق تريد لاحقاً تأكيد ما يلي.

أيّ أمر نُفِّذ
في أيّ مجلّد عملت
أيّ نتيجة ظهرت
هل ظهر خطأ

Start-Transcript يصير تأميناً عندما تنسى مذكّرة العمل. غير أنّ العمل الذي تظهر فيه على الشاشة معلومات لا يجوز تسجيلها، مثل كلمات المرور والرموز (tokens)، يحتاج انتباهاً في طريقة الاستخدام.

19. قراءة CSV والنظر بشرط

في بيانات الأعمال يظهر CSV كثيراً.

افترض مثلاً وجود users.csv كالتالي.

Name,Department,Enabled
Suzuki,Sales,true
Tanaka,Accounting,false
Sato,Sales,true

اقرأ الملفّ.

Import-Csv .\users.csv

انظر إلى من قسمهم Sales فقط.

Import-Csv .\users.csv |
  Where-Object { $_.Department -eq "Sales" }

أخرج المستخدمين المفعَّلين فقط إلى CSV آخر.

Import-Csv .\users.csv |
  Where-Object { $_.Enabled -eq "true" } |
  Export-Csv .\enabled-users.csv -NoTypeInformation -Encoding UTF8

قيم CSV كثيراً ما تُعامل كنصوص، فعند مقارنة true / false أو الأرقام فكّر في تحويل النوع عند الحاجة.

مثلاً، للنظر إلى الصفوف ذات الدرجة 80 فأعلى.

Import-Csv .\scores.csv |
  Where-Object { [int]$_.Score -ge 80 }

20. النظر إلى قيم إعداد JSON

JSON يُستخدم كثيراً في ملفّات الإعداد وواجهات Web API.

$config = Get-Content .\settings.json -Raw | ConvertFrom-Json
$config

يمكن أيضاً النظر إلى قيمة معيّنة فقط.

$config.Database.Host

مثال تغيير قيمة وحفظها في ملفّ آخر.

$config.Database.Host = "db01"
$config |
  ConvertTo-Json -Depth 10 |
  Set-Content .\settings.updated.json -Encoding UTF8

عند التعامل مع JSON كثيراً ما يُستخدم Get-Content -Raw. بإضافة -Raw تُقرأ الملفّ كلّه كسلسلة واحدة، فيكون أوضح عند التعامل مع JSON متعدّد الأسطر.

21. النظر إلى متغيّرات البيئة

متغيّرات البيئة تُستخدم كثيراً في إعداد التطبيق وتأكيد المسارات.

انظر إلى القائمة.

Get-ChildItem Env:

انظر إلى اسم المستخدم الحاليّ.

$env:USERNAME

انظر إلى المجلّد المؤقّت.

$env:TEMP

قسّم PATH ليسهل النظر.

$env:PATH -split ";"

اضبط متغيّر بيئة في جلسة PowerShell الحاليّة فقط.

$env:APP_MODE = "Development"

هذا الضبط ساري في PowerShell المفتوح الآن فقط.

للحفظ كمتغيّر بيئة للمستخدم، افعل كما يلي.

[Environment]::SetEnvironmentVariable("APP_MODE", "Development", "User")

هذه عمليّة تغيّر البيئة، لذا على حاسوب الشركة أو خادم الإنتاج أكّد نطاق الأثر ثمّ نفّذ.

22. تأكيد الملفّ الشخصيّ (profile)

في PowerShell ملفّ شخصيّ يُحمَّل عند الإقلاع.

أكّد المكان.

$PROFILE

أكّد الوجود.

Test-Path $PROFILE

للإنشاء.

New-Item -ItemType File -Path $PROFILE -Force

افتحه في المفكرة.

notepad $PROFILE

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

23. النظر إلى العمليّات

في تحقيق العمليّات كثيراً ما يُبدأ بالنظر من الأكبر في استخدام الذاكرة.

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}

ضيّق باسم معيّن.

Get-Process -Name notepad -ErrorAction SilentlyContinue

عند إيقاف عمليّة لا تنفّذ فوراً؛ أكّد بـ -WhatIf.

Stop-Process -Name notepad -WhatIf

إن لم تكن هناك مشكلة فنفّذ.

Stop-Process -Name notepad

في بيئة الإنتاج قد يؤدّي إيقاف العمليّة إلى أثر على العمل. قبل الإيقاف أكّد الهدف والمستخدم وطريقة الاستعادة.

24. النظر إلى الخدمات

انظر إلى قائمة الخدمات.

Get-Service

لعرض الخدمات المتوقّفة فقط.

Get-Service |
  Where-Object { $_.Status -eq "Stopped" }

ابحث عن خدمات تلقائيّة الإقلاع لكنّها متوقّفة.

Get-Service |
  Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" } |
  Select-Object Name, DisplayName, Status, StartType

عند إعادة تشغيل خدمة أيضاً، أكّد الهدف أوّلاً.

Get-Service -Name "Spooler"

جرّب.

Restart-Service -Name "Spooler" -WhatIf

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

25. النظر إلى سجلّ الأحداث

في تحقيق Windows كثيراً ما يُنظر إلى سجلّ الأحداث.

انظر إلى أحدث 100 عنصر في سجلّ النظام.

Get-WinEvent -LogName System -MaxEvents 100 |
  Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message

ضيّق إلى الأخطاء والتحذيرات فقط.

Get-WinEvent -LogName System -MaxEvents 500 |
  Where-Object { $_.LevelDisplayName -in @("Error", "Warning") } |
  Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message

انظر إلى أخطاء آخر 24 ساعة فقط.

$start = (Get-Date).AddHours(-24)

Get-WinEvent -FilterHashtable @{ LogName = "System"; StartTime = $start } |
  Where-Object { $_.LevelDisplayName -eq "Error" } |
  Select-Object TimeCreated, ProviderName, Id, 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

سجلّ الأحداث يسهل أن يكثر عدده، لذا فتضييق النطاق بـ -MaxEvents أو بتحديد الفترة أمر مهمّ.

26. تأكيد الشبكة

لتأكيد الوصول استخدم Test-Connection.

Test-Connection example.com -Count 4

لتأكيد وصول منفذ TCP على Windows يكون Test-NetConnection مفيداً.

Test-NetConnection example.com -Port 443

لتأكيد حلّ DNS.

Resolve-DnsName example.com

في تحقيق الشبكة تُفصل الأسباب كما يلي.

هل يمكن حلّ الاسم
هل يصل إلى عنوان IP
هل المنفذ المقصود مفتوح
هل لا أثر لوكيل أو جدار حماية

لا تحكم بالكلّ من PowerShell وحده؛ استخدمه مدخلاً للعزل.

27. النظر إلى نتيجة الويب

للحصول على صفحة ويب استخدم Invoke-WebRequest.

Invoke-WebRequest https://example.com |
  Select-Object StatusCode, StatusDescription

للتعامل مع نتيجة JSON API يكون Invoke-RestMethod مفيداً.

Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell |
  Select-Object full_name, stargazers_count, forks_count

نتيجة API كثيراً ما تُعامل من البداية ككائن PowerShell، فيسهل تركيبها مع Select-Object وWhere-Object.

عند تحقيق API داخليّ أيضاً ابدأ بقراءة GET.

عند التعامل مع معلومات مصادقة أو رموز (tokens) انتبه إلى العرض على الشاشة والتسجيل في transcript.

28. قياس زمن التنفيذ ── Measure-Command

متى يُستخدم: عندما تحكم «هل يجوز وضع هذه المعالجة على دفعة ليليّة»، أو عندما تقارن إن صارت أسرع بعد تغيير الكتابة. يصير الحسم بالرقم لا بالإحساس.

عندما تريد معرفة كم تستغرق المعالجة استخدم Measure-Command.

Measure-Command {
  Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
    Measure-Object
}

النتيجة تتضمّن TotalSeconds وTotalMilliseconds.

$result = Measure-Command {
  Get-ChildItem . -File -Recurse | Measure-Object
}

$result.TotalSeconds

عندما تريد تسريع سكربت، المهمّ قياس الزمن لا الإحساس. غير أنّ النتيجة تتغيّر بعدد الملفّات وحالة القرص وحالة الشبكة، فلا تحكم من نتيجة مرّة واحدة؛ أكّد عدّة مرّات.

29. تشغيل معالجة طويلة في الخلف ── Start-Job

متى يُستخدم: عندما تريد تمرير معالجة تستغرق دقائق مثل مسح مجلّد كبير بالكامل أو حساب التجزئة، وفي الأثناء تمضي تحقيقاً آخر. وبالعكس، جعل معالجة تنتهي في ثوانٍ وظيفة (job) يجعل عبء الإقلاع أكبر.

عندما تريد تنفيذ تحقيق طويل كوظيفة منفصلة استخدم Start-Job.

$job = Start-Job -ScriptBlock {
  Get-ChildItem C:\Windows -File -Recurse -ErrorAction SilentlyContinue |
    Measure-Object
}

انظر إلى حالة الوظيفة.

Get-Job

استلم النتيجة.

Receive-Job $job

احذف الوظيفة التي صارت غير لازمة.

Remove-Job $job

Start-Job مفيد، لكن لا يلزم الإكثار منه من البداية. نفّذ أوّلاً بشكل عاديّ، واجعل وظيفةً المعالجات التي تطول فقط، فيصير أوضح.

30. استخدام سجلّ الأوامر

متى يُستخدم: عندما تنسخ إلى دليل أو سكربت أمراً ركّبته بالتجربة بعد أن نجح.

للنظر إلى الأوامر المنفَّذة سابقاً استخدم Get-History.

Get-History

يسّر النظر إلى سطر الأمر فقط.

Get-History |
  Select-Object Id, CommandLine

أعد تنفيذ سجلّ معيّن.

Invoke-History 12

السجلّ مفيد، لكن يمكن أيضاً إعادة تنفيذ أوامر خطرة. عند إعادة تنفيذ أوامر تغيير مثل Remove-Item أو Stop-Process من السجلّ، أكّد المحتوى ثمّ نفّذ.

31. النظر في تفاصيل الخطأ ── Get-Error

في PowerShell 7 يمكن استخدام Get-Error للنظر التفصيليّ في أحدث خطأ.

Get-Error

عندما تريد رسالة أحدث خطأ فقط.

$Error[0].Exception.Message

عند حدوث خطأ، لا تنظر إلى الحروف الحمراء على الشاشة وحدها؛ أكّد النقاط التالية.

بأيّ أمر فشل
بأيّ مسار أو هدف فشل
هل المشكلة صلاحيات
هل الملفّ غير موجود
هل المشكلة شبكة أو قفل

إن أردت إبقاء نتيجة التحقيق فركّب مع Start-Transcript أو Export-Csv.

32. عوامل المقارنة الشائعة

في Where-Object تُستخدم عوامل المقارنة كثيراً.

العامل المعنى مثال
-eq يساوي $_.Status -eq "Running"
-ne لا يساوي $_.Status -ne "Running"
-gt أكبر من $_.Length -gt 10MB
-ge أكبر أو يساوي $_.Length -ge 10MB
-lt أصغر من $_.Length -lt 10MB
-le أصغر أو يساوي $_.Length -le 10MB
-like تطابق حرف بدل $_.Name -like "*.log"
-match تطابق تعبير نمطيّ $_.Name -match "^app"
-in القيمة ضمن قائمة $_.Status -in @("Running", "Paused")
-contains القائمة تحتوي القيمة @("a", "b") -contains "a"

أمثلة.

Get-ChildItem . -File |
  Where-Object { $_.Length -gt 10MB }
Get-Service |
  Where-Object { $_.Status -in @("Running", "Paused") }
Get-ChildItem . -File |
  Where-Object { $_.Name -match "\.log$" }

في البداية يكفي -eq و-ne و-gt و-lt و-like. بعد الاعتياد يصير كتابة الشرط أيسر بـ -match و-in.

33. وصفات عمليّة صغيرة

من هنا أمثلة بشكل يسهل استخدامه كما هو في العمل.

النظر إلى عدد الملفّات حسب الامتداد

Get-ChildItem C:\Work -File -Recurse |
  Group-Object -Property Extension -NoElement |
  Sort-Object -Property Count -Descending

يُستخدم عندما تريد إمساكاً تقريبيّاً بمحتوى المجلّد.

النظر إلى أكبر 20 ملفّاً

Get-ChildItem C:\Work -File -Recurse |
  Sort-Object -Property Length -Descending |
  Select-Object -First 20 FullName, @{Name="SizeMB"; Expression={ [math]::Round($_.Length / 1MB, 2) }}

يُستخدم كثيراً في تحقيق سعة القرص.

النظر إلى الملفّات المحدَّثة خلال آخر 24 ساعة

$since = (Get-Date).AddHours(-24)

Get-ChildItem C:\Work -File -Recurse |
  Where-Object { $_.LastWriteTime -ge $since } |
  Select-Object FullName, Length, LastWriteTime

يُستخدم بعد حدوث عطل للنظر في أيّ ملفّات حُدِّثت.

جعل أسطر السجلّ المحتوية على ERROR في CSV

Select-String -Path C:\App\Logs\*.log -Pattern "ERROR" |
  Select-Object Path, LineNumber, Line |
  Export-Csv .\error-lines.csv -NoTypeInformation -Encoding UTF8

يصير تبادل نتيجة التحقيق أيسر.

النظر إلى سطرين قبل ERROR وبعده

Select-String -Path C:\App\Logs\*.log -Pattern "ERROR" -Context 2

يُستخدم عندما تريد النظر في سياق السبب.

النظر إلى العمليّات الأكبر في استخدام الذاكرة

Get-Process |
  Sort-Object -Property WorkingSet -Descending |
  Select-Object -First 10 Name, Id, @{Name="MemoryMB"; Expression={ [math]::Round($_.WorkingSet / 1MB, 1) }}

النظر إلى خدمات تلقائيّة الإقلاع لكنّها متوقّفة

Get-Service |
  Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" } |
  Select-Object Name, DisplayName, Status, StartType

جعل أخطاء سجلّ النظام في CSV

Get-WinEvent -LogName System -MaxEvents 500 |
  Where-Object { $_.LevelDisplayName -eq "Error" } |
  Select-Object TimeCreated, ProviderName, Id, Message |
  Export-Csv .\system-errors.csv -NoTypeInformation -Encoding UTF8

إرسال نتيجة الأمر إلى الحافظة

Get-Service |
  Select-Object Name, DisplayName, Status |
  ConvertTo-Csv -NoTypeInformation |
  Set-Clipboard

مفيد عند اللصق في بريد أو محادثة.

مقارنة قائمة الملفّات قبل العمل وبعده

Get-ChildItem C:\Work -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\before.txt -Encoding UTF8

خذها مرّة أخرى بعد العمل.

Get-ChildItem C:\Work -File |
  Select-Object -ExpandProperty Name |
  Set-Content .\after.txt -Encoding UTF8

قارن.

Compare-Object (Get-Content .\before.txt) (Get-Content .\after.txt)

النظر إلى الحجم الإجماليّ للمجلّد بوحدة GB

$size = Get-ChildItem C:\Work -File -Recurse |
  Measure-Object -Property Length -Sum

[math]::Round($size.Sum / 1GB, 2)

34. تنبيهات التركيب مع أوامر التغيير

كثير ممّا سبق قرائيّ، وهذه وحدها يمكن تجربتها بارتياح نسبيّ. ومن جهة أخرى، هذه أوامر تغيير.

العمليّة الأمر
النسخ Copy-Item
النقل Move-Item
الحذف Remove-Item
إعادة التسمية Rename-Item
إيقاف عمليّة Stop-Process
إعادة تشغيل خدمة Restart-Service
ضبط متغيّر بيئة دائم [Environment]::SetEnvironmentVariable()

أوامر التغيير تُستخدم بهذا الترتيب.

1. اعرض الهدف بأوامر Get
2. ضيّق بـ Where-Object
3. انظر إلى قائمة الأهداف بـ Select-Object
4. عُدّ بـ Measure-Object
5. إن لزم فاترك بـ Export-Csv
6. إن أمكن -WhatIf فجرّب
7. نفّذ

مثلاً عند حذف ملفّات .tmp قديمة.

انظر إلى الهدف أوّلاً.

$limit = (Get-Date).AddDays(-30)

$targets = Get-ChildItem C:\Temp -Filter *.tmp -File -Recurse |
  Where-Object { $_.LastWriteTime -lt $limit }

$targets |
  Select-Object FullName, Length, LastWriteTime

عُدّ العناصر.

$targets | Measure-Object

اترك في CSV.

$targets |
  Select-Object FullName, Length, LastWriteTime |
  Export-Csv .\delete-targets.csv -NoTypeInformation -Encoding UTF8

أكّد خطّة الحذف.

$targets | Remove-Item -WhatIf

إن لم تكن هناك مشكلة فنفّذ.

$targets | Remove-Item

مجرّد الالتزام بهذا التدفّق يقلّل الحوادث كثيراً.

35. طريقة الحفظ

محاولة حفظ الأوامر فرادى شاقّة، لذا يصير الاستخدام أيسر بالحفظ حسب الغرض.

الغرض الأمر الذي يُتذكَّر
تريد العدّ Measure-Object
تريد المجموع Measure-Object -Sum
تريد النظر حسب النوع Group-Object
تريد حذف التكرار Sort-Object -Unique
تريد القيم اللازمة فقط Select-Object -ExpandProperty
تريد ترتيب الأعمدة Select-Object
تريد النظر من الأكبر Sort-Object -Descending
تريد البحث عن سلسلة Select-String
تريد النظر إلى المحيط Select-String -Context
تريد مقارنة اثنين Compare-Object
تريد إبقاء أثر Export-Csv / Start-Transcript
تريد الإخراج إلى الشاشة والملفّ Tee-Object
تريد الإرسال إلى الحافظة Set-Clipboard
تريد قياس الزمن Measure-Command
تريد النظر التفصيليّ في الخطأ Get-Error

ورقة غشّ في صفحة واحدة

نجعلها جدولاً سريعاً يتضمّن الكتابة نفسها، للطباعة والإبقاء في اليد. بهذا وحده يمكن تركيب معظم العمل اليوميّ.

الغرض شكل جاهز للاستخدام
عدّ الملفّات Get-ChildItem . -File \| Measure-Object
النظر إلى الحجم الإجماليّ بوحدة GB [math]::Round((Get-ChildItem . -File -Recurse \| Measure-Object -Property Length -Sum).Sum / 1GB, 2)
العدد حسب الامتداد Get-ChildItem . -File \| Group-Object -Property Extension -NoElement \| Sort-Object -Property Count -Descending
أكبر 20 ملفّاً Get-ChildItem . -File -Recurse \| Sort-Object Length -Descending \| Select-Object -First 20 FullName, Length
ما حُدِّث خلال آخر 24 ساعة Get-ChildItem . -File -Recurse \| Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) }
استخراج القيمة وحدها Get-Service \| Select-Object -ExpandProperty Name
حذف التكرار Get-Content .\list.txt \| Sort-Object -Unique
البحث عن ERROR في السجلّ Select-String -Path .\logs\*.log -Pattern "ERROR"
النظر إلى سطرين قبل ERROR وبعده Select-String -Path .\logs\*.log -Pattern "ERROR" -Context 2
مقارنة قائمتين Compare-Object -ReferenceObject (Get-Content .\before.txt) -DifferenceObject (Get-Content .\after.txt)
تأكيد قيمة التجزئة Get-FileHash .\installer.exe -Algorithm SHA256
إرسال النتيجة إلى الحافظة Get-Service \| Select-Object Name, Status \| ConvertTo-Csv -NoTypeInformation \| Set-Clipboard
الإخراج إلى الشاشة والملفّ Get-Process \| Tee-Object -FilePath .\out.txt
بدء أخذ سجلّ العمل Start-Transcript -Path .\work.log
تضييق CSV بشرط Import-Csv .\data.csv \| Where-Object { $_.Status -eq "NG" }
الإبقاء في CSV ... \| Export-Csv .\out.csv -NoTypeInformation -Encoding UTF8
العمليّات الأكبر ذاكرة Get-Process \| Sort-Object WorkingSet -Descending \| Select-Object -First 10 Name, Id, WorkingSet
خدمات تلقائيّة الإقلاع متوقّفة Get-Service \| Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" }
أخطاء سجلّ الأحداث Get-WinEvent -LogName System -MaxEvents 200 \| Where-Object { $_.LevelDisplayName -eq "Error" }
تأكيد الوصول Test-NetConnection -ComputerName example.local -Port 443
قياس زمن التنفيذ Measure-Command { ... }
النظر التفصيليّ في أحدث خطأ Get-Error

ترتيب لا يُنسى

اعرض ← عُدّ ← رتّب ← اترك أثراً ← جرّب ← نفّذ

Format-Table وFormat-List يُستخدمان في آخر هذا التدفّق فقط، عند النظر على الشاشة. إن وُضعا قبل Export-Csv أو الأمر التالي انكسر ما بعده.

36. الخلاصة

PowerShell يصير قويّاً عندما تصير قادراً على كتابة سكربتات. غير أنّ أكثر ما يُستخدم في العمل، على غير المتوقَّع، تركيبات أوامر صغيرة.

العدّ
الترتيب
التجميع
المقارنة
البحث
الاستخراج
الحفظ
الإرسال إلى الحافظة
إبقاء سجلّ العمل

بمجرّد القدرة على هذه يصير العمل اليوميّ أيسر كثيراً. لا يلزم السعي من البداية إلى أتمتة صعبة. اجعل نفسك أوّلاً قادراً على رؤية الوضع بدقّة عبر الأوامر القرائيّة، ثمّ استخدم عند الحاجة فقط أوامر تغيير مثل Copy-Item وMove-Item وRemove-Item وRestart-Service.

سرّ استخدام PowerShell بأمان هو الترتيب التالي.

اعرض ← عُدّ ← رتّب ← اترك أثراً ← جرّب ← نفّذ

باكتساب هذا القالب لا يبقى PowerShell «شيئاً تضرب به أوامر على شاشة سوداء»، بل يصير أداة عمليّة تسند التحقيق اليوميّ والترتيب والتقرير.

أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.

ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.

الأسئلة الشائعة

أسئلة شائعة حول موضوع هذه المقالة.

كيف يمكن معرفة عدد الملفّات أو حجمها الإجماليّ في PowerShell؟
مرِّر نتيجة Get-ChildItem عبر أنبوب (pipe) إلى Measure-Object. يمكن التحقّق من عدد العناصر عبر خاصيّة Count في النتيجة، وإن أردتَ تضمين المجلّدات الفرعيّة أضِف -Recurse. أمّا الحجم الإجماليّ فيُجمَع عبر Measure-Object -Property Length -Sum، ولأنّ الرقم يبقى بالبايت وهو صعب القراءة، فإنّ تحويله إلى وحدة GB عبر [math]::Round($size.Sum / 1GB, 2) يجعله أوضح. وبإضافة -Average أو -Maximum يمكن الحصول على المتوسّط والحدّ الأقصى في آنٍ واحد.
ما الفرق بين -ExpandProperty في Select-Object والتحديد المعتاد؟
يُرجِع الأمر Select-Object Name «جدولاً (كائناً) يحتوي عموداً باسم Name»، بينما يُرجِع Select-Object -ExpandProperty Name «قيمة Name نفسها». عند الرغبة في الإخراج إلى CSV، يناسب التحديد المعتاد الذي يُبقي القيمة كعمود، أمّا عند تمرير القيم فقط إلى أمر آخر أو معالجة نصّية أو ملفّ نصّي، فإنّ -ExpandProperty أسهل في التعامل. يُختار الأسلوب حسب الغرض.
لماذا لا يجوز استخدام Format-Table قبل Export-Csv؟
لأنّ Format-Table وFormat-List أوامر مخصّصة للعرض على الشاشة، وتُحوِّل المخرَجات إلى كائنات عرض (display objects)، ما يمنع تنفيذ عمليّة الإخراج إلى CSV أو المعالجة اللاحقة بشكل صحيح. عند الإخراج إلى CSV أو المعالجة بأمر لاحق، اختر الأعمدة عبر Select-Object ثمّ مرِّرها إلى Export-Csv. تذكَّر القاعدة: «إن كان العرض على الشاشة فقط فاستخدم أوامر Format، وإن كان الاستخدام لاحقاً فاستخدم Select-Object»، ولن تتردّد بعدها.
هل توجد خطوات لاستخدام الأوامر التغييريّة مثل Remove-Item بأمان؟
لا تُنفِّذ الأمر مباشرةً، بل انظر أوّلاً إلى الهدف عبر أوامر Get، ثمّ ضيِّق النطاق بـ Where-Object، وتحقَّق من قائمة الأهداف عبر Select-Object، وعُدَّ العناصر بـ Measure-Object، واحفظ دليلاً (إن لزم) عبر Export-Csv. بعد ذلك، إن كان الأمر يدعم -WhatIf، فنفِّذه تجريبيّاً أوّلاً للتحقّق من خطّة الحذف أو النقل، وإن لم تكن هناك مشكلة فنفِّذه فعليّاً. مجرّد الالتزام بهذا الترتيب يقلِّل الحوادث كثيراً.

الملف الشخصي للمؤلف

صفحة الملف الشخصي لمؤلف المقالة.

غو كومورا

مؤسّس شركة كومورا سوفت ذ.م.م.

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

العودة إلى المدونة