Główna » jak » Geek School Praca z kolekcjami w PowerShell

    Geek School Praca z kolekcjami w PowerShell

    Ponieważ PowerShell jest oparty 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ń.

    Zapoznaj się z poprzednimi artykułami 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
    • Korzystanie z PowerShell w celu uzyskania 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 pobierać 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 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 [], 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. Technicznie powiedzielibyśmy, ż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, musisz poszukać metody, która może zatrzymać proces, więc przeprowadźmy ją 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 możesz 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.