Jak za pomocą Windows PowerShell uzyskać listę wszystkich okien otwartych na danym komputerze?
Skrypciarze odpowiadają na Wasze pytania
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy. |
Jak za pomocą Windows PowerShell uzyskać listę wszystkich okien otwartych na danym komputerze?
Cześć, Skrypciarze! Jak za pomocą Windows PowerShell uzyskać listę wszystkich okien otwartych na danym komputerze?
-- JD
Cześć, JD. Jasne, że tak. Ale najpierw chcielibyśmy pogratulować Peterowi Costantini, najstarszemu z żyjących Skrypciarzy. Peter, znany jako autor artykułów z serii dr. Scripto’s Script Shop (j.ang.) i z tego, że śpiewa na webcastach, awansował niedawno na stanowisko menedżera programu w dziale Management Practices firmy Microsoft. Peter nie przestanie być Skrypciarzem, ale niestety nie będzie mógł już poświęcać tyle czasu na tworzenie skryptów i pisanie artykułów.
Tak więc serdecznie gratulujemy Peterowi i życzymy mu powodzenia. Aby go uhonorować, przypomnijmy jego najwspanialsze momenty w pracy Skrypciarza:
- Parę tygodni temu na przykład – chociaż nie, to Dean to zrobił.
- Ale za to jakiś rok temu – a zresztą nieważne, to chyba Jean napisała.
- No ale na pewno – no dobra. Ale gdyby nie podpalił biura, to skrypt byłby całkiem niezły.
I całe mnóstwo wspaniałych osiągnięć, których nie wymienimy z braku miejsca.
Uwaga!
Jak się domyślacie, prawdziwy wkład Petera w rozwój skrypciastwa i Centrum Skryptów nie daje się zmierzyć tylko liczbą roboczogodzin. Tak przynajmniej utrzymuje sam zainteresowany.
Z drugiej jednak strony, wszystkie te lata spędzone siedzeniem na czterech literach i nie robieniem niczego konkretnego okazały się świetną praktyką przed zajęciem pozycji menedżerskiej w firmie Microsoft.
Szczerze mówiąc, pierwszą reakcją Skrypciarzy na wiadomość, że Peter odchodzi, było wpadnięcie w depresję. Ale Peter nie chciałby, abyśmy się załamali, Musimy radzić sobie bez niego. Zatem, Peter, specjalnie dla Ciebie:
Get-Process | Where-Object {$_.MainWindowTitle -ne ""} | Select-Object MainWindowTitle
Jak widać, skrypt jest krótki i prosty. Zaczynamy od polecenia (polecenia PowerShell zwane są „Cmdlet”) Get-Process, które – jak wskazuje nazwa – pobiera kolekcję wszystkich procesów uruchomionych na komputerze. Jednak oczywiście nie interesują nas wszystkie procesy uruchomione na komputerze – kolekcja taka zawiera przecież także usługi i programy, których nie widać na ekranie. Dlatego korzystamy z filtru Where-Object, dzięki czemu z kolekcji odrzucamy wszystkie procesy, których właściwość MainWindowTitle jest pusta.
Uwaga!
Tak, w Windows PowerShell używa się operatora –ne zamiast < >. To, czy operator ów się nam podoba, to zupełnie inna sprawa.
Co w ten sposób uzyskujemy? Otóż uzyskujemy listę procesów działających w widocznym oknie (pusta właściwość MainWindowTitle oznacza, że okno jest niewidoczne). Następnie używamy przefiltrowanej kolekcji w poleceniu Select-Object i wyświetlamy jedynie wartości MainWindowTitle:
MainWindowTitle
---------------
open_windows.ps1 - Notepad
Inbox - Microsoft Outlook
Windows PowerShell
more_hey_scripting_guy.doc - Microsoft Word
Warto zauważyć, że właściwości MainWindowTitle nie znajdziemy w klasie Win32_Process usługi WMI. Polecenie Get-Process nie używa WMI do pobrania informacji o procesach, używając do tego klasy .NET System.Diagnostics.Process.
Niestety polecenie to ma pewną wadę: nie podaje ono informacji o oknach Eksploratora Windows (np. okna folderu C:\Scripts). Ale taki problem to nie problem – tu mamy inny skrypt, który to załatwi:
$a = New-Object -com "Shell.Application"; $b = $a.windows() | select-object LocationName; $b
Tworzymy tu wystąpienie obiektu Shell.Application za pomocą polecenia New-Object. Wywołujemy metodę Windows(), która pobiera nam kolekcję okien Shell (powłoki), a następnie używając polecenia Select-Object wyświetlamy wartość właściwości LocationName. Dzieki temu uzyskamy listę tego typu:
LocationName
------------
Stuff
Hey Scripting Guy
Scripts
Możemy też wyświetlić właściwość LocationURL, co da nam kompletne ścieżki dostępu. W takim wypadku należałoby najpierw oczyścić informacje, które otrzymujemy w takiej formie:
C:/Documents%20and%20Settings/kenmyer/Desktop/Stuff/Hey%20Scripting%20Guy
Mamy odpowiednie polecenie (j.ang.), które może nam się do tego przydać.
Mamy nadzieję, że o coś takiego Ci chodziło, JD. Gdyby ktoś się zastanawiał: nawet przez myśl nam nie przeszło, by pozbawiać Petera tytułu Skrypciarza po przyjęciu nowego stanowiska. Nie moglibyśmy tego zrobić – w końcu miał on nadzwyczajny wkład w rozwój skryptów i mamy nadzieję, że nie przerwie on pracy w tym kierunku.
Poza tym, gdybyśmy wyrzucili go z naszego klubu, najstarszym żyjącym Skrypciarzem zostałby Greg, a on wcale nie chce się na to zgodzić. Widzisz więc, Peter, że chociaż lubimy ci dokuczać i robić na złość, to masz w zespole bardzo ważne zadanie do wypełnienia. To się nigdy nie zmieni.
Do początku strony |