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:
I pozostańcie czujni przez resztę serii przez cały tydzień.
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.
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.
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.
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.