הפקודה Invoke-Expression ב־PowerShell יכולה להיות קלה להבנה כיצד להשתמש בה ומתי לא להשתמש בה. במאמר זה, אני יצרתי מספר שאלות נפוצות מאוד. אני הולך לפרט אותן ולכלול המון דוגמאות שימושיות עבורך להפניה בכל פעם שתזדקק.
זה אומר שעליך לשמור על קישור לדף זה כרגע!
רוצה עוד טיפים כמו זה? בדוק את הבלוג האישי שלי ב־PowerShell ב: https://www.nkasco.com/
מהו Invoke-Expression
?
התיאור הרשמי, לפי Microsoft, הוא: "הפקודה Invoke-Expression משערת או מריצה מחרוזת מסוימת כפקודה ומחזירה את תוצאות הביטוי או הפקודה. ללא Invoke-Expression, מחרוזת שנשלחת בשורת הפקודה תוחזר (תודפס) כפי שהיא."
במילים אחרות, זה יכול להיות שימושי לקריאת קוד בתוך סקריפט או לבניית פקודות להרצה מאוחר יותר. כמו כן, יש להשתמש בו בזהירות בשילוב עם קלט מסופק על ידי המשתמש.
הדוגמה הבסיסית ביותר לשימוש ב־Invoke-Expression
היא הגדרת סקריפט והעברת מחרוזת זו לפרמטר Command
. Invoke-Expression
מבצעת אז את המחרוזת הזו.
מה לעשות אם יש רווחים בנתיב הסקריפט שלי?
ודא שאתה מסביר מחרוזות עם גרש יחיד או גרשיים.
לדוגמה, אם תרצה לבצע מחרוזת עם רווח בנתיב, אפשרויות אלו לא יעבדו:
למה? כי זה בדיוק אותו דבר כמו להקליד זאת ישירות בקונסולת PowerShell:
אך אם תסגור את פריט הנתיב בגרש יחיד או גרשיים ותשים את כל המחרוזת בתוך גרשים, Invoke-Expression
יבצע את הסקריפט כצפוי.
Q. How do you pass parameters to scripts invoked with Invoke-Expression
?
הפרמטר היחיד של Invoke-Expression
הוא Command
. אין דרך טבעית להעביר פרמטרים עם Invoke-Expression
. אך במקום זאת, תוכל לכלול אותם במחרוזת שאתה מעביר לפרמטר Command
.
אולי יש לך סקריפט עם שני פרמטרים בשם Path
ו-Force
. במקום להשתמש בפרמטר ספציפי דרך Invoke-Expression
, תוכל להעביר פרמטרים לסקריפט כפי שתעשה כרגיל דרך הקונסול.
אם בדרך כלל תקרא לסקריפט כך דרך הקונסול:
תצטרך לכלול את כל השורה הזו בתוך מחרוזת ולאחר מכן להעביר את המחרוזת הזו לפרמטר Command
.
האם try/catch יכול להיות רלוונטי עם Invoke-Expression?
לא באמת. זה אומר שעליך להשתמש בטיפול בשגיאות בתוך הפרמטר שלך Command
.
דוגמה:
מה ההבחנה בין Invoke-Expression
ובין אופרטור הקריאה (&
)?
האופרטור לקריאה (&
) מצוין להפעלה מהירה של פקודה, סקריפט או בלוק סקריפט. אך האופרטור לא מפענח את הפקודה. הוא אינו יכול לפרש פרמטרים כפי ש-Invoke-Expression יכול.
לדוגמה, אולי אני רוצה לקבל את תהליך PowerShell Core באמצעות cmdlet Get-Process
באמצעות הקוד Get-Process -ProcessName pwsh
. חיבור של Get-Process
והפרמטר לא יעבוד כצפוי באמצעות אופרטור הקריאה.
אך אם תבצע את המחרוזת הזו עם Invoke-Expression, זה יעבוד כפי שצוין.
מה ההבחנה בין Invoke-Expression
ו-Start-Process
?
קומלט מספקת קוד החזרה או קוד יציאה באובייקט שמתקבל. זה מאפשר לך להמתין שהתהליך שנקרא יסתיים ואף מאפשר לך להפעיל תהליך תחת הרשאה שונה של Windows. Invoke-Expression הוא אפשרות מהירה וזמינה בתחום נקי בעוד ש-Start-Process יכול להיות יותר שימושי לפרש תוצאות של תהליכים שנקראו.
מה ההבחנה בין Invoke-Expression
לבין Invoke-Command
?
Invoke-Expression
פשוט "מתרגם" מחרוזת לקוד ביצוע. לעומתו, Invoke-Command
משתמש ב־PowerShell Remoting, מעניק לך את היכולת להפעיל קוד באופן מקומי או מרחוק על מחשבים.
Invoke-Command
הוא הבחירה המועדפת כאשר אתה כותב את הפקודות המבוצעות כעת, מאחר ואתה שומר על Intellisense בסביבת הפיתוח שלך, בעוד ש־Invoke-Expression
הוא הבחירה המועדפת אם ברצונך לקרוא לסקריפט נוסף מתוך הסקריפט הנוכחי שלך.
דוגמה:
מה ההבחנה בין Invoke-Expression
ל־Invoke-Item
?
פקודת ה־Invoke-Item
נותנת לך תמיכה מיידית בפעולה רבה עבור נתיבים מרובים לפתיחת מסמכים בפעולתם הדיפולטיבית, עם פרמטרים לכלול, לא לכלול, להוסיף הרשאות, ואף אישור לביטחון נוסף.
האם Invoke-Expression הוא בטוח?
A. If someone had malicious intent they might be able to trick some virus programs by masking malicious code that constructs itself during runtime. Invoke-Expression
will happily execute whatever text is passed to it’s Command
parameter.
דוגמה:
מהם כמה ייעוץי הטובה להרצת פקודות/ביטויים מרובים?
אם יש לך מספר פקודות לבצע, אף ש־Invoke-Expression
מקבל רק מחרוזת במקום מערך, ניתן להשתמש בצינורות של PowerShell כדי לשלוח אובייקטים למטה בצינור אחד אחר זה.
דוגמה:
איך אני משתמש ב־Invoke-Expression
עם קלט משתמש?
עליך להיות זהיר מאוד בשימוש ב־Invoke-Expression עם קלט משתמש. אם אתה מאפשר הודעה למשתמש בדרך שנותנת לו גישה מחוץ לפקודה שאתה מתכנן לבצע, זה עשוי ליצור פרצות אבטחה לא רצויות. הנה אחת הדרכים שבה תוכל ליישם בטוח קלט משתמש עם Invoke-Expression
.
מסקנה
לכל cmdlet יש מקום שלו ו־Invoke-Expression
הוא אחד מהם שכמעט כולם יתקלו בו בסופו של דבר. חשוב להבין את היתרונות והחסרונות של cmdlets שמצויימים בשימוש תדיר כך שתיישם אותם בדרך שתקדם אותך להצלחה. אני סקרני לשמוע כיצד השתמשתם ב־Invoke-Expression
כדי לפתור חלק מהאתגרים שלכם, השאירו תגובה למטה ושתפו את סיפורכם!
רוצה עוד טיפים כאלה? בדוק את הבלוג שלי בפוורשל בכתובת: https://www.nkasco.com/