Centrum skryptów - Systemy operacyjne

Jak pobrać zmienne środowiskowe i ścieżki folderów specjalnych za pomocą programu Windows PowerShell?

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 pobrać zmienne środowiskowe i ścieżki folderów specjalnych za pomocą programu Windows PowerShell?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak pobrać zmienne środowiskowe i ścieżki folderów specjalnych za pomocą programu Windows PowerShell?

-- SB

Cześć Skrypciarze! Odpowiedź

Cześć, SB! Mówią, że z deszczu pod rynnę. W sumie przez całe życie nie rozumiałem tego sformułowania, ale teraz matka natura przyszła mi z pomocą. Jak to możliwe, ze po kilku tygodniach chmur, błocka i deszczu nadszedł czas, kiedy z nadzieją patrzę na termometr i wiatromierz z nadzieją, że temperatura spadnie chociaż o jeden stopień, bo jeżeli chodzi o wiatr, to straciłem już jakąkolwiek nadzieję. Więc siedzę tak, nie mogąc się skupić na skrypcie, nie miałem pojęcia, że słupki rtęci są czymś tak pochłaniającym. Są lepsze od zegarka, serio. Zamiast mówić sobie „zabiorę się do roboty za 10 minut”, mówię sobie: „zabiorę się za robotę, jak temperatura spadnie o tyle i tyle.” Szkoda tylko, że w umowie nie mam wynegocjowanej temperatury, trzeba pamiętać o tym przy przedłużeniu, nie ma co...

Nie, nie użalam się nad sobą, wodę mam podawaną dożylnie tak, żebym rękami mógł spokojnie pisać skrypt, nie sięgając po szklankę (muszę zacząć uprawiać jogę, wtedy po szklankę mógłbym sięgać stopami). To się dopiero nazywa dbałość o pracowników. Więc tak siedzę i siedzę, i myślę sobie, jak odpowiedzieć na pytanie postawione mi przez SB: „Jak pobrać zmienne środowiskowe i ścieżki folderów specjalnych za pomocą programu Windows PowerShell?”

Dla początkujących: zobaczmy, jak możemy pobrać wartości zmiennych środowiskowych. Jak zauważyła SB, w języku VBScript można pobrać wartość zmiennej środowiskowej %logonserver%, używając poniższego kodu:

Set oShell = CreateObject("Wscript.Shell")



Set WshSysEnv = oShell.Environment("PROCESS")

sLogonServer = WshSysEnv("LOGONSERVER")

Jest to zupełnie nieskomplikowane: tworzymy wystąpienie obiektu Wscript.Shell, pobieramy kolekcję zmiennych środowiskowych procesu, następnie przechowujemy wartość na serwerze logowania o bardzo pomysłowej nazwie sLogonServer. Jak zatem uzyskać tę samą informację za pomocą programu PowerShell? Oczywiście w sposób następujący:

$a = $env:logonserver

Wygląda to tak banalnie, ponieważ program Windows PowerShell dysponuje dostawcą środowiska, umożliwiającym błyskawiczny dostęp do zmiennych środowiskowych w komputerze. Jak widać, musimy tylko podać zmienną $env, po której następuje dwukropek oraz nazwa interesującej nas zmiennej środowiskowej. Jeżeli natomiast chcemy przechować wartość zmiennej środowiskowej %username%, posługujemy się następującą składnią:

$a = $env:username

Co, jeśli chcemy znać nazwę komputera? Nic prostszego:

$a = $env:computername

Gdyby nie te upały, to chętnie przesiadywalibyśmy tu pobierając zmienne środowiskowe przez cały dzień...

Można teraz zadać pytanie, co zrobić, jeżeli nie wiemy, jakie zmienne środowiskowe są dostępne na danym komputerze? Na szczęście jest to dość proste do zrobienia – aby przejrzeć wszystkie zmienne środowiskowe oraz ich wartości, używamy poniższego polecenia (zauważcie, że w tym wypadku pomijamy znak $ i odnosimy się do napędu env:):

dir env:

Spróbujcie użyć tego polecenia w programie PowerShell i zobaczcie rezultaty.

Tyle na ten temat, przejdźmy teraz do ścieżek folderów specjalnych. Łatwo to zrobić, używając skryptu VBScript; na przykład poniższy kod pobiera ścieżkę do folderu pulpitu użytkownika:

Set oShell = CreateObject("Wscript.Shell")



Set oSFolders = oShell.SpecialFolders

sDesktop = oSFolders("Desktop")

Widać jak na dłoni, że powyższy skrypt tworzy wystąpienie obiektu Wscript.Shell, tworzy odwołanie obiektowe do kolekcji SpecialFolders, następnie pobiera ścieżkę do folderu pulpitu. By pobrać ścieżkę do folderu pulpitu, moglibyśmy także użyć klasy System.Environment platformy .NET Framework (i metody GetFolderPath). Wziąwszy jednak wszystko pod rozwagę, stwierdzamy niniejszym, że w tym celu łatwiej (i lepiej) jest użyć obiektu Shell.Application:

$a = New-Object –com Shell.Application

$b = ($a.namespace(0x10)).Self.Path

Nie wygląda to już może na bułkę z masłem, trzeba więc pewnie na tym etapie wytłumaczyć działanie powyższych dwóch wierszy. W pierwszym używamy po prostu cmdletu New-Object, który tworzy wystąpienie obiektu COM (stąd właśnie parametr com). A jaki obiekt COM tworzymy? Bingo: Shell.Application.

OK, w porównaniu z tym, co zamierzam tu napisać, powyższe to była rzeczywiście chyba bułka z masłem, ale bez paniki, tylko spokój nas tu może uratować. Drugi wiersz szczeka groźniej niż wyglada, a wyglada bardziej na ratlerka niż pitbulla. Swój groźny wygląd zawdzięcza jedynie temu, że w jednym wierszu wykonujemy jednocześnie kilka zadań. Najpierw przenosimy odwołanie obiektowe do obiektu Shell.Application ($a) i używając metody Namespace, wiążemy je z konkretnym folderem. Właśnie tym zajmuje się następujący fragment kodu:

($a.namespace(0x10))

Czym jest to 0x10? Otóż taką wartość szesnastkową ma folder Pulpit. Skąd o tym wiedzieliśmy? Prawdę mówiąc, nie wiedzieliśmy, tylko rzuciliśmy okiem na stronę [Script Repository (j.ang.)](https://gallery.technet.microsoft.com/scriptcenter), a konkretnie na skrypty folderów specjalnych. Jak się okazuje, skrypt poświęcony tworzeniu listy elementów folderu Pulpit (j.ang.) wygląda tak:

Const DESKTOP = &H10&



Set objShell = CreateObject("Shell.Application")

Set objFolder = objShell.Namespace(DESKTOP)

Set objFolderItem = objFolder.Self

Wscript.Echo objFolderItem.Path



Set colItems = objFolder.Items

For Each objItem in colItems

    Wscript.Echo objItem.Name

Next

Uwaga:

Jeżeli chcecie użyć programu Windows PowerShell, aby wyświetlić wszystkie elementy w folderze Desktop, dodajcie tylko następujący trzeci wiersz do Waszego kodu: Get-ChildItem $b.

 

Zwróćcie uwagę na pierwszy wiersz kodu, w którym przypisujemy naszą szesnastkową wartość &H10& do zmiennej o nazwie Desktop. Wartość &H10& (która używa składni VBScript dla wartości szesnastkowych) reprezentuje folder Desktop; teraz musimy tylko przekonwertować to na 0x10, czyli składnię programu Windows PowerShell dla wartości szesnastkowych. Jeżeli natomiast interesuje nas folder Internet Cookies, wersja kodu dla skryptu VBScript będzie zawierała się w poniższym wierszu:

Const COOKIES = &H21&

Teraz zgadnijcie jaki jest ekwiwalent &H21& w programie PowerShell. Zgadza się, 0x21.

Itp, itd.

Na pewno bardziej spostrzegawczy z Was zauważyli również nawias, pojawiający się podczas przywoływania metody Namespace:

$b = ($a.namespace(0x10)).Self.Path

Skąd się on wziął? Windows PowerShell zawsze zajmuje się fragmentami ujętymi w nawias przed przejściem do innych zadań. Tutaj oznacza to, ze program Windows PowerShell użyje najpierw metody Namespace, aby połączyć się z folderem Desktop. Po wykonaniu tego zadania program PowerShell pobierze wartość właściwości Self.Path, która to jest niczym innym, jak tylko ścieżką do naszego folderu Desktop. Dodanie nawiasu zapewnia nam kolejność wykonywanych zadań – najpierw program Windows PowerShell dostaje się do pulpitu, a dopiero potem zaczyna pobierać ścieżkę.

Może i jest to dość skomplikowane, trzeba tylko pamiętać o jednym: zastępujemy 0x10 odpowiednią wartością i możemy już połączyć się z każdym folderem specjalnym na komputerze.

Mamy nadzieję, że jest to pomocne. Kosztowało nas to bowiem wiele kropli naszego cennego skrypciarskiego potu. Aż zapomniałem spojrzeć na termometr z tego wszystkiego...

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne