Geek School Работа с колекции в PowerShell
Тъй като PowerShell се основава на .Net Framework и включва различни други технологии като WMI и CIM, винаги има повече от един начин за постигане на същото. Елате да се присъедините към нас за този кратък пост, където се учим как да изберем най-добрия метод за изпълнение на нашите задачи.
Прочетете предишните статии от поредицата:
- Научете как да автоматизирате Windows с PowerShell
- Научете се да използвате Cmdlets в PowerShell
- Научете как да използвате обекти в PowerShell
- Обучение за форматиране, филтриране и сравняване в PowerShell
- Научете се да използвате Remoting в PowerShell
- Използване на PowerShell за получаване на информация за компютъра
Очаквайте останалата част от поредицата цяла седмица.
Използване на пакетни команди
По-рано в серията, когато ви запознахме с тръбопровода, ви показахме как можете да вземете обектите, които един cmdlet извежда и да ги предавате като вход към друго cmdlet, използвайки нещо подобно:
Get-Process -Name notepad | Стоп-Process
Това би убило всеки процес с името “notepad”. Но вие вероятно се чудите как PowerShell е в състояние да убие всеки екземпляр на Notepad с една команда. Отговорът се крие в помощта на кратката команда Stop-Process.
помощ Stop-Process-Full
Ако погледнете последния ред от кода в синтактичния раздел, можете да видите, че параметърът InputObject приема обект от тип Process [] и всеки път, когато видите тип, последван от две квадратни скоби, това означава, че параметърът приема едно или повече от предходния тип. В този случай той приема един или повече обекти на процеса. Технически, бихме казали, че cmdlet InputObject приема процес масив. Когато имате кратка команда, която поддържа пакетни операции по този начин, използвайте я. Това е избор номер едно.
Използване на WMI
Въпреки че WMI не е най-добрата технология, която се доставя от щаба на Microsoft, тя се появява на второ място в списъка за работа с колекции от обекти. Бихме могли лесно да получим списък от изпълняващи се процеси от класа Win32_Process така:
Get-WmiObject -Class Win32_Process
Тъй като заявката за WMI връща свой собствен обект, ще трябва да потърсите метод, който може да спре процеса, така че позволява на тръбата да стане член..
Get-WmiObject -Class Win32_Process | Get-държава
Изглежда, че най-близкото нещо, което трябва да спрете, е методът за прекратяване, така че трябва да е този. За да извикате метод на WMI обект, просто го пуснете в Invoke-WmiMethod и укажете името на метода..
Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod-име е прекратено
Страхотно, това свърши работата. Всеки път, когато получавате ReturnValue от 0 в WMI, запомнете, че командата е изпълнена успешно.
изброяване
Ако не успеете да се възползвате от другите два метода, ако трябва да направите нещо с куп обекти, можете да изброите целия обект и да действате върху всеки отделен обект. Първо трябва да намерите метода, който ще използвате, за да спрете един процес.
Get-Process | Метод Get-Member -MemberType
Перфектен, изглежда, че можем да използваме метода Kill и след това да вмъкнем ForEach-Object, за да ги убием.
Get-Process -Name notepad | ForEach-Object -Process $ _. Kill ()
Тук взехме всички обекти на процеса, които се върнаха от Get-Process и ги предадохме на командлета ForEach-Object. Подобно на командлета Where-Object, ние представихме всеки обект в тръбопровода с $ _, който успяхме да извикаме към метода Kill () на. С всичко казано и направено, изброяването на колекция е много по-бавно от горните методи и трябва да се използва само като последен резултат.
резюме
Избор едно
Get-Process -Name notepad | Стоп-Process
Избор Две
Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod-име е прекратено
Избор три
Get-Process -Name notepad | ForEach-Object -Process $ _. Kill ()
Това е всичко за хората от това време, ще се видим следващата седмица за по-забавно PowerShell.