כיצד משפיעות על סקריפטים PowerShell
בסקריפטים אצווה, לשינויים במשתני סביבה יש השפעה גלובלית על ההפעלה הנוכחית כברירת מחדל. עבור PowerShell, ההפך הגמור הוא הנכון, מכיוון שהסקופים משמשים לבידוד שינויים בתסריט. כאן, נחקור את האופן שבו סקופ משפיעים על סקריפטים של PowerShell וכיצד לעבוד בהם ומסביבם.
מהו היקף?
ב- PowerShell, "היקף" מתייחס לסביבה הנוכחית שבה פועל סקריפט או פגז פקודה. טווחים משמשים להגנה על אובייקטים מסוימים בתוך הסביבה מפני שינוי לא מכוונת על ידי סקריפטים או פונקציות. במיוחד, הדברים הבאים מוגנים משינוי על ידי פקודות שמופעלות מתוך טווח אחר, אלא אם צוין אחרת על ידי הפרמטרים בפקודות אלה:
- משתנים
- כינויים
- פונקציות
- כונני PowerShell (PSDrives)
טווחים חדשים נוצרים בכל פעם שאתה מפעיל סקריפט או פונקציה, או כאשר אתה יוצר הפעלה חדשה או מופע של PowerShell. טווחים שנוצרו על ידי הפעלת סקריפטים ופונקציות יש קשר "הורה / ילד" עם היקף שממנו הם נוצרו. יש כמה טווחים שיש להם משמעויות מיוחדות במיוחד, וניתן לגשת אליהם לפי שם:
- ה גלובלי היקף הוא היקף שנוצר כאשר PowerShell מופעל. הוא כולל את המשתנים, כינויים, פונקציות ו- PSDrives המוכללים ב- PowerShell, כמו גם את כל אשר מבוצעים על-ידי פרופיל PowerShell.
- ה מקומי היקף מתייחס לכל מה היקף הנוכחי. כאשר אתה מפעיל PowerShell זה יתייחס היקף גלובלי, בתוך סקריפט זה יהיה היקף סקריפט, וכו '.
- ה סקריפט היקף נוצר כאשר סקריפט מופעל. הפקודות היחידות הפועלות במסגרת זו הן אלה הנמצאות בתסריט.
- פרטי ניתן להגדיר טווחים בטווח הנוכחי, כדי למנוע פקודות בתחומים אחרים מלהיות מסוגלים לקרוא או לשנות פריטים שאליהם הם יכולים לגשת.
טווחים ניתן גם מתייחסים למספר בפקודות מסוימות, כאשר ההיקף הנוכחי נקרא אפס אבותיו מופנים על ידי הגדלת מספרים שלמים. לדוגמה, בתוך סקריפט המופעל מהיקף גלובלי, היקף הסקריפט יהיה 0, והיקף הגלובלי יהיה 1. היקף שקודם יותר נמצא בטווח הסקריפט, כגון פונקציה, יתייחס להיקף הגלובלי כ- 2 המספרים השליליים לא יפעלו להערכת טווחי הילדים - הסיבה לכך תתגלה בקרוב.
איך scopes להשפיע על פקודות
כפי שצוין קודם לכן, פקודות שבוצעו בתוך היקף אחד לא ישפיעו על דברים בהיקף אחר, אלא אם כן נאמר במפורש לעשות זאת. לדוגמה, אם $ MyVar קיים בטווח גלובלי ו- Script מפעיל פקודה להגדיר $ MyVar לערך אחר, הגרסה הכללית של $ MyVar תישאר ללא שינוי בעוד עותק של MyVar $ ממוקם בטווח הסקריפט עם החדש ערך. אם MyVar $ אינו קיים, סקריפט ייצור אותו בטווח הסקריפט כברירת מחדל - לא בטווח הגלובלי. זה חשוב לזכור כאשר אתה לומד על יחסי הורה / ילד בפועל בין טווחי.
יחסי הורה / ילד של טווחים ב- PowerShell הם חד-כיווניים. פקודות יכולות לראות, ולהחליף אופציונלית, את ההיקף הנוכחי, את ההורה שלו, ואת כל טווחי מעל זה. עם זאת, הם לא יכולים לראות או לשנות דברים בכל הילדים בהיקף הנוכחי. זאת בעיקר משום שברגע שעברתם להיקף הורה, היקף הילד כבר נהרס משום שהוא מילא את מטרתו. לדוגמה, מדוע יהיה עליך לראות או לשנות משתנה בטווח הסקריפט, מהיקף גלובלי, לאחר שהסקריפט הסתיים? יש הרבה מקרים שבהם אתה צריך שינויים של סקריפט או פונקציה כדי להתמיד מעבר להשלמתו, אבל לא כל כך הרבה שבו אתה צריך לעשות שינויים אובייקטים בתוך הסקריפט של או היקף של הפונקציה לפני או אחרי זה פועל. (בדרך כלל, דברים כאלה יטופלו כחלק מהתסריט או הפונקציה עצמה בכל מקרה.)
כמובן, מה הם כללים ללא חריגים? חריג אחד מהנ"ל הוא היקף פרטי. אובייקטים בהיקפים הפרטיים נגישים רק לפקודות המנוהלות בהיקף שממנו הן נוצרו. חריג חשוב נוסף הוא פריטים שיש להם את המאפיין AllScope. אלה הם משתנים מיוחדים וכינויים אשר שינוי בכל היקף ישפיע על כל טווחים. הפקודות הבאות יראו לך אילו משתנים וכינויים הם בעלי המאפיין AllScope:
קבל משתנה אובייקט - אובייקט - $ _ אפשרויות -מאמר 'AllScope' Get-Alias | אובייקט-אובייקט $ _. אפשרויות -מאמר 'AllScope')
טווחי פעולה
עבור מבט ראשון שלנו על טווחי פעולה, אנחנו הולכים להתחיל בפגישה PowerShell שבו המשתנה $ MyVar כבר מוגדר למחרוזת, "אני משתנה גלובלי!", משורת הפקודה. לאחר מכן, הסקריפט הבא יופעל מתוך קובץ הנקרא Scope-Demo.ps1:
פונקציה FunctionScope 'שינוי MyVar $ עם פונקציה'. $ MyVar = 'יש לי להגדיר על ידי פונקציה!' "MyVar אומר $ MyVar" "בדיקת הערך הנוכחי של $ MyVar." "MyVar אומר $ MyVar" "שינוי $ MyVar על ידי סקריפט." $ MyVar = 'יש לי להגדיר על ידי סקריפט!' "MyVar אומר $ MyVar" "FunctionScope" בדיקת הערך הסופי של MyVar לפני היציאה התסריט. "MyVar אומר $ MyVar" "
אם סקריפטים של PowerShell עבדו כמו סקריפטים של אצווה, היינו מצפים לוואלה של $ MyVar (או% MyVar% בתחביר אצווה) כדי לעבור מ'אני משתנה גלובלי ', ל'קיבלתי את התסריט!' , ולבסוף 'יש לי להגדיר על ידי פונקציה!' שם הוא יישאר עד שישתנה במפורש שוב או שהפגישה תסתיים. עם זאת, לראות מה באמת קורה כאן כאשר אנו נעים דרך כל טווחים - במיוחד, לאחר הפונקציה FunctionScope השלימה את עבודתה ואנחנו בודקים את המשתנה שוב מן התסריט, ולאחר מכן את היקף גלובלי.
כפי שאתה יכול לראות את המשתנה נראה שינוי כאשר עברנו דרך התסריט כי, עד הפונקציה FunctionScope הושלמה, היינו בודקים על המשתנה מתוך אותו היקף זה שונה לאחרונה. לאחר FunctionScope נעשתה אם כי, חזרנו לתוך היקף סקריפט שבו $ MyVar נותר ללא פגע על ידי הפונקציה. לאחר מכן, כאשר התסריט הסתיים, חזרנו החוצה לתוך היקף גלובלי שבו זה לא היה שונה בכלל.
להגיע מחוץ היקף מקומי
אז, זה כל טוב וטוב כדי לעזור לך לשמור מפני יישום בטעות שינויים בסביבה מעבר scripts שלך פונקציות, אבל מה אם אתה באמת רוצה לעשות שינויים כאלה? יש תחביר מיוחד, ופשוט למדי, ליצירה ושינוי של אובייקטים מעבר להיקף המקומי. אתה פשוט לשים את שם התחום בתחילת שם המשתנה, ולשים נקודתיים בין היקף שמות המשתנה. ככה:
$ גלובלי: MyVar $ script: MyVar $ מקומי: MyVar
ניתן להשתמש במשתנים אלה הן בעת הצגת משתנים והגדרתם. בואו נראה מה קורה עם התסריט הזה הפגנה:
פונקציה FunctionScope "שינוי $ MyVar ב היקף הפונקציה המקומית ..." $ Local: MyVar = "זה MyVar בהיקף המקומי של הפונקציה." "שינוי MyVar $ בטווח הסקריפטים ... '$ script: MyVar =' MyVar היה אמור להיות מוגדר על ידי פונקציה.עכשיו מוגדר על ידי פונקציה. "שינוי $ MyVar בהיקף הגלובלי ... '$ גלובלי: MyVar =' MyVar נקבע בטווח הגלובלי. עכשיו "" MyVar "" גלובלי: $ גלובלי: MyVar "" "השגת הערך הנוכחי של $ MyVar". "MyVar אומר $ MyVar" "שינוי $ MyVar על ידי סקריפט." $ MyVar = 'יש לי להגדיר על ידי סקריפט!' "MyVar אומר $ MyVar" FunctionScope "בודק $ MyVar מתוך היקף הסקריפט לפני היציאה. "MyVar אומר $ MyVar" "
כמו קודם, נתחיל על ידי הגדרת המשתנה בהיקף גלובלי וכלה בבדיקת התוצאה הסופית של טווח גלובלי.
כאן ניתן לראות ש- FunctionScope הצליח לשנות את המשתנה בטווח הסקריפט, והשינויים נמשכו לאחר השלמתו. כמו כן, השינוי במשתנה בקנה מידה גלובלי נמשך גם לאחר התסריט יצא. זה יכול להיות שימושי במיוחד עבור אם אתה צריך לשנות שוב ושוב משתנים בתוך סקריפט, או בתוך היקף גלובלי, באמצעות אותו קוד - אתה רק להגדיר פונקציה או סקריפט שנכתב כדי לשנות את המשתנה איפה וכיצד אתה צריך לעשות את זה, ו כי בכל פעם שיש צורך בשינויים אלה.
כפי שצוין קודם לכן, מספרי ההיקף יכולים לשמש גם בפקודות מסוימות כדי לשנות את המשתנה ברמות שונות ביחס להיקף מקומי. הנה אותו סקריפט המשמש בדוגמה השנייה לעיל, אך עם הפונקציה שונה כדי להשתמש בפקודות Get-Variable ו- Set-Variable עם מספרי טווח במקום להתייחס ישירות למשתנה עם טווחי שם:
פונקציה FunctionScope "שינוי $ MyVar בהיקף 0, ביחס ל FunctionScope ..." Set-Variable MyVar "זה MyVar בטווח של הפונקציה 0." -Scope 0 'שינוי $ MyVar בהיקף 1, יחסית ל- FunctionScope ...' Set-Variable MyVar 'MyVar השתנה בהיקף 1, מתוך פונקציה.' -Scope 1 'שינוי $ MyVar בהיקף 2, יחסית Functionscope ...' Set-Variable MyVar 'MyVar השתנה בהיקף 2, מתוך פונקציה. -Scope 2 "בודק $ MyVar בכל היקף ..." היקף 0: "קבל משתנה MyVar -Scope 0 -ValueOnly 'היקף 1:' קבל משתנה MyVar -Scope 1 -ValueOnly 'היקף 2:' קבל משתנה MyVar -Scope 2 -ValueOnly "" השגת הערך הנוכחי של $ MyVar ". "MyVar אומר $ MyVar" "שינוי $ MyVar על ידי סקריפט." $ MyVar = 'יש לי להגדיר על ידי סקריפט!' "MyVar אומר $ MyVar" FunctionScope "בודק $ MyVar מתוך היקף הסקריפט לפני היציאה. "MyVar אומר $ MyVar" "
כמו בעבר, אנו יכולים לראות כאן כיצד פקודות בהיקף אחד יכולות לשנות אובייקטים בהיקפה ההורה.
מידע נוסף
יש עדיין הרבה יותר שניתן לעשות עם scopes מאשר יכול להתאים במאמר זה. טווחים משפיעים על יותר משתנים בלבד, ויש עוד מה ללמוד על טווחים פרטיים ומשתני AllScope. לקבלת מידע שימושי יותר, באפשרותך להפעיל את הפקודה הבאה מתוך PowerShell:
Get-Help about_scopes
אותו קובץ עזרה זמין גם ב- TechNet.
היקף אשראי התמונה: spadassin על openclipart