11Sep

בית ספר חנון: עבודה עם אוספים ב PowerShell

מאז PowerShell מבוססת על. NET Framework ומשלבת טכנולוגיות שונות אחרות כמו WMI ו CIM, תמיד יש יותר מדרך אחת להשיג את אותו הדבר.בואו להצטרף אלינו לכתוב קצר זה שבו אנו לומדים כיצד לבחור את השיטה הטובה ביותר לבצע את המשימות שלנו.

הקפד לקרוא את המאמרים הקודמים בסדרה:

  • למד כיצד להפוך את Windows עם PowerShell
  • לומד להשתמש ב- Cmdlets ב- PowerShell
  • למידה כיצד להשתמש באובייקטים ב- PowerShell
  • למידה, עיצוב והשוואה ב- PowerShell
  • למד להשתמש ב- Remoting ב-PowerShell
  • באמצעות PowerShell כדי לקבל מידע על המחשב

ולהישאר מכוון עבור שאר הסדרה כל השבוע.

באמצעות אצווה Cmdlets

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

Get-Process -שם פנקסעצור תהליך

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

עזרה בתהליך עצור-מלא

אם אתה מסתכל על שורת הקוד האחרונה במקטע התחביר, ניתן לראות שהפרמטר InputObject מקבל אובייקט מסוג Process [], ובכל פעם שאתה רואה סוג ואחריו שתי סוגריים מרובעים כמוזה אומר שהפרמטר מקבל

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

שימוש ב- WMI

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

Get-WmiObject -Class Win32_Process

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

Get-WmiObject -Class Win32_Process |Get-Member

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

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe' '|הפעל- WmiMethod -Name לסיים

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

ספירה

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

קבל תהליך |Get-Member -MemberType שיטה

מושלם, זה נראה כאילו אנחנו יכולים להשתמש בשיטת להרוג ולאחר מכן צינור לתוך ForEach- אובייקט להרוג את כולם.

Get-Process-Name NotepadForEach-Object -Process{ $ _. Kill()}

כאן הבאנו את כל האובייקטים בתהליך ש- Get-Process חזרו והעבירו אותם ל- cmdlet ForEach-Object.בדומה ל- cmdlet של אובייקט האובייקט, ייצגנו כל אובייקט בצינור עם $ _ אשר הצלחנו לקרוא לשיטת ה- Kill() ב-.עם כל מה שנעשה, ספירה של אוסף הוא הרבה יותר לאט מאשר את השיטות הנ"ל ויש להשתמש רק כתוצאה האחרונה.

סיכום

בחירה אחת

Get-Process-Name Notepad |עצור תהליך

בחירה שני

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe' '|Invoke-WmiMethod -Name סיום

בחירה שלושה

Get-Process-Name Notepad |ForEach-Object -Process{ $ _. Kill()}

זה הכל עבור אנשים זה הזמן, לראות אותך בשבוע הבא יותר כיף PowerShell.