פירוש מחרוזות PowerShell: לשלוט ביסודות

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

מחרוזות מוגדרות על ידי הקפצת תו או יותר בתוך גרשיים יחידים או כפולים כמו בדוגמאות הבאות:

$Url = 'http:\\www.bing.com'
$FilePath = 'C:\thisissomefile.txt'

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

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

$ComputerName = 'URANUS'
$ComputerName = "SRV-$ComputerName"

ערך המשתנה $ComputerName הוא כעת SRV-URANUS אך להקפצת $ComputerName בתוך המחרוזת עם גרשיים כפולים הוא רק אחת מהדרכים להכניס משתנים במחרוזות. ישנם כמה דרכים שונות לעשות את זה. בוא נסתכל על שני דוגמאות.

הרחבת מחרוזות

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

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

לדוג, אולי אני צריך לציין את הנתיב לקובץ. אני יודע את נתיב התיקייה הבסיסית, אך לא את שם הקובץ הממשי עדיין. ייתכן שאצור משתנה בשם $FullPath ואכניס ידנית את נתיב התיקייה, אך אעשה את שם הקובץ משתנה.

PS> $FileName = 'MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$FileName"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

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

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$($File.Name)"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

הרחבת מחרוזת היא דבר נפוץ מאוד, אך מה קורה אם יש לך מחרוזת שהיא מורכבת יותר?

שימוש באופרטור התבנית של PowerShell

דרך נוספת לוודא שערכי משתנים מוכנסים לתוך המחרוזות שלך היא דרך אופרטור התבנית של PowerShell (-f).

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

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> 'C:\Folder\subfolder\{0}' -f $File.Name
C:\Folder\subfolder\MyFile.txt

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

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

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $SubFolderName = 'folder1'
PS> 'C:\Folder\subfolder\{0}\{1}' -f $SubFolderName, $File.Name
C:\Folder\subfolder\folder1\MyFile.txt

מתי להשתמש באופרטור התבנית

I usually prefer to place variables inside of the string and expand them because I don’t have to match an index with a value. However, there are exceptions, as in the case of special characters that must be escaped.

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

Utility.exe -file "C:\Program Files\SomeFolder\a subfolder here"

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

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
Start-Process -FilePath 'utility.exe' -Args "`"$FileName`""

עכשיו, נקבל את אותו התוצאה עם אופרטור התבנית.

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
$Args = '"{0}"' -f $FileName
Start-Process -FilePath 'utility.exe' -Args $Args

I don’t have to use any escape characters. This may seem like a simple example but as soon as you come across large strings that require a lot of escaping you will soon see the real benefit of using the format operator!

סיכום

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

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

Source:
https://adamtheautomator.com/powershell-string-format/