מדריך לסקריפטים בפאוורשל - איך מתחילים לכתוב אוטומציה אמיתית¶
יש הבדל עצום בין להריץ פקודת PowerShell בודדת לבין לכתוב סקריפט. פקודה בודדת פותרת בעיה של רגע. סקריפט פותר בעיה שחוזרת על עצמה, ובזה בדיוק נמצא הכוח האמיתי של PowerShell כשפה. אז בואו נעבור על איך זה עובד בפועל, בלי להיתקע בתיאוריה.
מה זה בעצם סקריפט בפאוורשל¶
סקריפט הוא פשוט קובץ טקסט עם סיומת .ps1, שמכיל רצף של פקודות שאתם הייתם מקלידים בטרמינל בכל מקרה, רק שעכשיו הן שמורות במקום אחד ורצות לפי הסדר בלחיצה אחת. במקום להקליד עשר פקודות בכל בוקר כדי לבדוק סטטוס שירותים במחשב, אתם כותבים אותן פעם אחת בקובץ, ומריצים את הקובץ.
זה נשמע פשוט, וזה באמת פשוט להתחיל, אבל ברגע שמוסיפים משתנים, תנאים ולולאות, סקריפט פשוט הופך לכלי אוטומציה אמיתי.
הבסיס - משתנים ופלט¶
כל סקריפט מתחיל ממשתנים. ב-PowerShell כל משתנה מתחיל בסימן דולר:
Write-Host פשוט מדפיס טקסט למסך. זה נראה זעיר, אבל תשומת הלב חשובה כאן - שימו לב שהמשתנה $name פשוט מוזרק בתוך המחרוזת עם המרכאות הכפולות. זה אחד הדברים שהופכים כתיבת סקריפטים ב-PowerShell לנוחה יחסית לשפות אחרות.
תנאים ולולאות - הלב של כל אוטומציה¶
בלי תנאים ולולאות, סקריפט הוא רק רשימת פקודות שרצה פעם אחת ברצף. עם תנאים ולולאות, הסקריפט מתחיל לקבל החלטות בעצמו.
$freeSpace = (Get-PSDrive C).Free / 1GB
if ($freeSpace -lt 10) {
Write-Host "אזהרה - נשארו פחות מ-10GB פנויים בכונן C"
} else {
Write-Host "מקום פנוי תקין"
}
הקטע הזה בודק כמה מקום פנוי נשאר בכונן C, ומדפיס אזהרה אם המצב נמוך. זו כבר אוטומציה אמיתית - הסקריפט "מחליט" מה להדפיס על סמך מצב המערכת בפועל.
ה-pipeline - למה PowerShell באמת שונה¶
הרעיון המרכזי ב-PowerShell הוא ה-pipeline, סימן ה-|, שמעביר את הפלט של פקודה אחת כקלט לפקודה הבאה. אבל בניגוד ל-cmd, מה שעובר בין הפקודות הוא לא טקסט, אלא אובייקטים שלמים עם כל המידע שלהם.
השורה הזאת שולפת את כל התהליכים הרצים, מסננת רק את אלה שצורכים יותר מ-50 יחידות מעבד, וממיינת אותם מהגבוה לנמוך. שלוש פעולות, שורה אחת, בלי טקסט מפורק וחיתוכי מחרוזות מסובכים. זה בדיוק ההבדל שהופך את PowerShell לכלי רציני.
לולאה על אוסף של פריטים¶
הרבה מהאוטומציה האמיתית בעבודה היא לרוץ על רשימה של דברים ולעשות להם משהו - קבצים, שרתים, משתמשים. הנה דוגמה פשוטה שעוברת על כל הקבצים בתיקייה ומדפיסה את הגודל שלהם:
$files = Get-ChildItem "C:\Logs"
foreach ($file in $files) {
Write-Host "$($file.Name) - $($file.Length) bytes"
}
זה תבנית שתחזור על עצמה המון בעבודה אמיתית - לשלוף רשימה של פריטים, ולעבור עליהם אחד אחד כדי לבצע פעולה.
פונקציות - כשהסקריפט מתחיל לגדול¶
כשסקריפט מתחיל להתארך, כדאי לארוז חלקים ממנו לתוך פונקציות, כדי שאפשר יהיה לקרוא להם שוב ושוב בלי לשכפל קוד:
function Get-DiskWarning {
param($threshold = 10)
$freeSpace = (Get-PSDrive C).Free / 1GB
if ($freeSpace -lt $threshold) {
Write-Host "אזהרה - מקום פנוי נמוך"
}
}
Get-DiskWarning -threshold 20
זה כבר קוד שאפשר לתחזק, להרחיב, ולהשתמש בו בסקריפטים אחרים.
מה הצעד הבא¶
הדרך הכי טובה ללמוד סקריפטים היא לא לקרוא עוד דוגמאות, אלא לכתוב סקריפט קטן שפותר בעיה אמיתית שיש לכם - למשל, סקריפט שבודק כל בוקר איזה שירותים לא רצים, או שמנקה קבצים זמניים ישנים. משם, כל דבר חדש שתלמדו ישתלב בהקשר של משהו שאתם באמת בונים.
בקורס ווינדוס בסיסי יש פרק שלם על כתיבת סקריפטים בפאוורשל, כולל מעבר לרמה מתקדמת יותר עם עבודה מול אובייקטי COM וממשק WMI, שנותנים לכם שליטה עמוקה עוד יותר על המערכת. הכל בעברית, בחינם, עם תרגילים ופרויקט מסכם.
ואם נתקעתם באמצע כתיבת סקריפט וממש לא מבינים למה הוא לא רץ - קורה לכולם - הצטרפו לקהילה בדיסקורד ותשאלו שם.