ישנם הרבה סיבות לעצירת ביצוע התסריט. אולי תסריט צריך להמתין לקלט מהמשתמש, להאט את מהירות הביצוע, או להמתין לתהליך אחר להסתיים לפני שנמשיך קדימה. כמו עם רוב המשימות ב־Powershell, יש יותר מדרך אחת לעצור תסריט. בהתאם למה שאתה מנסה להשיג, השיטה שתבחר לעצירה תהיה בעלת נקודות חוזק וחולשות שלה. הוספת עוד אפשרות לאפשרויות הזמינות היא היכולת החדשה של Powershell לפעול במרכז־צורתי. מאחר ו־Powershell נהג להיות משמש כדרך "להדביק" שונות טכנולוגיות יחד, בדיוק כמו ב־Windows, לקו הפקודה של Linux יש אפשרויות שלו לעצירת ביצוע שניתן לאגד לתוך Powershell גם.
שיטות לעצירת ביצוע ב־Powershell
מהם הדרכים השונות לעצירת ביצוע של תסריט? במאמר זה, אנו הולכים לפרק את היכולת לעצור ל־native ול־non-native פקודות. ב־native אנו מתייחסים לאלה הפקודות שהם PowerShell או .NET פונקציות או שיטות מובנות. שיטות לא נוטיות הן תוכניות המיוחדות ל־Windows ול־Linux שניתן להשתמש בהן בשילוב עם Powershell.
שיטות Native
Start-Sleep
[System.Threading.Thread]::Sleep()
Read-Host
[Console]::ReadKey()
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
שיטות לא נוטיות
Windows
pause
timeout
Linux
sleep
read -p
כפי שתוכל לראות, ישנם מספר אפשרויות שונות, כל אחת עם יתרונותיה וחסרונותיה. איזו מהן תשתמש תשפיע על איך הביצוע יושבת ואילו אפקטים נוספים עשויים להיות כלולים בהשהיית זו.
שיטות נטיביות
להתחיל, נתחיל למקד את השיטות הנטיביות מאחר שהן הכי נפוצות בתסריטים.
Start-Sleep
הפקודה לעצירה המשמשת הכי הרבה היא ללא ספק, Start-Sleep
. פקודה זו מקבלת שני קלטים פשוטים, -Seconds
ו־-Milliseconds
. שניים יכולים להיות ערך מספרי System.Double
בזמן שמילישניות מקבלת רק ערכי System.Int32
. על ידי השלבה של שני הערכים, ניתן להשיג שליטה מדויקת על אורך ההשהיה. Start-Sleep
יש גם כינוי של sleep
.
לפני PowerShell 6.2.0, לא היית יכול לכתוב ערך של שניות רצפיות כמו, 2.3
שהוא אותו אורך זמן שאנו משהים עבורו בקוד לעיל. ב־6.2.0, ערכים רצפיים נתמכים כעת, כך שבמקום לכתוב את השניות והמילישניות בנפרד, כעת ניתן לציין: -Seconds 2.3
.
חשוב לציין כי ניתן לצאת מתוך פונקצית
Start-Sleep
על ידי שימוש ב־Ctrl-C
. זה אינו נכון לכל השיטות!
שינת התהליך
A less commonly used method of pausing execution is the [System.Threading.Thread]::Sleep()
.NET method. By passing in a System.Int32
or a TimeSpan
value, this allows pausing of the current thread for a set amount of time. For example, to pause by that same amount of time, 2.3
seconds, as in our Start-Sleep
example, we can write:
כדי להשתמש בתכנית timespan עם שיטת שינת התהליך, ניתן לבצע את הפעולות הבאות:
כדי לעצור את התהליך לזמן בלתי מוגבל, ניתן להשתמש ב־[System.Threading.Timeout]::InfiniteTimeSpan
, אך חשוב לזכור כי זה עשוי לנעול את התהליך שלך.
בניגוד ל־
Start-Sleep
, שיטת שינת התהליך אינה מאפשרת לך להפסיק את התהליך השינה באמצעותCtrl-C
. תלוי ביישום שלך, זה עשוי להיות מועדף.
חשוב גם לדעת על שינת התהליך כי היא אינה מבטיחה זמן מדויק. כל שינת התהליך מבטיחה שהיא תחכה לפחות כמה שניות. מאחר שזמן שינת התהליך תואם לקספריות השעון, יישומים אחרים עשויים להפריע לפונקצית ההשהיה הזו ולהאריך את ההמתנה.
בעוד ששינת התהליך יש בה שימושים שלה, עדיף להשתמש באחת מהשיטות המובנות האחרות בשל הבעיות הללו.
קריאת מארח
השיטות שלמעלה מתארות דרכים לעצירת הביצוע, אך רק לזמן קבוע. הדרך האחרת לעצור את הביצוע היא על ידי הצגת בקשת הזנת משתמש. עם השיטה הזו, יש לבצע פעולה ידנית, אך זה יכול להיות מאוד שימושי לדרוש אישור להמשך ואולי כולל קלט נוסף.
Read-Host
הוא אחת מהדרכים הנפוצות ביותר לבקש קלט מהמשתמש. על ידי בקשת קלט מהמשתמש, הקלט התוצאתי יכול להישמר לשימוש נוסף בקוד או להשהות את הביצוע ככל הצורך.
לאחר שטקסט הוזן, יש ללחוץ על מקש ה-Enter או Return כדי להמשיך בביצוע. על ידי עשיית זאת, ובלעדי שמירה של הקלט במשתנה, הטקסט שהוזן יוצא לפלט באותו הטקסט המוזן למסוף.

אם ברצונך לשמור את הטקסט המוזן למשתנה לשימוש מאוחר יותר, פשוט הקצא את הקלט של Read-Host
למשתנה.
לעיתים יתרה תרצה לקרוא בקלט כמחרוזת מאובטחת. למרבה המזל, Read-Host
הופך זאת לפשוטה ביותר.
Ctrl-C
יאפשר לך לצאת מהעיצוב שלRead-Host
.
שיטת Console ReadKey
באמצעות שיטת [Console]::ReadKey()
, ניתן לקרוא בקלות לפקודות מקשים, יחד עם שינויים, בזמן השהייה של ביצוע התוכנית. כברירת מחדל, פקודות המקשים שנשלחות משתקפות חזרה למסך כאובייקט של System.ConsoleKeyInfo
. זה כולל את הערכים Key
, KeyChar
, והערכים Modifiers
, שיכולים להיות שימושיים מאוד בעת בדיקה של קומבינציות מקשים מסוימות.

לעיתים תרצה לבדוק לפני המשך רציני. זה יכול להתבצע בקלות באמצעות לולאת Do-While
כמו בדוגמה למטה.

שים לב שכיוון שאנו מחפשים לחיצת מקש מסוימת,
Ctrl-C
לא תישבור את הקלט כאן.
המארח של הממשק הגולמי של המשתמש קורא לשיטה
לבסוף, יש לנו את השיטה $host.UI.RawUI.ReadKey()
. זה דומה לשיטת Console ReadKey, אך שיטה זו מאפשרת להעביר אפשרויות נוספות לשיטת ReadKey כדי לשלוט בהתנהגות ובפלט נוסף.

קיימים מספר ReadKeyOptions
שניתן להעביר, שעשויים להפוך את שיטת RawUI ReadKey ליהירה יותר.
AllowCtrlC
IncludeKeyDown
IncludeKeyUp
NoEcho
ניתן להשתמש בכך בדרך הבאה שתכלול אירועי לחיצה ולא תדפיס את הטקסט.
שיטה זו תאפשר את השימוש ב-
Ctrl-C
כדי לצאת מהפקודה, אלא אם נעשה שימוש באפשרותAllowCtrlC
.
שיטות לא נייטיביות
במקטע זה, אנו חוקרים מספר שיטות לא נייטיביות לעצירת ביצוע התסריט. שיטות אלה מיועדות לשימוש בתוכניות תומכות במסוף שאינן ספציפיות ל-PowerShell שיכולות להיות משולבות בתסריטי PowerShell לפי הצורך שלך.
חלונות
הפקודה להשהואה היא פשוטה מאוד, ותציג לחץ על כל מקש כדי להמשיך . . .
ותישאר כך עד שישובו ללחוץ על מקש כלשהו כדי להמשיך בביצוע.

תוכל לשאול כיצד להשתמש בזה בתסריט, אך בדיוק כמו שתעשה עם כל פקודה אחרת, הכנס את הפקודה cmd /c 'pause'
בתוך התסריט שלך כדי להשתמש בפונקציות המקומיות.

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

בדיוק כמו עם הפקודה pause
, הכנס את הפקודה timeout
בתוך התסריט ובדוגמה למטה, אנו לוחצים על מקש ה-Enter כדי להמשיך.

Linux
כמו פקודת ה-pause ב-Windows, פקודת ה-sleep ב-Linux מאפשרת להגדיר ערך ארביטררי לשהות. בניגוד לפקודת ה-pause, יש לפקודת ה-sleep כמה אפשרויות נוספות שמאפשרות גמישות בזמן שהשהות.

הפקודה sleep
גם כוללת באפשרותה סיומות שיכולות לאפשר תקופות ארוכות יותר להגדרה. דוגמאות:
sleep 1m
– לישון למשך דקה אחתsleep 2h
– לישון למשך שעתייםsleep 1d
– לישון למשך יום אחד
לבסוף, הדרך השנייה שבה ניתן לעצור ב-Linux היא באמצעות היישום read
כדי לעצור ללחוץ על מקש ה-Enter כדי להמשיך בביצוע. קיים פרמטר אופציונלי לזמן קצה שימשיך בביצוע אם לא נלחץ מקש ה-Enter על ידי הזמן המצויין.

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