Домашняя » как » Geek School Работа с коллекциями в PowerShell

    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.