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

ניתן להשוות מערכים באמצעות האופרטור -contains
על ידי קריאה של כל מחרוזת במערך ובדיקה אם המערך האחר מכיל את המחרוזת הזו.
בואו נגיד שאני רוצה להשוות שני מערכים כדי לראות אילו מחרוזות במערך הראשון קיימות במערך השני.
באופן חלופי, ניתן להשתמש באופרטור -in
שזהה לאופרטור -contains
אך התחביר הוא הפוך. כאשר משתמשים באופרטור -contains
, המערך מוגדר בצד השמאלי. בשימוש באופרטור -in
, המערך מוגדר בצד הימני כמו למטה:
בשימוש ב-Where-Object
באופן חלופי, ניתן גם להשתמש בפקודת ה-cmdlet Where-Object
כדי להחזיר את כל המחרוזות במערך אחד במערך השני כמו למטה.
בשימוש ב-Cmdlet Compare-Object
ניתן גם להשתמש ב-PowerShell כדי להשוות מערכים באמצעות ה-cmdlet Compare-Object
. ה-cmdlet הזה לוקח אובייקט ייחוס ואובייקט הבדל ומחזיר מחוון צד המציין אילו אלמנטים קיימים ואינם קיימים בכל אחד מהמערכים.

תוכלו לראות למטה שה-cmdlet Compare-Object
מאפשר לכם להשוות את שני המערכים בבת אחת. אם התכונה SideIndicator
היא =>
, זה אומר שהתכונה InputObject
שחזרה נמצאת בערך DifferenceObject
ולא בערך ReferenceObject
ולהפך עבור ה-<=
SideIndicator
.
באופן ברירת מחדל, Compare-Object
מחזיר את ההבדלים. ניתן גם להחזיר את כל המחרוזות בכל מערך שנמצאות בשניהם על ידי שימוש בפרמטר IncludeEqual
.

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

הנה כיצד אני מקבל את שני המערכים שלנו.
מה קורה כשאנו מריצים שני המערכים הללו דרך אותה תרחיש כמו במחרוזות שלנו? אבסולוטית שום דבר. למה?
הסיבה היא שלרוב אי אפשר לומר באופן טיפוסי $object1 -eq $object2
מכיוון שהאובייקטים מורכבים יותר ממחרוזת פשוטה, בוליאנית או מספר שלם. ישנם מקרים אחרים בהם זה לא המקרה אבל אני מנסה להפוך זאת לרגל להשוות מאפייני אובייקט; לא אובייקטים שלמים. אז במקרה זה, עלינו לעשות משהו כמו זה:
מה הפתרון? כרגע, יש לי שני פתרונות. כאשר אנו מתמודדים עם אלפי אובייקטים זה לא מהיר אך זה עובד. אשמח לדעת אם יש למישהו עוד הצעות.
אנו יכולים גם להשתמש Compare-Object
אף על פי שזה איטי יותר.
מסקנה
ישנן דרכים רבות שונות להשתמש בפוורשל כדי להשוות מערכים. מערכים יכולים להיות מורכבים והבנה מעמיקה של אובייקטים בתוך המערכים תסייע מאוד בהשוואתם.
Source:
https://adamtheautomator.com/powershell-compare-arrays/