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