Geek School: Работа с колекции в PowerShell

Съдържание:

Geek School: Работа с колекции в PowerShell
Geek School: Работа с колекции в PowerShell

Видео: Geek School: Работа с колекции в PowerShell

Видео: Geek School: Работа с колекции в PowerShell
Видео: PS3 #2: The Undead - YouTube 2024, Ноември
Anonim
Тъй като PowerShell се основава на.Net Framework и включва различни други технологии като WMI и CIM, винаги има повече от един начин да се постигне едно и също нещо. Елате при нас за този кратък пост, където се учим как да изберем най-добрия метод за изпълнение на нашите задачи.
Тъй като PowerShell се основава на.Net Framework и включва различни други технологии като WMI и CIM, винаги има повече от един начин да се постигне едно и също нещо. Елате при нас за този кратък пост, където се учим как да изберем най-добрия метод за изпълнение на нашите задачи.

Не забравяйте да прочетете предишните статии в серията:

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

И останете настроени за останалата част от серията през цялата седмица.

Използване на партидни пакети

По-рано в поредицата, когато ви запознахме с тръбопровода, ви показахме как можете да вземете предметите, които извеждате от една cmdlet и да ги предадете като вход към друга cmdlet, като използвате нещо подобно:

Get-Process -Name notepad | Stop-Process

Това би убило всеки процес с името "бележник". Но вие вероятно се чудите как PowerShell може да убие всеки случай на бележник с една команда. Отговорът се крие в помощта на cmdlet за спиране на процеса.

help Stop-Process –Full

Image
Image

Ако погледнете последния ред от кода в секцията за синтаксис, можете да видите, че параметърът InputObject приема обект от типа Process и когато видите тип, последван от две квадратни скоби, това означава, че параметърът приема едно или повече от предходния тип. В този случай тя приема един или повече обекта на процеса. Технически, бихме казали, че InputObject cmdlet приема процес масив, Всеки път, когато имате cmdlet, който поддържа партидните операции по този начин, използвайте го. Това е избор номер едно.

Използване на WMI

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

Get-WmiObject –Class Win32_Process

Тъй като заявката за WMI връща свой собствен вид обект, ще трябва да потърсите метод, който може да спре процеса, така че позволява тръба, която да се получи член.
Тъй като заявката за WMI връща свой собствен вид обект, ще трябва да потърсите метод, който може да спре процеса, така че позволява тръба, която да се получи член.

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

Перфектно, изглежда, че можем да използваме метода "Убий" и след това да преминем в ForEach-Object, за да ги убием всички.
Перфектно, изглежда, че можем да използваме метода "Убий" и след това да преминем в ForEach-Object, за да ги убием всички.

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

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

резюме

Избор 1

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 забавно.

Препоръчано: