כתיבת סקריפט שימושי
המטרה של כתיבת הסקריפטים היא לבוא ולהקל עלינו בתהליכים שאנו מבצעים יום יום או לעיתים תכופות. ניתן מספר דוגמאות לסקריפטים אשר היו מקלים עלינו את החיים:
- העברה אוטומטית של קבצי תמונות בתיקייה מסוימת המכילה קבצים מגוונים רבים לתיקיית התמונות מבלי לעבור על כל הקבצים באופן ידני.
- סגירת מספר תהליכים אשר מעמיסים על המערכת בצורה אוטומטית.
- ריקון תיקיית ההורדות מקבצים.
- פתיחת מספר תוכנות במקביל.
- כל אוטומציה אחרת שעולה לכם לראש.
הסקריפטים שציינו למעלה והם מן הבסיסיים ביותר. אנשי System המשתמשים ב-PowerShell יודעים להעריך את הקלות שבה ניתן ליישם אוטומאציות בצורה פשוטה על שרתים רבים ולעשות את העבודה הרבה יותר יעילה ונוחה.
הסקריפט שנכתוב יהיה הראשון שציינו ברשימה: הסקריפט ייגש לתיקיה מסוימת הנמצאת במחשב, יחפש את כל קבצי התמונות ויעביר אותן לתיקיית התמונות במחשב שלנו.
נניח ואנו רוצים להעביר את כל הקבצים בתיקיית ההורדות אשר מסתיימים בסיומת .jpg (סיומת של קבצי תמונות) לתיקיית התמונות. כיצד נעשה זאת? הגיע הזמן לכתוב את הסקריפט:
נפתח את תוכנת ה-Power Shell Integrated Scripting Environment או במילים אחרות ה-Powershell ISE. נכנס לתפריט ההפעלה (לחיצה על תפריט ה-Win Key + R) ונקליד powershell_ise . נאשר את החלון.
החלון שיפתח לנו יראה כמו החלון הבא:
שימו לב שהחלון שנפתח לנו מפוצל ל-3 חלקים:
- Code Area – בחלק זה נכתוב את העיקר של הסקריפט – הקוד. שורות הקוד שיכתבו באזור זה ירוצו כאשר נקרא לסקריפט לפעול.
- Console Output – בחלק זה יופיע לנו כל הפלט של הסקריפט שלנו.
- Debug Area – אזור זה מאפשר לנו להריץ כל פקודה שנרצה, בין אם הסקריפט שלנו כרגע נתקע על שורה מסוימת בזמן הריצה או לא רץ כלל. במקום לפתוח חלון נוסף של ממשק ה-CLI של PowerShell נוכל להשתמש באזור זה בכדי להתנסות בפקודות שונות.
כל הסקריפט שנכתוב יוכל להיכתב באמצעות פקודה אחד בלבד. אך, לשם המדריך נכתוב את הסקריפט בגרסתו הארוכה יותר.
נתחיל לכתוב באזור הקוד (Code Area). נכריז על שני משתנים:
- $sourceFolder – תיקיית המקור, התיקייה שממנה נעביר את כל התמונות. במקרה שלנו, תיקיית התמונות של המשתמש שלנו ב-Windows.
- $destFolder – תיקיית היעד, התיקייה שאליה נעביר את כל התמונות. במקרה שלנו, תיקיית התמונות של המשתמש שלנו ב-Windows.
בינתיים, הסקריפט שלנו ניראה כך:
#User defined variables
$sourceFolder = "C:/Users/Shynet/Downloads/" #The source folder to move the images from
$destFolder = "C:/Users/Shynet/Pictures" #The destination where all images appear
שימו לב שהשתמשנו בהערות בכדי להקל עלינו לזכור מה הוא כל משתנה. למרות זאת, המשתנים אומרים בשמם הרבה על מהותו של כל משתנה.
הערה: שמנו את שם המשתמש Shynet במיקומים, יש להחליפו לשם של המשתמש הרצוי (או להשתמש פשוט במשתנה $env:username בכדי לשלוף באופן אוטומטי את המשתמש הנוכחי). בנוסף, הסלאשים (/) המופיעים בשורות הקוד הפוכים מצורתם הטבעית (למרות שהסקריפט יעבוד גם כך).
כעת, נכריז על משתנה בשם $files. משתנה זה מכיל את כל הקבצים בסיומת .jpg אשר בתיקיית המקור. בכדי להשיג את כל הקבצים הקיימים בתיקייה נשתמש בפקודת ה-Get-Item. פקודה זו מאפשרת לנו להשיג את כל הקבצים בתיקיית המקור המסתיימים בסיומת .jpg .
נוסיף את השורות הבאות לסקריפט שלנו:
#Find all images in the download directory.
$files = Get-Item "$sourceFolder/*" -Filter "*.jpg"
הפקודה שלנו להשגת הקבצים בלבד נראית כך:
Get-Item "$sourceFolder/*" -Filter "*.jpg"
שימו לב שהמיקום שהבאנו כפרמטר נראה כך:
$sourceFolder/*
או במילים אחרות כך (בלי המשתנה $sourceFolder):
C:/Users/Shynet/Downloads/*
הכוכבית מסמלת wildcard או במילים אחרות, אנו אומרים ל-PowerShell שאנו רוצים שהוא יסתכל בתוך התיקייה על כל הקבצים.
בהמשך הפקודה מופיע לנו הפרמטר Filter והוא בעצם מכיל את הערך "*.jpg". במילים אחרות, אמרנו ל-PowerShell לבצע פילטר על כל הקבצים ולשלוף רק את אלה המסתיימים בסיומת .jpg .
כעת כל מה שנותר לנו לעשות זה לעבור על קובץ, קובץ ולהעביר אותו לתיקיית היעד. כיצד נעשה זאת? באמצעות לולאת For-Each . לולאה זו מאפשרת לנו לעבור על כל העצמים במערך ולהתייחס אל כל עצם באמצעות משתנה מסוים. נוסיף את השורות הבאות לסקריפט שלנו:
#Go through all images and move them to the pictures folder
foreach ($file in $files) {
Move-Item $file $destFolder
"Moved item $file to $destFolder."
}
שימו לב כי הפרמטר $file בעצם יקבל את ערכו של כל קובץ במערך.
בכדי להזיז קובץ לתיקיית היעד אנו משתמשים בפקודה Move-Item עם פרמטר הקובץ ותיקיית היעד.
לבסוף אנו מוציאים פלט למשתמש כי הקובץ עבר.
כיצד נריץ את הסקריפט ונבדוק אותו? נלחץ על כפתור ה-Run Script הנראה כך:
כעת, אם כתבנו את הסקריפט כמו שצריך והרצנו אותו ניראה את הדבר הבא:
שימו לב שבאזור ה-Output Area אנו רואים את כל הפלט שהסקריפט הוציא. במקרה שלי הסקריפט העביר 4 תמונות מתיקיית ההורדות לתיקיית התמונות.
הכול טוב ויפה, אך נניח ואחת מן התמונות נמצאת בשימוש ולא ניתן להזיז אותה. מה שיקרה זה שהסקריפט שלנו ייכשל ויפסיק את עצמו באמצע. כיצד נפתור זאת? באמצעות תפיסת השגיאה כאשר היא מתרחשת. בדיוק כמו שלמדנו לפני.
הסקריפט המתוקן והסופי שלנו ניראה כך:
#User defined variables
$sourceFolder = "C:/Users/Shynet/Downloads/" #The source folder to move the images from
$destFolder = "C:/Users/Shynet/Pictures" #The destination where all images appear
"This script moves all images ending with .jpg format from the source folder to the destination folder."
"Source folder set to: $sourceFolder"
"Destination folder set to: $destFolder"
#Find all images in the download directory.
$files = Get-Item "$sourceFolder/*" -Filter "*.jpg"
#Go through all images and move them to the pictures folder
foreach ($file in $files) {
try {
Move-Item $file $destFolder
"Moved item $file to $destFolder."
}
catch {
Write-Host "Failed to move item $file !" -ForegroundColor Red
}
}
אז איך יכולנו לכתוב את כל זה בשורת קוד אחת? בצורה הבאה:
Move-Item -Path "C:/Users/Shynet/Downloads/*.jpg" -Destination "C:/Users/Shynet/Pictures"