לדלג לתוכן

פאוורשל לאוטומציה - מדריך מעשי עם דוגמאות שתוכלו להשתמש בהן היום

יש הבדל בין לדעת syntax של PowerShell לבין לדעת להשתמש בו כדי לחסוך לעצמכם שעות עבודה חוזרת. הפוסט הזה מתמקד דווקא בצד השני - דוגמאות אמיתיות ושימושיות של אוטומציה, שאתם יכולים לקחת, להתאים לצרכים שלכם, ולהתחיל להשתמש בהן כבר היום.

דוגמה 1 - ניקוי קבצים זמניים ישנים

אחת המשימות הכי נפוצות במנהלי מערכות היא לנקות קבצים זמניים או קבצי לוג ישנים שתופסים מקום. במקום לעשות את זה ידנית כל שבוע, כותבים סקריפט שרץ פעם אחת ומטפל בזה:

$folder = "C:\Temp"
$daysOld = 30

Get-ChildItem -Path $folder -File | 
    Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-$daysOld)} | 
    Remove-Item -Force

הקוד הזה שולף את כל הקבצים בתיקייה, מסנן רק את אלה שלא נגעו בהם יותר מ-30 יום, ומוחק אותם. שימו לב שלפני שרצים עם Remove-Item, כדאי להריץ פעם ראשונה בלי המחיקה בפועל, רק כדי לראות אילו קבצים היו נמחקים - זה נהוג לעשות עם -WhatIf:

Remove-Item -Force -WhatIf

דוגמה 2 - גיבוי אוטומטי של תיקייה

סקריפט פשוט שמעתיק תיקייה שלמה למיקום גיבוי, עם תאריך בשם הקובץ כדי לשמור היסטוריה:

$source = "C:\Projects"
$backupRoot = "D:\Backups"
$date = Get-Date -Format "yyyy-MM-dd"
$destination = "$backupRoot\Backup_$date"

Copy-Item -Path $source -Destination $destination -Recurse
Write-Host "גיבוי הושלם ב-$destination"

זה נראה בסיסי, אבל בשילוב עם משימה מתוזמנת (Task Scheduler) שמריצה את הסקריפט הזה כל לילה, קיבלתם מערכת גיבוי אוטומטית שרצה בלי שתגעו בה.

דוגמה 3 - ניטור שירותים קריטיים

סקריפט שבודק אם שירותים חשובים במחשב רצים, ומדליק אזהרה אם משהו נפל:

$criticalServices = @("Spooler", "WinDefend", "Dhcp")

foreach ($service in $criticalServices) {
    $status = Get-Service -Name $service
    if ($status.Status -ne "Running") {
        Write-Host "אזהרה - השירות $service לא רץ!" -ForegroundColor Red
    } else {
        Write-Host "$service תקין" -ForegroundColor Green
    }
}

זה בדיוק סוג הסקריפט שאפשר להריץ כמשימה מתוזמנת כל כמה שעות, כדי לקבל התראה מוקדם על בעיה, לפני שמשתמש בכלל שם לב שמשהו לא עובד.

דוגמה 4 - דוח שימוש בדיסק לכל הכוננים

Get-PSDrive -PSProvider FileSystem | ForEach-Object {
    $percentFree = [math]::Round(($_.Free / ($_.Free + $_.Used)) * 100, 1)
    [PSCustomObject]@{
        כונן = $_.Name
        פנוי_GB = [math]::Round($_.Free / 1GB, 1)
        אחוז_פנוי = "$percentFree%"
    }
} | Format-Table -AutoSize

זה מדגים משהו חשוב - PSCustomObject, שמאפשר לבנות אובייקט מותאם אישית עם השדות שאתם רוצים, ואז להציג אותו כטבלה נקייה. זו טכניקה שתשתמשו בה המון ברגע שתתחילו לבנות דוחות מסקריפטים.

דוגמה 5 - שילוב עם WMI לבדיקת חומרה

$os = Get-CimInstance -ClassName Win32_OperatingSystem
$uptime = (Get-Date) - $os.LastBootUpTime
Write-Host "המחשב פועל כבר $($uptime.Days) ימים ו-$($uptime.Hours) שעות"

הקוד הזה משתמש ב-WMI כדי לשלוף מתי המחשב עלה לאחרונה, ומחשב כמה זמן עבר מאז. שימושי מאוד לזיהוי מחשבים שלא הופעלו מחדש כבר תקופה ארוכה, מה שלרוב אומר שהם לא קיבלו עדכוני אבטחה חדשים.

איך להריץ את הסקריפטים האלה אוטומטית

כתיבת הסקריפט זה רק חצי מהעבודה. כדי שהוא באמת יחסוך לכם זמן, צריך לתזמן אותו לרוץ לבד, דרך Task Scheduler של ווינדוס - קובעים תדירות (יומי, שעתי, בהפעלת המחשב), ומצביעים למשימה על קובץ ה-.ps1 שכתבתם. מהרגע הזה, האוטומציה רצה ברקע בלי שתצטרכו לזכור להפעיל אותה בעצמכם.

חשוב לזכור לפני שמריצים על שרת פרודקשן

כל סקריפט שנוגע במחיקה, שינוי או עצירה של משהו, צריך להיבדק קודם בסביבה בטוחה, לא ישר על מערכת חיה. הרגל טוב הוא להתחיל תמיד עם -WhatIf בפקודות שתומכות בזה, ולהוסיף לוגים לכל סקריפט שרץ אוטומטית, כדי שתוכלו לדעת בדיוק מה הוא עשה אם משהו משתבש.

איפה ממשיכים מכאן

הדוגמאות האלה הן רק ההתחלה. כדי לבנות אוטומציה אמיתית ברמה מקצועית - כולל עבודה עם COM, WMI לעומק, וניהול מערכת שלם - כדאי לעבור את המסלול המסודר בקורס ווינדוס בסיסי, שבונה את הידע הזה שלב אחר שלב, מהיסודות ועד פרויקט אמיתי בסוף. הכל בעברית, בחינם.

ואם אתם כותבים סקריפט ונתקעים באמצע, הצטרפו לקהילה בדיסקורד - שם אפשר לשתף קוד ולקבל עזרה אמיתית, לא רק תשובות מהאינטרנט.