If-Koubou

Geek School: Praca z kolekcjami w PowerShell

Geek School: Praca z kolekcjami w PowerShell (Jak)

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ń cmdlet w PowerShell
  • Nauka korzystania z obiektów w PowerShell
  • Nauka formatowania, filtrowania i porównywania w PowerShell
  • Naucz się korzystać z Remotingu w PowerShell
  • Używanie PowerShell do uzyskiwania informacji o komputerze

I pozostańcie czujni przez resztę serii przez cały tydzień.

Używanie poleceń cmdletu wsadowego

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 -Name Notatnik | Zatrzymaj proces

To zabiłoby dowolny 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 [], a gdy zobaczysz typ, po którym następują dwa nawiasy kwadratowe, oznacza to, że parametr akceptuje jeden lub więcej poprzedniego typu. W takim przypadku akceptuje jeden lub więcej obiektów procesu. Z technicznego punktu widzenia możemy powiedzieć, że cmdlet InputObject akceptuje proces szyk. Ilekroć masz cmdlet, który obsługuje operacje wsadowe w ten sposób, użyj go. To jest numer jeden.

Korzystanie z WMI

Chociaż WMI nie jest najlepszą technologią dostarczaną z centrali 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ż kwerenda WMI zwraca swój własny rodzaj obiektu, należy poszukać metody, która może zatrzymać proces, więc przepuszcza 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

Jeśli nie powiodą się pozostałe dwie metody, 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.

Get-Process | Metoda Get-Member -MemberType

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

Get-Process -Name Notatnik | 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.

streszczenie

Wybór pierwszy

Get-Process -Name Notatnik | Zatrzymaj proces

Choice Two

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

Wybór Trzy

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

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