Школа Geek: работа с коллекциями в PowerShell

Оглавление:

Школа Geek: работа с коллекциями в PowerShell
Школа Geek: работа с коллекциями в PowerShell

Видео: Школа Geek: работа с коллекциями в PowerShell

Видео: Школа Geek: работа с коллекциями в PowerShell
Видео: Топ 8 фишек PlayStation 5 vs Xbox Series X. Полный тест PS5 и сравнение. - YouTube 2024, Ноябрь
Anonim
Поскольку PowerShell основан на.NET Framework и включает в себя различные другие технологии, такие как WMI и CIM, всегда существует более одного способа выполнить одно и то же. Приходите к нам на этот короткий пост, где мы узнаем, как выбрать лучший метод для выполнения наших задач.
Поскольку PowerShell основан на.NET Framework и включает в себя различные другие технологии, такие как WMI и CIM, всегда существует более одного способа выполнить одно и то же. Приходите к нам на этот короткий пост, где мы узнаем, как выбрать лучший метод для выполнения наших задач.

Обязательно прочитайте предыдущие статьи в серии:

  • Узнайте, как автоматизировать Windows с помощью PowerShell
  • Обучение использованию командлетов в PowerShell
  • Обучение использованию объектов в PowerShell
  • Форматирование, фильтрация и сравнение обучения в PowerShell
  • Научитесь использовать Remoting в PowerShell
  • Использование PowerShell для получения информации о компьютере

И оставайтесь настроенными для остальной части серии всю неделю.

Использование командных командлетов

Ранее в серии, когда мы познакомили вас с конвейером, мы показали вам, как вы можете взять объекты, которые выводит один командлет, и передавать их в качестве ввода в другой командлет, используя что-то вроде этого:

Get-Process -Name notepad | Stop-Process

Это уничтожит любой процесс с названием «блокнот». Но вам, вероятно, интересно, как PowerShell может убить каждый экземпляр блокнота с помощью одной команды. Ответ заключается в помощи командлета Stop-Process.

help Stop-Process –Full

Image
Image

Если вы посмотрите на последнюю строку кода в разделе синтаксиса, вы увидите, что параметр InputObject принимает объект типа Process , и всякий раз, когда вы видите тип, за которым следуют две квадратные скобки, это означает, что параметр принимает один или больше предыдущего типа. В этом случае он принимает один или несколько объектов процесса. Технически мы бы сказали, что командлет InputObject принимает процесс массив, Всякий раз, когда у вас есть командлет, поддерживающий пакетные операции таким образом, используйте его. Это выбор номер один.

Использование WMI

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

Get-WmiObject –Class Win32_Process

Поскольку запрос WMI возвращает свой собственный объект, вам нужно будет искать метод, который может остановить процесс, поэтому давайте передадим его Get-Member.
Поскольку запрос WMI возвращает свой собственный объект, вам нужно будет искать метод, который может остановить процесс, поэтому давайте передадим его Get-Member.

Get-WmiObject –Class Win32_Process | Get-Member

Image
Image

Похоже, что самое близкое, что нужно остановить, это метод завершения, поэтому он должен быть единственным. Чтобы вызвать метод в объекте WMI, вы просто подключите его к Invoke-WmiMethod и укажите имя метода.

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

Замечательно, что это трюк. Всякий раз, когда вы получаете ReturnValue из 0 в WMI, просто помните, что команда выполнена успешно.
Замечательно, что это трюк. Всякий раз, когда вы получаете ReturnValue из 0 в WMI, просто помните, что команда выполнена успешно.

перечисление

Если не выполняются другие два метода, если вам нужно что-то сделать с кучей объектов, вы можете перечислить весь объект и действовать на каждый отдельный объект. Сначала вы должны найти метод, который вы использовали бы, чтобы остановить один процесс.

Get-Process | Get-Member -MemberType Method

Совершенно, похоже, мы можем использовать метод Kill, а затем пропустить в ForEach-Object, чтобы убить их всех.
Совершенно, похоже, мы можем использовать метод Kill, а затем пропустить в ForEach-Object, чтобы убить их всех.

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

Здесь мы взяли все объекты процесса, возвращаемые Get-Process, и передали их командлету ForEach-Object. Подобно командлету Where-Object, мы представляли каждый объект в конвейере с $ , который мы могли вызвать для метода Kill (). При всем том, что сказано и сделано, перечисление коллекции происходит намного медленнее, чем приведенные выше методы, и ее следует использовать только в качестве последнего результата.
Здесь мы взяли все объекты процесса, возвращаемые Get-Process, и передали их командлету ForEach-Object. Подобно командлету Where-Object, мы представляли каждый объект в конвейере с $ , который мы могли вызвать для метода Kill (). При всем том, что сказано и сделано, перечисление коллекции происходит намного медленнее, чем приведенные выше методы, и ее следует использовать только в качестве последнего результата.

Резюме

Выбор один

Get-Process -Name notepad | Stop-Process

Выбор второй

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

Выбор третий

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

Вот и все на этот раз люди, увидев вас на следующей неделе для большего удовольствия PowerShell.

Рекомендуемые: