שליטה מומחית על PowerShell: טכניקות פסקה בשורת הפקודה ובתסריטים

ישנם הרבה סיבות לעצירת ביצוע התסריט. אולי תסריט צריך להמתין לקלט מהמשתמש, להאט את מהירות הביצוע, או להמתין לתהליך אחר להסתיים לפני שנמשיך קדימה. כמו עם רוב המשימות ב־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.

Start-Sleep -Seconds 2 -Milliseconds 300

לפני 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:

[System.Threading.Thread]::Sleep(2300)

כדי להשתמש בתכנית timespan עם שיטת שינת התהליך, ניתן לבצע את הפעולות הבאות:

[System.Threading.Thread]::Sleep([TimeSpan]::New(0, 0, 0, 2, 300))

כדי לעצור את התהליך לזמן בלתי מוגבל, ניתן להשתמש ב־[System.Threading.Timeout]::InfiniteTimeSpan, אך חשוב לזכור כי זה עשוי לנעול את התהליך שלך.

בניגוד ל־Start-Sleep, שיטת שינת התהליך אינה מאפשרת לך להפסיק את התהליך השינה באמצעות Ctrl-C. תלוי ביישום שלך, זה עשוי להיות מועדף.

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

בעוד ששינת התהליך יש בה שימושים שלה, עדיף להשתמש באחת מהשיטות המובנות האחרות בשל הבעיות הללו.

קריאת מארח

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

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

Read-Host -Prompt "Press any key to continue"

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

Press Enter to Move Execution Along

אם ברצונך לשמור את הטקסט המוזן למשתנה לשימוש מאוחר יותר, פשוט הקצא את הקלט של Read-Host למשתנה.

$Input = Read-Host -Prompt "Press any key to continue"

לעיתים יתרה תרצה לקרוא בקלט כמחרוזת מאובטחת. למרבה המזל, Read-Host הופך זאת לפשוטה ביותר.

$SecureInput = Read-Host -Prompt "Enter your password" -AsSecureString

Ctrl-C יאפשר לך לצאת מהעיצוב של Read-Host.

שיטת Console ReadKey

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

[Console]::ReadKey()
Console ReadKey Command

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

Do {
	$Key = [Console]::ReadKey($True)
	Write-Host $Key.Key
} While ( $Key.Key -NE [ConsoleKey]::Escape )
Do-While Loop Key

שים לב שכיוון שאנו מחפשים לחיצת מקש מסוימת, Ctrl-C לא תישבור את הקלט כאן.

המארח של הממשק הגולמי של המשתמש קורא לשיטה

לבסוף, יש לנו את השיטה $host.UI.RawUI.ReadKey(). זה דומה לשיטת Console ReadKey, אך שיטה זו מאפשרת להעביר אפשרויות נוספות לשיטת ReadKey כדי לשלוט בהתנהגות ובפלט נוסף.

$host.UI.RawUI.ReadKey()
RawUI.ReadKey

קיימים מספר ReadKeyOptions שניתן להעביר, שעשויים להפוך את שיטת RawUI ReadKey ליהירה יותר.

  • AllowCtrlC
  • IncludeKeyDown
  • IncludeKeyUp
  • NoEcho

ניתן להשתמש בכך בדרך הבאה שתכלול אירועי לחיצה ולא תדפיס את הטקסט.

$host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

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

שיטות לא נייטיביות

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

חלונות

Pause

הפקודה להשהואה היא פשוטה מאוד, ותציג לחץ על כל מקש כדי להמשיך . . . ותישאר כך עד שישובו ללחוץ על מקש כלשהו כדי להמשיך בביצוע.

cmd /c 'pause'
Pause Command

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

Cmd/C Pause Command

Timeout

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

# השהה למשך 2 שניות
timeout /t 2

# השהה למשך 5 שניות אך אל תאפשר שבירת מקשים
timeout /t 5 /nobreak

# השהה לצמיתות עד שמקש יינץ
timeout /t -1
Timeout Command

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

Timeout Command Execution

Linux

Sleep

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

sleep 2.3s
Sleep Command

הפקודה sleep גם כוללת באפשרותה סיומות שיכולות לאפשר תקופות ארוכות יותר להגדרה. דוגמאות:

  • sleep 1m – לישון למשך דקה אחת
  • sleep 2h – לישון למשך שעתיים
  • sleep 1d – לישון למשך יום אחד

קריאה -P

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

read -p 'Press enter to continue' -t 5
Read Application to Pause

מסקנה

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

Source:
https://adamtheautomator.com/powershell-pause/