أساسيّات أوامر 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 ليس «حفظ الأوامر الطويلة عن ظهر قلب». المهمّ هو الأمور الثلاثة التالية:

  1. القدرة على البحث عن الأوامر عبر Get-Command وGet-Help
  2. القدرة على تمرير النتائج إلى الأمر التالي عبر خطّ الأنابيب |
  3. التحقّق من الأثر عبر -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 وتحقيقها وأتمتتها.

روابط مرجعية

مقالات ذات صلة

الخدمات المرتبطة بهذا الموضوع

تطوير تطبيقات Windows

ندعم تطوير برمجيّات Windows مثل تطبيقات الأعمال، والتكامل مع الأجهزة، وأدوات الاتّصال.

انظر إلى الخدمة / تواصل معنا

الاستفادة من الأصول القائمة ودعم الانتقال

ندعم جرد الأصول القائمة التي تشمل الدفعات القديمة وVBScript وVBA وPowerShell وCOM / ActiveX، وتعديلها، وانتقالها.

تواصل معنا

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

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

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

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

من أين ينبغي أن أبدأ تعلّم 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 يُنفِّذ التحقيق والتغيير على الشاشة نفسها، فإنّ عادة البدء بالتحقّق للقراءة فقط أمر مهمّ.

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

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

غو كومورا

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

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

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