11Sep

Geek School: Praca z kolekcjami w PowerShell

Ponieważ PowerShell opiera się na. Net Framework i zawiera różne inne technologie, takie jak WMI i CIM, zawsze istnieje więcej niż jeden sposób na osiągnięcie tego samego. Dołącz do nas na ten krótki post, gdzie dowiadujemy się, jak wybrać najlepszą metodę realizacji naszych zadań.

Przeczytaj poprzednie artykuły z serii:

  • Dowiedz się, jak zautomatyzować system Windows za pomocą programu PowerShell
  • Nauka korzystania z poleceń Cmdlets w programie PowerShell
  • Nauka korzystania z obiektów w programie PowerShell Nauka
  • Formatowanie, filtrowanie i porównywanie w programie PowerShell
  • Naucz się korzystać z usług zdalnego dostępuPowerShell
  • Używanie PowerShell do uzyskiwania informacji o komputerze

Pozostań zestrojony przez resztę serii przez cały tydzień.

Używanie poleceń wsadowych wsadowych

Wcześniej w serii, kiedy wprowadziliśmy cię do potoku, pokazaliśmy ci, jak możesz wziąć obiekty, które wyprowadza jeden cmdlet i przekazać je jako dane wejściowe do innego polecenia cmdlet, używając czegoś takiego:

Get-Process -Nazwa notatnika |Zatrzymaj proces

Zabije każdy proces o nazwie "notatnik".Ale prawdopodobnie zastanawiasz się, w jaki sposób PowerShell może zabić każde wystąpienie notatnika za pomocą jednego polecenia. Odpowiedź leży w pomocy polecenia cmdlet Stop-Process.

pomoc Stop-Process -Full

Jeśli spojrzysz na ostatni wiersz kodu w sekcji składni, zobaczysz, że parametr InputObject akceptuje obiekt typu Process [], i gdy zobaczysz typ, po którym następują dwa nawiasy kwadratowe, takie jakoznacza to, że parametr akceptuje jeden lub więcej z poprzedniego typu. W takim przypadku akceptuje jeden lub więcej obiektów procesu. Technicznie powiedzielibyśmy, że cmdlet InputObject akceptuje proces .Ilekroć masz cmdlet, który obsługuje operacje wsadowe w ten sposób, użyj go. To jest numer jeden.

Korzystanie z usługi WMI

Chociaż usługa WMI nie jest najlepszą technologią dostarczaną z centrali firmy Microsoft, zajmuje drugie miejsce na liście sposobów pracy z kolekcjami obiektów. Możemy łatwo uzyskać listę uruchomionych procesów z klasy Win32_Process, jak na przykład:

Get-WmiObject -Class Win32_Process

Ponieważ zapytanie WMI zwraca swój własny rodzaj obiektu, należy poszukać metody, która może zatrzymać proces, więcprzepuszcza potok do Get-Member.

Get-WmiObject -Class Win32_Process |Get-Member

Wygląda na to, że najbliższą rzeczą do zatrzymania jest metoda zakończenia, więc to musi być ta. Aby wywołać metodę w obiekcie WMI, wystarczy przepuścić ją do Invoke-WmiMethod i podać nazwę metody.

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Zakończ

Świetnie, to wystarczyło. Gdy tylko uzyskasz wartość ReturnValue równą 0 w WMI, pamiętaj, że polecenie zostało wykonane pomyślnie.

Wyliczenie

W przypadku braku innych dwóch metod, jeśli musisz coś zrobić z grupą obiektów, możesz wyliczyć cały obiekt i działać na każdym obiekcie. Najpierw musisz znaleźć metodę, której chcesz użyć do zatrzymania pojedynczego procesu.

Pobierz procesGet-Member -MemberType Metoda

Doskonała, wygląda na to, że możemy użyć metody Kill, a następnie podłączyć do ForEach-Object, aby zabić je wszystkie.

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

Tutaj wzięliśmy wszystkie obiekty procesu zwrócone przez Get-Process i przekazaliśmy je do cmdletu ForEach-Object. Podobnie jak polecenie cmdlet Where-Object, reprezentowaliśmy każdy obiekt w potoku $ _, który mogliśmy wywołać w metodzie Kill() .Przy tym wszystkim, co powiedzieliśmy i zrobiliśmy, wyliczenie kolekcji jest znacznie wolniejsze niż powyższe metody i powinno być używane tylko jako ostatni wynik.

Podsumowanie

Wybór Jeden

Notatnik procesu pobierania danych |Stop-Process

Choice Two

Get-WmiObject -Class Win32_Process -Filter "name =" notepad.exe "" |Invoke-WmiMethod -Name Zakończ

Choice Three

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

To wszystko na ten czas ludzie, do zobaczenia w przyszłym tygodniu po więcej zabawy PowerShell.