אחת מהמתודולוגיות החשובות ביותר לקידוד היא לוודא שאתה יודע ומנהל כל דרך שבה הקוד שלך יכול "לזרום". אם תחשוב על הקוד שלך כעל זרימה, הוא יכול להסתעף, לחזור לנקודות שונות ולהיתקל בהרבה תנאים.
טיפול בשגיאות מבטיח שאתה מגדיר "רשתות" או מקום ברירת מחדל שבו הקוד שלך יכול לזרום כאשר מתרחשת משהו בלתי צפוי.
בוא נשתמש בתרחיש מעשי שבו אתה עשוי למצוא את עצמך, עוסק בטיפול בשגיאות ב-PowerShell.
בניית הסקריפט הראשוני לניקוי קבצים
אנחנו צריכים לנקות כמה קבצים ישנים. השרת קבצים שלנו קיים כבר הרבה זמן, ואנחנו צריכים לפנות מקום. ההנהלה החליטה להסיר את כל הקבצים שגילם יותר ממספר מסוים של ימים. אנחנו צריכים לבנות סקריפט שמחפש באופן רקורסיבי בתיקייה, מוצא את כל הקבצים שגילם יותר ממספר מסוים של ימים ומסיר אותם.
המשימה נשמעת קלה מספיק, אבל זהו החלק של טיפול בשגיאות, ולכן אתה יודע שכמה דברים יילכו לא בסדר!
בוא נתחיל להבין את טיפול השגיאות על ידי בניית הסקריפט הדמוי של התרחיש בלי טיפול בשגיאות כדי להדגים את הבעיה שטיפול בשגיאות פותר.
-
ראשית, פתח כרטיסייה חדשה ב-VS Code.
מאחר ואנחנו רק מנסים כמה דברים עכשיו, לא נשמור את הסקריפט עדיין. זמנית תאמר ל-VS Code שאתה עומד לכתוב קצת PowerShell.
לחץ Ctrl-Shift-P, הקלד 'lang', בחר בחר מצב שפה, הקלד 'power' ובחר PowerShell. עכשיו VS Code יודע שאתה הולך לכתוב PowerShell.
-
בהמשך, חלק את הבעיה למשימות, פותר את הברורה ביותר קודם.
במקרה הזה, המשימה היא ליצור פקודה לקרוא קבצים בתיקייה.
Get-ChildItem -Path C:\OldForgottenFolder
-
Get-ChildItem
גם מחזיר תיקיות שאין לנו צורך בהן, אז נצמצם את זה רק לקבצים.Get-ChildItem -Path C:\OldForgottenFolder -File
-
אם יש קבצים בתתי התיקיות הללו, אנחנו צריכים להביא גם אותם עם
Recurse
.Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse
-
עכשיו שיש לנו את הפקודה ואת הפרמטרים, זה מחזיר את כל הקבצים. אנחנו רק צריכים למצוא את אלו שיותר ישנים ממספר ימים מסוים.
מאחר ש
Get-ChildItem
מחזיר כל קובץ עם מאפיין אובייקטLastWriteTime
, אנחנו חייבים לסנן לפי מאפיין זה. נשתמש במסנןWhere
כדי למצוא את הקבצים עםLastWriteTime
פחות מתאריך שצוין.(Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
-
התאריך צריך להיות דינמי כי "ישן" היום יהיה שונה מ"ישן" מחר.
נא להעיר את השורה הקודמת כי נצטרך אותה בשלב כלשהו ואז נבין את מצב התאריך.
## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????} $Now = Get-Date $Now
-
עכשיו שיש לנו את תאריך היום, בואו נמצא מספר ספציפי של ימים לפני היום כדי למצוא את התאריך. אני פשוט אשים
30
כאן זמנית כי אני יודע שיש כמה קבצים שיותר מחמישה ימים ישנים כדי לבצע בדיקה בסיסית.## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????} $Now = Get-Date $LastWrite = $Now.AddDays(-30) $LastWrite
-
בוצע! בואו נרכיב את זה עד כה.
$Now = Get-Date $LastWrite = $Now.AddDays(-30) (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
עכשיו יש לנו סקריפט קטן שמוצא את כל הקבצים בתיקיה שיותר ישנים ממספר ספציפי של ימים.
-
בהמשך, עלינו להוסיף את היכולת להסיר את אותם קבצים ישנים. זה פשוט באמצעות הפקודה
Remove-Item
וצינור הנתונים.$Now = Get-Date $LastWrite = $Now.AddDays(-30) (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite} | Remove-Item
-
נעשה! אבל חכה, אין לי מושג אילו קבצים זה הסיר. היו גם כמה שגיאות שנדבר עליהן בעוד כמה דקות. בוא נוסיף קצת פונקציונליות בסיסית.
$VerbosePreference = 'Continue' $Now = Get-Date $LastWrite = $Now.AddDays(-30) $oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite} foreach ($file in $oldFiles) { Remove-Item -Path $file.FullName Write-Verbose -Message "הוסר בהצלחה [$($file.FullName)]." }
-
תצטרך לכלול לולאה כזו כדי להריץ סוג כלשהו של קוד עבור כל קובץ. כאן אנחנו לא משתמשים בצינור ובמקום זאת שמים את כל הקבצים שנמצאו במשתנה
oldFiles
, מערך של אובייקטי קבצים. אנחנו מריצים לאחר מכןRemove-Item
על כל אחד כפי שעשינו לפני כן, אבל הפעם כולל הודעת מפורטת שמספרת לנו איזה קובץ מוסר. -
בואו עכשיו נריץ את הקוד הזה ונראה מה קורה.
עכשיו אתה יכול לראות דרך ההודעה המפורטת שהוא הסיר כמה קבצים. הקוד שיש לנו עכשיו הוא הלב שאנחנו צריכים כדי ליצור את הסקריפט. עכשיו בואו ניצור סקריפט אמיתי מזה בחלק הבא.
מקסימום גמישות ושימוש חוזר עם פרמטרים
בניתם את הסקריפט שלכם, אבל עדיין יש לו פוטנציאל להיות גמיש וניתן לשימוש חוזר. איך? פרמטרים יאפשרו לנו לציין את התיקייה ואת גיל הקבצים שאותם אנו רוצים למקד, מה שהופך את הסקריפט לגמיש יותר.
-
לפני שנמשיך הרבה יותר, בואו נשמור את העבודה שלנו. נקרא לזה Remove-FileOlderThan.ps1.
שימו לב לפורמט הפועל/שם עצם עם מקף. אם אפשר, נסו תמיד ליצור שמות סקריפט באותה צורה כמו פקודות PowerShell לצורך עקביות וקריאות.
-
ראשית, סקריפטים מיועדים לשימוש חוזר. הסיכוי הוא, שבטח תרצו להשתמש בסקריפט הזה על תיקיות שונות ובגילאים שונים. נצטרך להציג כמה פרמטרים. כדי לעשות זאת, נבין מה ישתנה. התיקיה ומספר הימים. הבנתי.
param ( [Parameter(Mandatory)] [string]$FolderPath,
[Parameter(Mandatory)] [int]$DaysOld
)
$Now = Get-Date
$LastWrite = $Now.AddDays(-30)
$oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
foreach ($file in $oldFiles) {
Remove-Item -Path $file.FullName
Write-Verbose -Message "Successfully removed [$($file.FullName)]."
}הוסיפו בלוק
param
בחלק העליון והגדירו כל פרמטר כחובה מכיוון שעלינו שיהיה נתיב ומספר כדי שהסקריפט יתפקד. כמו כן, ציינו את הסוג כאן כפרקטיקה טובה. -
החלף את הפריטים הקבועים שהיו לנו בקוד לפני כן עם ערכי הפרמטרים.
param ( [Parameter(Mandatory)] [string]$FolderPath,
[Parameter(Mandatory)] [int]$DaysOld
)
$Now = Get-Date
$LastWrite = $Now.AddDays(-$DaysOld)
$oldFiles = (Get-ChildItem -Path $FolderPath -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
foreach ($file in $oldFiles) {
Remove-Item -Path $file.FullName
Write-Verbose -Message "הוסרו בהצלחה [$($file.FullName)]."
} -
בואו נריץ עכשיו את הסקריפט ונראה מה קורה.
C:\Scripts\Remove-FileOlderThan.ps1 -FolderPath C:\OldForgottenFolder -DaysOld 30 -Verbose
אתם יכולים לראות כיצד עלינו לציין את נתיב התיקייה ואת מספר הימים כפרמטרים. השתמשו בפרמטר
Verbose
כדי לראות את השורהWrite-Verbose
.PowerShell הריץ את הסקריפט בדיוק כפי שעשה לפני כן, אבל עכשיו יש לנו סקריפט עם פרמטרים שנוכל להשתמש בו בכל תיקייה או בכל גיל של קבצים!
בהסתכלות על הפלט, נתקלנו בכמה טקסטים אדומים. או שאין לכם זכויות, או שהקובץ הוא רק לקריאה. אבל על אילו קבצים זה נכשל? ואיך אתם מבטיחים שהקבצים האלה יוסרו גם כן?
סיכום
במדריך זה, בנינו סקריפט כדי לנקות קבצים ישנים מתיקייה, תוך הבטחת גמישות על ידי הוספת פרמטרים. בעוד שהסקריפט עובד כפי שהתכוונו, ראינו שהטיפול בשגיאות עדיין לא טופל, מה שחשוב כאשר מתמודדים עם תרחישים בעולם האמיתי.
כשהמטרה שלנו היא להתקדם, הוספת ניהול שגיאות תאפשר לנו להתמודד עם בעיות, כמו cmdlets שמייצרים שגיאות או קבצים שאינם נגישים, ועוזרת לנו להימנע מסיום הסקריפט ולספק תובנות מפורטות לגבי מה השתבש.
הישארו מעודכנים לדמו הבא! PowerShell 101: שגיאות מסיימות, שגיאות שאינן מסיימות, וניסיון/תפיסה.
Source:
https://adamtheautomator.com/powershell-file-cleanup-script/