Geek School Работа с коллекциями в PowerShell
Поскольку PowerShell основан на .Net Framework и включает в себя различные другие технологии, такие как WMI и CIM, всегда есть несколько способов сделать то же самое. Присоединяйтесь к нам в этом коротком посте, где мы узнаем, как выбрать лучший метод для решения наших задач..
Обязательно прочитайте предыдущие статьи серии:
- Узнайте, как автоматизировать Windows с помощью PowerShell
- Учимся использовать командлеты в PowerShell
- Изучение, как использовать объекты в PowerShell
- Обучение форматированию, фильтрации и сравнению в PowerShell
- Научитесь использовать Remoting в PowerShell
- Использование PowerShell для получения информации о компьютере
И оставайтесь с нами до конца сериала всю неделю.
Использование командных командлетов
Ранее в этой серии, когда мы познакомили вас с конвейером, мы показали, как вы можете взять объекты, которые выводит один командлет, и передать их в качестве входных данных другому командлету, используя что-то вроде этого:
Get-Process -Name блокнот | Stop-Process
Это убило бы любой процесс с именем «блокнот». Но вам, вероятно, интересно, как PowerShell может уничтожить каждый экземпляр блокнота с помощью одной команды. Ответ заключается в помощи командлета Stop-Process..
помочь Stop-Process -Full
Если вы посмотрите на последнюю строку кода в разделе синтаксиса, вы увидите, что параметр InputObject принимает объект типа Process [], и всякий раз, когда вы видите тип, за которым следуют две квадратные скобки, как это, это означает, что параметр принимает один или больше предыдущего типа. В этом случае он принимает один или несколько объектов процесса. Технически, мы бы сказали, что командлет InputObject принимает процесс массив. Когда у вас есть командлет, который поддерживает пакетные операции таким образом, используйте его. Это выбор номер один.
Использование WMI
Хотя WMI - не лучшая технология для поставки из штаб-квартиры Microsoft, она занимает второе место в списке того, как работать с коллекциями объектов. Мы могли бы легко получить список запущенных процессов из класса Win32_Process следующим образом:
Get-WmiObject -Class Win32_Process
Поскольку запрос WMI возвращает объект своего вида, вам нужно будет найти метод, который может остановить процесс, поэтому давайте передадим его в Get-Member..
Get-WmiObject -Class 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. Подобно командлету Where-Object, мы представляли каждый объект в конвейере с помощью $ _, который мы смогли вызвать для метода Kill (). Учитывая все сказанное и сделанное, перечисление коллекции происходит намного медленнее, чем приведенные выше методы, и должно использоваться только в качестве последнего результата..
Резюме
Выбор Один
Get-Process -Name блокнот | Stop-Process
Выбор Два
Get-WmiObject -Class Win32_Process -Filter «name = 'notepad.exe'» | Invoke-WmiMethod -Name Terminate
Выбор Три
Get-Process -Name блокнот | ForEach-Object -Process $ _. Kill ()
Вот и все на этот раз, ребята, увидимся на следующей неделе, чтобы узнать больше о PowerShell.