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 утіхи.