19/06/2020

מדריך ל PowerShell בעברית חלק 5 - קבלת קלט ממשתמש והצגתו ב PowerShell



לפני קריאת המדריך חובה לעבור על החלקים הקודמים:

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן
לפורום בנושא באתר devhub.co.il כאן

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

1) Read-host  - קבלת קלט מהמשתמש - חלון קובץ שמבקש מידע.
2) Write-host - הצגת מידע מותאם, טקסט כזה או אחר, כגון הודעות, הוראות, ניתן גם בצבעים.


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

אז מתי אנחנו בעצם נרצה לעבוד עם קלט כלשהו ממשתמש כזה או אחר? דבר ראשון ברגע שנרצה להכניס בכל פעם שם משתמש אחר, או אולי שם מחשב אחר, או בעצם כל דבר שלא יהיה זהה בכל פעם, הדוגמא הכי טובה לזה, היא עבודה עם סקריפט קצר שבודק תקשורת, במקום שנכתוב כל פעם ping -some ip adress-  -t אפשר פשוט להגיד ל PowerShell שיבקש מאיתנו את כתובת המחשב בכל פעם שנריץ את הסקריפט, הרבה יותר נוח והרבה יותר פרודוקטיבי.

בתור דוגמא אני אצור את הסקריפט הקצר שהצעתי בפיסקה למעלה - סקריפט לבדיקת פינג.

הפקודה ב PowerShell שיודעת לעבוד עם קלט מהמשתמש היא פקודה שנקראת read-host, פקודה מאוד פשוטה, במידה ותריצו עליה help תקבלו כמה שורות של הסבר

פתחו PowerShell והריצו: help Read-Host -ShowWindow.

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

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

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

נכין סקריפט מאוד פשוט לביצוע פינג:

#הוספתי את ה 
#cls
#בשביל שיופי לי רק הסקריפט ולא הנתיב גם כן
#נסו עם הפקודה ובלי הפקודה ותראו את ההבדל.
cls
$pc = read-host "What is the IP address of the computer?"

ping $pc
במידה ונריץ את הסקריפט, נקבל דבר כזה:




ניתן לשחק עם הפקודה ועם המשתנים ולצרף כמה וכמה "שאלות" ששאלנו את המשתמש ולאחד לתוך פלט של פקודה אחת,
ניקח את המאכל האהוב עלי שהוא המבורגרים (אני מתנצל אם אתם טבעונים..לא מתכוון לפגוע באף אחד) ונבקש מ PowerShell לשאול אותי כמה המבורגרים אכלתי היום ואיפה אכלתי אותם?

סקריפט לדוגמא:
cls
$state = Read-Host "Where did you eat Hamburgers?"
$howmuch = Read-Host "How much hamburgers did you eat?"

write-host " you were in $state and you eat $howmuch hamburgers"


במקרה הזה, פקודת read-host היא בתוך משתנה state$ וגם בתוך משתנה howmuch$ ואז כשאנחנו מאחדים את הכל לתוך הפקודה write-host (שהיא בעצם ההפך מהפקודה read-host - מוציאה פלט למסך המחשב שלנו) אנחנו מקבלים את הפלט כש PowerShell מאחד לנו את כל המשתנים ביחד.

שנית - הסבר על הפקודה שנשתמש בה לצורך הצגת פלט על המסך Write-host.


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

$shnitzel = write-host "I love LeiderTech.co.il"

אם נריץ את זה ולאחר מכן נריץ את המשתנה עלידי הקשת shnitzel$ ו ENTER, לא נקבל כלום, כי המשתנה ריק, לעומת זאת אם נעשה את אותו הדבר עם read-host אז נקבל שבתוך המשתנה יש את read-host:

$shnitzel = read-host "Do you like LeiderTech.co.il?"

במידה ועכשיו תקשיו את shnitzel$ ותקישו ENTER, תקבלו שבתוך המשתנה שזה בעצם מה שהצבנו במשתנה "שניצל"

read-host "Do you like LeiderTech.co.il?"

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

אני משתמש ב write-host לרוב בסקריפטים שלי כשאני רוצה להציג כותרת כמו "This script made by Lev" או משהו בסגנון.

ניתן גם להוסיף לטקסט צבעים על ידי שימוש בפרמטרים "Background Color" ו "Foregroundcolor" ולאחר מכן בחירת צבע, החלק הכי חשוב כאן, זאת הגמישות שיש ל PowerShell מבחינת המיקום של הפרמטרים, גם אם תרשמו אותם לפני הטקסט וגם אם תרשמו אותם אחרי הטקסט, זה עדיין יעבוד כמו שרואים כאן בתצלום המסך בסקריפט הקטן שמספר אודות כמות ההמבורגרים שאכלתי במוסקבה :)


cls
$state = Read-Host "Where did you eat Hamburgers?"
$howmuch = Read-Host "How much hamburgers did you eat?"

#משתנה לפני הטקסט
write-host -ForegroundColor DarkCyan -BackgroundColor White "you were in $state and you eat $howmuch hamburgers"



#משתנה אחרי הטקסט
write-host  "you were in $state and you eat $howmuch hamburgers" -ForegroundColor DarkCyan -BackgroundColor White


התוצאה:




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

רווחים אנחנו נייצר עלידי שימוש ב "Escape character" (תו יציאה\בריחה), כמו שלמדנו באחד המדריכים (כרגע לא זוכר בעל פה, באיזה מהחלקים) אנחנו נשתמש בגרש מיוחד שנמצא במקש ה"טילדה" לרוב מצד שמאל מעל ה-TAB במקלדת והאות "n" (המשמעות - חדש\חדשה):



ואז הסקריפט שלנו יראה ככה:

cls
$state = Read-Host "Where did you eat Hamburgers?"
$howmuch = Read-Host "How much hamburgers did you eat?"

#משתנה לפני הטקסט
write-host -ForegroundColor DarkCyan -BackgroundColor White "you were in $state and you eat $howmuch hamburgers"


#ביצוע רווח בין שורה לשורה
write-host "`n"


#משתנה אחרי הטקסט
write-host  "you were in $state and you eat $howmuch hamburgers" -ForegroundColor DarkCyan -BackgroundColor White


התוצאה:



איך בעצם ניתן לדעת אילו צבעים יש? אז ראשית ברגע שאתם כותבים את הקוד ב-ISE, אתם תקבלו את הרשימה של כל הצבעים שעומדים לרשותכם, דבר שני, ניתן להריץ את help write-host ותקבלו את הרשימה של הצבעים, דבר שלישי, אני אכתוב לכם את הצבעים כאן:

Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White




בנוסף, ניתן לרשום טקסט בשורה חדשה בצורה דומה, על ידי שימוש באותו ה "Escape character", בעזרת הצבתו בתחילת המילה\משפט שנרצה להציג בשורה חדשה כמו בדוגמא הבאה:

בדוגמא זאת, שמתי את ה "n`" ישר בצמוד למילה שאחרי הפסיק, בשביל שהחלק השני של המשפט יוצג בשורה הבאה ללא רווחים (שימו לב למה שקורה אחרי הפסיק):

write-host -ForegroundColor DarkCyan -BackgroundColor
White "you were in $state ,`nand you eat $howmuch hamburgers"

בתוך סקריפט זה יראה ככה:

cls
$state = Read-Host "Where did you eat Hamburgers?"
$howmuch = Read-Host "How much hamburgers did you eat?"

#שורה חדשה
write-host -ForegroundColor DarkCyan -BackgroundColor
White "you were in $state ,`nand you eat $howmuch hamburgers"


התוצאה:





לידע כללי:
ישנה גם פקודה שנקראת write-output, שהיא יותר מיועדת לשימוש בתוך הסקריפט. בעזרתה  ניתן להציג "תוצאה" של הסקריפט שלכם או ליצא את הנתונים הסופיים של הסקריפט שלכם לקובץ מסויים, אין לה אפשרות להוסיף צבעים או רקעים בצבעים כמו ב Write-host.


לכל שאלה המייל שלי: levl@LeiderTech.co.il.

לכלל הפוסטים והמדריכים בנושא ה PowerShell ניתן למצוא כאן
לפורום בנושא באתר devhub.co.il כאן
מדריך מצולם:


7 תגובות:

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

תודה :)