Centrum skryptów - Systemy operacyjne

Jak za pomocą Windows PowerShell uzyskać listę wszystkich okien otwartych na danym komputerze?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

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! Pytanie

Cześć, Skrypciarze! Jak za pomocą Windows PowerShell uzyskać listę wszystkich okien otwartych na danym komputerze?

-- JD

Cześć Skrypciarze! Odpowiedź

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 Do początku strony

Centrum skryptów - Systemy operacyjne