Домашня » як » Geek школа роботи з колекціями в PowerShell

    Geek школа роботи з колекціями в PowerShell

    Оскільки PowerShell базується на .Net Framework і включає в себе різні інші технології, такі як WMI і CIM, завжди є більше ніж один спосіб досягти того ж самого. Приєднуйтесь до нас за цей короткий пост, де ми дізнаємося, як вибрати найкращий спосіб для виконання наших завдань.

    Обов'язково прочитайте попередні статті серії:

    • Дізнайтеся, як автоматизувати Windows за допомогою PowerShell
    • Навчання використанню командлетів у PowerShell
    • Навчання використанню об'єктів у PowerShell
    • Навчання форматування, фільтрації та порівняння в PowerShell
    • Дізнайтеся, як використовувати віддалене використання в PowerShell
    • Використання PowerShell для отримання інформації про комп'ютер

    І залишайтеся з нами для решти серії цілий тиждень.

    Використання пакетних командлетів

    Раніше в серії, коли ми познайомили вас з конвеєром, ми показали, як можна взяти об'єкти, які виводять один cmdlet, і передавати їх як вхідні дані іншому cmdlet, використовуючи щось на зразок цього:

    Get-Process -Name блокнот | Стоп-процес

    Це вбило б будь-який процес з назвою "блокнот". Але ви, мабуть, задаєтеся питанням, як PowerShell здатна вбивати кожен екземпляр блокнота за допомогою однієї команди. Відповідь полягає в допомозі командлета Stop-Process.

    допомога Stop-Process -Full

    Якщо ви подивитеся на останній рядок коду в розділі синтаксису, ви можете побачити, що параметр InputObject приймає об'єкт типу Process [], і коли ви бачите тип, за яким слідують дві квадратні дужки, це означає, що параметр приймає один або більше попереднього типу. У цьому випадку він приймає один або більше об'єктів процесу. Технічно ми можемо сказати, що cmdlet InputObject приймає процес масив. Якщо у вас є командлет, який підтримує пакетну операцію таким чином, використовуйте його. Це вибір номер один.

    Використання WMI

    Незважаючи на те, що WMI не є найкращою технологією, що поставляється з штаб-квартирою Microsoft, вона приходить на друге місце в списку роботи з колекціями об'єктів. Ми могли б легко отримати список запущених процесів з класу Win32_Process так:

    Get-WmiObject-Клас Win32_Process

    Оскільки запит WMI повертає свій власний тип об'єкта, вам потрібно шукати метод, який може зупинити процес, так що дозволяє приймати трубку до Get-Member.

    Get-WmiObject-Клас Win32_Process | Get-Member

    Схоже, що найближча річ для зупинки - це метод припинення, так що він повинен бути одним. Щоб викликати метод на об'єкті WMI, ви просто перекажете його до Invoke-WmiMethod і вкажіть ім'я методу.

    Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod -Name Terminate

    Чудово, це зробило трюк. Всякий раз, коли ви отримуєте ReturnValue 0 в WMI, просто пам'ятайте, що команда виконана успішно.

    Перерахування

    У разі відсутності двох інших методів, якщо вам треба щось робити з купою об'єктів, ви можете перерахувати весь об'єкт і діяти на кожен окремий об'єкт. Спочатку ви повинні знайти метод, який ви використовуєте, щоб зупинити один процес.

    Get-Process | Метод Get-Member -MemberType

    Ідеальний, схоже, що ми можемо використовувати метод Kill, а потім потрапити в ForEach-Object, щоб убити їх усіх.

    Get-Process -Name блокнот | ForEach-Object-Process $ _. Kill ()

    Тут ми взяли всі об'єкти процесу, які повернули Get-Process, і передали їх командлету ForEach-Object. Так само, як cmdlet Where-Object, ми представляли кожний об'єкт у конвеєрі з $ _, на який ми могли викликати метод Kill () on. З усім, що сказано і зроблено, перерахування колекції відбувається набагато повільніше, ніж описані вище методи, і має використовуватися лише як останній результат.

    Резюме

    Вибір один

    Get-Process -Name блокнот | Стоп-процес

    Вибір Два

    Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod -Name Terminate

    Вибір Три

    Get-Process -Name блокнот | ForEach-Object-Process $ _. Kill ()

    Це все для цього часу люди, бачимо вас наступного тижня для більше PowerShell утіхи.