PowerShell: الطرفية في ويندوز
درس 11 من 11
11PowerShell: الطرفية في ويندوز
الصورة الكبيرةأغلب أجهزة الشركات ويندوز، وكثير من المطوّرين يبدؤون فيه. PowerShell يعطيك قوة الطرفية هناك، ويضيف شيئًا ليس في bash: البيانات تمرّ ككائنات.
ماذا تشاهد في الرسم: كل مرحلة في الأنبوب تستلم كائنات كاملة (اسم، حجم، تاريخ) لا سطور نص، فتصفّي وترتّب بالخاصية مباشرة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
في bash الأوامر تتبادل أوراقًا مكتوبة، فتقصّ منها الكلمة التي تريدها. في PowerShell تتبادل بطاقات منظّمة فيها حقول: الاسم، الحجم، التاريخ. تقول «أعطني البطاقات التي حجمها أكبر من 1 ميجا» دون قصّ أي نص.
PowerShell 7 (pwsh) مبني على .NET ومتعدد المنصات. الأوامر cmdlets بصيغة Verb-Noun معتمدة (Get-Verb)، والأنبوب ينقل كائنات .NET تُفحص بـ Get-Member. التصفية بـ Where-Object { $_.Length -gt 1MB }، والإسقاط بـ Select-Object، والتجميع بـ Group-Object. المقارنة بعوامل -eq -ne -gt -lt -like -match. سياسة التنفيذ (Execution Policy) تتحكّم بتشغيل سكربتات .ps1، والوحدات تثبَّت من PowerShell Gallery بـ Install-Module.
قبل أن تبدأ
🐚الشل والأنابيب
تعرف فكرة الأنبوب | من لينكس.
🪟PowerShell 7
ثبّته من متجر مايكروسوفت أو بـ winget install Microsoft.PowerShell.
الفكرة الجوهرية
1Verb-Noun: أسماء تشرح نفسها
كل أمر فعل-اسم: Get-ChildItem (اعرض المحتويات)، Set-Location (انتقل)، New-Item، Remove-Item. لا تحتاج حفظها: Get-Command *Item* يعرض كل ما فيه Item، وGet-Help Get-ChildItem -Examples يعطيك أمثلة.
Get-Location # where am I (pwd) Set-Location C:\Projects # cd Get-ChildItem # ls / dir New-Item notes.txt -ItemType File # touch Get-Help Get-ChildItem -Examples
2الأنبوب ينقل كائنات
Get-ChildItem لا يطبع نصًّا، بل يعطي كائنات ملفات لها Name وLength وLastWriteTime. Get-Member يعرض كل الخصائص. لذلك تصفّي وترتّب بالاسم مباشرة.
# the five biggest files over 1 MB in this folder and below
Get-ChildItem -Recurse -File |
Where-Object { $_.Length -gt 1MB } |
Sort-Object Length -Descending |
Select-Object -First 5 Name, @{n='MB'; e={[math]::Round($_.Length / 1MB, 1)}}3المقابل لأوامر لينكس
PowerShell يعرّف أسماء مستعارة مألوفة (ls وcd وcat) تشير لأوامره، لكن الخيارات تختلف. هذا الجدول يوصلك بسرعة:
Linux PowerShell ls -la Get-ChildItem -Force cat file.txt Get-Content file.txt grep "ERROR" app.log Select-String "ERROR" app.log find . -name "*.log" Get-ChildItem -Recurse -Filter *.log ps aux Get-Process kill 1234 Stop-Process -Id 1234 curl -I https://a.com Invoke-WebRequest https://a.com -Method Head export NAME=value $env:NAME = "value"
ls -la أو rm -rf. الاسم المستعار موجود لكن الخيارات لا، فيعطي خطأ أو سلوكًا مختلفًا. استخدم أسماء PowerShell الكاملة في السكربتات.4سكربت ps1 وسياسة التنفيذ
احفظ الأوامر في ملف .ps1 وشغّله بـ ./clean.ps1. ويندوز يمنع السكربتات افتراضيًا على بعض الأجهزة، وSet-ExecutionPolicy -Scope CurrentUser RemoteSigned يسمح بسكربتاتك المحلية فقط.
param([string]$Path = ".", [int]$Days = 30)
$old = Get-ChildItem $Path -Recurse -File -Filter *.log |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$Days) }
$old | Remove-Item -WhatIf # shows what would be deleted; drop -WhatIf to do it
"{0} old log files" -f $old.Countمثال محلول
المسألة: تطبيق ويندوز يكتب سجلات، وتريد عدد أسطر الخطأ في كل ملف من آخر أسبوع. الحل: أنبوب كائنات يجمع بالملف:
Get-ChildItem C:\App\logs -Filter *.log | Where-Object LastWriteTime -gt (Get-Date).AddDays(-7) | Select-String -Pattern "ERROR" | Group-Object Filename | Sort-Object Count -Descending | Select-Object Name, Count
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| PowerShell هو موجّه الأوامر القديم cmd. | cmd قديم ومحدود. PowerShell لغة كاملة بكائنات ووحدات، ويعمل على لينكس وماك أيضًا. |
| لو تعلّمت لينكس لا تحتاج PowerShell. | خوادم ويندوز وAzure وأجهزة الشركات تُدار به كثيرًا. معرفة الاثنين تجعلك مرنًا. |
اختبر فهمك
ما المقابل لـ grep "ERROR" app.log في PowerShell؟
Select-String يبحث عن نمط داخل النص، مثل grep.
ما الذي يميّز أنبوب PowerShell عن bash؟
لهذا تكتب Where-Object Length -gt 1MB بدل قصّ أعمدة نص.
كيف ترى ما سيحذفه Remove-Item قبل أن يحذف؟
-WhatIf يطبع ما كان سيحدث دون تنفيذ.
بطاقات مراجعة سريعة
تحقق من فهمك
كيف تكتشف أمرًا لا تعرف اسمه؟
Get-Command *كلمة* للبحث بالاسم، ثم Get-Help الأمر -Examples.
لماذا ls -la قد يفشل في PowerShell؟
ls اسم مستعار لـ Get-ChildItem الذي لا يعرف الخيار -la. المقابل Get-ChildItem -Force.
ماذا تفعل Set-ExecutionPolicy -Scope CurrentUser RemoteSigned؟
تسمح لسكربتاتك المحلية بالعمل، وتطلب توقيعًا للسكربتات المنزّلة من الإنترنت، لمستخدمك فقط.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.