مجموعة أوامر 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. الفكر المتَّبع هنا
الافتراضات الثلاثة كالتالي.
- تُكتَب أسماء الأوامر بصيغتها الرسميّة
- التركيز على الأوامر القرائيّة
- أوامر التغيير تُدرَس دائماً مع تأكيد الهدف أو مع
-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 ── العمليّات الأولى الواجب تعلّمها والاستخدام الآمن
نرتّب لمبتدئ PowerShell ما يمنعه من التيه في العمل: البحث عن الأوامر، وخطّ الأنابيب، وعمليّات الملفّات، ومعالجة CSV، وسياسة التنفيذ، وإجر...
طريقة تشغيل 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-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، فنفِّذه تجريبيّاً أوّلاً للتحقّق من خطّة الحذف أو النقل، وإن لم تكن هناك مشكلة فنفِّذه فعليّاً. مجرّد الالتزام بهذا الترتيب يقلِّل الحوادث كثيراً.
الملف الشخصي للمؤلف
صفحة الملف الشخصي لمؤلف المقالة.
غو كومورا
مؤسّس شركة كومورا سوفت ذ.م.م.
يركّز على تطوير برامج ويندوز، والاستشارات التقنية، والتحقيق في الأخطاء، ويتميّز في المشاريع التي تبقى فيها الأصول القديمة ناشطة، وفي تشخيص الأعطال التي يصعب تحديد سببها.