Adam the Automator

Używanie PowerShella do ustawiania zmiennych środowiskowych systemu Windows, odczytywania zmiennych środowiskowych i tworzenia nowych zmiennych środowiskowych jest łatwe, gdy tylko poznasz sztuczki. Sztuczki, których nauczysz się w tym artykule, będą działać dla zmiennych środowiskowych Windows 10, jak również dla każdego klienta/serwera Windows po Windows 7 SP1/Windows Server 2008.

PowerShell zapewnia wiele różnych sposobów interakcji ze zmiennymi środowiskowymi Windows z poziomu $env: PSDrive. rejestru oraz klasy .NET. Dowiesz się o każdej z metod, w tym zrozumiesz zakres zmiennych środowiskowych w tym krok po kroku walkthrough.

Table of Contents

Założenia

Przez cały ten artykuł będę używał Windows PowerShell 5.1 w systemie Windows 10. Jeśli jednak posiadasz jakąkolwiek wersję Windows PowerShell późniejszą niż v3 na Windows 7 SP1 lub nowszym, techniki, które zamierzam Ci pokazać powinny działać bez zarzutu.

Co to są zmienne środowiskowe?

Zmienne środowiskowe, jak sama nazwa wskazuje, przechowują informacje o środowisku, które jest używane przez Windows i aplikacje. Do zmiennych środowiskowych mogą mieć dostęp aplikacje graficzne, takie jak Eksplorator Windows, edytory tekstowe, takie jak Notatnik, a także cmd.exe i PowerShell.

Używanie zmiennych środowiskowych pozwala uniknąć twardego kodowania ścieżek do plików, nazw użytkowników lub komputerów i wielu innych informacji w skryptach lub modułach PowerShell.

Wspólne zmienne środowiskowe

Podczas poznawania metod pracy ze zmiennymi środowiskowymi w PowerShell natkniemy się na wiele różnych zmiennych. Niektóre z nich są bardziej użyteczne niż inne. Poniżej znajduje się lista niektórych z popularnych zmiennych środowiskowych i ich wykorzystanie dla odniesienia.

Zmienna Usage
ClientName Nazwa zdalnego komputera połączonego przez sesję Remote Desktop.
SessionName Pomaga określić, czy bieżąca sesja systemu Windows jest uważana przez system operacyjny za uruchomioną w konsoli. W przypadku sesji konsolowych SessionName będzie miało wartość „Console”. Połączenia Enhanced Session z maszynami wirtualnymi Hyper-V nie zgłaszają SessionName jako 'Console', podczas gdy Standard Sessions tak.
ComputerName Nazwa komputera.
SystemRoot i Windir Ścieżka do bieżącej instalacji systemu Windows.
ProgramFiles i ProgramFiles(x86) Domyślne lokalizacje dla programów x64 i x86.
ProgramW6432 Domyślna lokalizacja dla programów, unikająca przekierowania 32/64 bitów. Ta zmienna ma zastosowanie tylko dla procesów 32-bitowych działających na platformie 64-bitowej. Oznacza to, że można jej użyć do zidentyfikowania, kiedy 32-bitowa instancja PowerShell jest uruchomiona na systemie 64-bitowym.
UserDNSDomain W pełni kwalifikowana nazwa domeny Active Directory, do której zalogował się bieżący użytkownik. Występuje tylko w przypadku logowań domenowych.
UserDomain Nazwa w stylu NETBIOS domeny, do której zalogował się bieżący użytkownik. Może być nazwą komputera, jeśli nie ma domeny.
UserDomainRoamingProfile Lokalizacja centralnej kopii profilu roamingowego dla użytkownika, jeśli istnieje. Występuje tylko w przypadku logowań domenowych.
UserName Nazwa aktualnie zalogowanego użytkownika.
UserProfile Lokalizacja profilu bieżącego użytkownika na komputerze lokalnym.

Zakresy zmiennych środowiskowych

Są trzy zakresy zmiennych środowiskowych. Pomyśl o zakresach jak o warstwach zmiennych, które budują się, aby dać całkowity obraz. Łącznie, te „warstwy” dostarczają wielu różnych zmiennych środowiskowych dla każdego uruchomionego procesu w Windows.

Zakres zmiennych środowiskowych „Hierarchia”

Każda z tych „warstw” albo się łączy, albo nadpisuje jedna drugą. Są one zdefiniowane w hierarchii jak: maszyna -> użytkownik -> proces z każdą zmienną zakresu nadpisującą zmienną nadrzędną, jeśli taka istnieje w zakresie nadrzędnym.

Na przykład, powszechną zmienną środowiskową jest TEMP. Ta zmienna przechowuje ścieżkę do lokalnego folderu tymczasowego systemu Windows. Ta zmienna środowiskowa jest ustawiona na:

Jeśli nie ma TEMP zmiennej środowiskowej ustawionej w zakresie użytkownika, wtedy wynik końcowy będzie C:\WINDOWS\TEMP.

Typy zakresów zmiennych środowiskowych

W systemie Windows istnieją trzy różne zakresy zmiennych środowiskowych.

Maszyna

Zmienne środowiskowe w zakresie maszyny są związane z działającą instancją systemu Windows. Każde konto użytkownika może je odczytać, ale ich ustawienie, zmiana lub usunięcie wymaga podwyższonych uprawnień.

Użytkownik

Zmienne środowiskowe w zakresie użytkownika są związane z użytkownikiem uruchamiającym bieżący proces. Zmienne użytkownika nadpisują zmienne o tej samej nazwie w zakresie maszynowym.

Uwaga: Microsoft zaleca, aby wartości zmiennych środowiskowych w zakresie maszynowym i użytkownika nie zawierały więcej niż 2048 znaków.

Proces

Zmienne środowiskowe w zakresie procesu są kombinacją zakresu maszyny i użytkownika, wraz z niektórymi zmiennymi, które Windows tworzy dynamicznie.

Poniżej znajduje się lista zmiennych środowiskowych dostępnych dla uruchomionego procesu. Wszystkie te zmienne są tworzone dynamicznie.

  • ALLUSERSPROFILE
  • APPDATA
  • COMPUTERNAME
  • HOMEDRIVE
  • LOCALAPPDATA
  • LOGONSERVER
  • PROMPT
  • PUBLIC
  • SESSION
  • SystemDrive
  • SystemRoot
  • USERDNSDOMAIN
  • USERDOMAIN
  • USERDOMAIN_ROAMINGPROFILE
  • USERNAME
  • USERPROFILE

Zmienne środowiskowe w rejestrze

Zmienne środowiskowe są przechowywane w dwóch lokalizacjach rejestru, jednej dla zakresu użytkownika i jednej dla zakresu maszyny.

Nie używaj rejestru do zarządzania zmiennymi środowiskowymi

Jest pewien haczyk przy dokonywaniu zmian w zmiennych w rejestrze. Żaden z uruchomionych procesów nie zobaczy zmian zmiennych w rejestrze. Procesy widzą tylko te zmienne i wartości w rejestrze, które były obecne w momencie uruchomienia procesu, chyba że Windows powiadomi je, że nastąpiła zmiana.

Zamiast modyfikować rejestr bezpośrednio, można użyć klasy .NET. Klasa .NET może modyfikować zmienne środowiskowe dotyczące maszyny i użytkownika oraz wykonywać za Ciebie prace porządkowe w rejestrze.

Modyfikowanie zmiennych środowiskowych bezpośrednio w rejestrze, choć możliwe, nie ma sensu. Klasa .NET oferuje prostsze, wspierane przez Microsoft podejście. Dowiesz się, jak używać klasy .NET w dalszej części artykułu.

Lokalizacje zmiennych środowiskowych w rejestrze i ich wyszukiwanie

Mam nadzieję, że zostałeś przekonany, aby nie modyfikować rejestru bezpośrednio, ale jeśli chciałbyś zerknąć, co tam jest, możesz znaleźć wszystkie zmienne środowiskowe użytkownika w kluczu HKEY_CURRENT_USER\Environment. Zmienne środowiskowe dotyczące maszyn są przechowywane w HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.

Wewnątrz każdego z tych kluczy znajdują się wartości rejestru typu REG_SZ lub REG_EXPAND_SZ. Wartości REG_EXPAND_SZ zawierają zmienne środowiskowe osadzone jako część ich wartości. Te zmienne środowiskowe są interpretowane, gdy wartość jest pobierana.

Aby to zademonstrować, użyj narzędzia REG. Jest to małe narzędzie wiersza poleceń dołączone do systemu Windows.

Zapytaj o zmienną środowiskową TEMP jak widać poniżej. Uruchom REG z parametrem QUERY, aby pobrać wartość zmiennej TEMP.

> REG QUERY HKCU\Environment /V TEMPHKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp

Czasami można zauważyć zmienne środowiskowe wyświetlane w otoczeniu symboli procentowych (%COMPUTERNAME%) jak powyżej. Jest to stary, szkolny sposób wyświetlania zmiennych środowiskowych za pomocą cmd.exe i plików wsadowych. Wiedz, że PowerShell nie rozpoznaje tego formatu.

Narzędzie REG pozwala nam zobaczyć natywną wartość wartości rejestru. Typ wartości to REG_EXPAND_SZ a wartość zawiera zmienną środowiskową %USERPROFILE%.

Jeśli wolisz użyć PowerShell, aby pobrać wartość rejestru, możesz to zrobić za pomocą Get-Item cmdlet, jak pokazano poniżej.

Przeglądanie i ustawianie zmiennych środowiskowych systemu Windows za pomocą graficznego interfejsu użytkownika

Aby zobaczyć graficzny widok zmiennych środowiskowych użytkownika i systemu, należy uruchomić program SystemPropertiesAdvanced.exe z PowerShella, wiersza poleceń lub z klawisza Windows+R, aby wyświetlić zakładkę Zaawansowane właściwości systemu. Kliknij przycisk EnvironmentVariables, który jest zaznaczony na poniższym obrazku.

Okno dialogowe Właściwości systemu, karta Zaawansowane

Okno dialogowe Zmienne środowiskowe, pokazane poniżej, umożliwia wyświetlanie, tworzenie i modyfikowanie zmiennych środowiskowych użytkownika i maszynowych. Zwróć uwagę, że w oknie dialogowym zmienne maszynowe są określane jako zmienne systemowe.

Okno dialogowe zmiennych środowiskowych

Mając już pojęcie o zmiennych środowiskowych, przejdźmy do tego, po co tu jesteś, czyli do zarządzania nimi za pomocą PowerShella!

Istnieje kilka różnych sposobów na interakcję ze zmiennymi środowiskowymi przy użyciu PowerShell.

  • The Env: PSDrive i Provider – oparte na sesji. Ustawia wartości zmiennych środowiskowych tylko dla bieżącej sesji PowerShell
  • $env: zmienne – oparte na sesji. Ustawia wartości zmiennych środowiskowych tylko dla bieżącej sesji PowerShell
  • The Klasa .NET – pozwala na utrzymywanie zmiennych środowiskowych użytkownika i zmiennych systemowych w ramach sesji i restartów

The Env: PSDrive i Provider

Jednym z najlepszych sposobów odczytywania zmiennych środowiskowych jest koncepcja PowerShell znana jako dyski PowerShell (dyski PS). Napęd PS pozwala traktować zmienne środowiskowe tak, jakby były systemem plików poprzez napęd Env:.

Przełączanie na napęd Env:

Jak do wszystkich napędów PS, odwołujesz się do niego poprzez ścieżki takie jak Env:\TEMPEnv:\COMPUTERNAME, itd. Ale aby zaoszczędzić trochę naciśnięć klawiszy, przełącz się na napęd Env: tak jak na każdy napęd systemu plików, jak pokazano poniżej.

PS51> cd Env:PS51 Env:\>## orPS51> Set-Location Env:PS Env:\>

Uzupełnianie tabulatorów za pomocą napędu Env:

Możesz użyć tych samych poleceń, których użyłbyś, aby uzyskać dostęp do systemu plików, takich jak Get-Item i Get-ChildItem, aby uzyskać dostęp do zmiennych środowiskowych. Ale zamiast systemu plików czytamy dysk Env:.

Ponieważ zmienne środowiskowe są przechowywane w dysku PS, można użyć funkcji uzupełniania tabulatorów w PowerShell, aby przejść przez dostępne zmienne, jak pokazano poniżej.

Env: tab completion – znajdowanie zmiennych środowiskowych zaczynających się od litery C

Przejdźmy teraz do kilku przykładów, jak można wykorzystać dysk Env: PS do pracy ze zmiennymi środowiskowymi.

Wypisywanie zmiennych środowiskowych za pomocą Env:

PS51> Get-Item -Path Env:PS51> Get-Item -Path Env:USERNAME

Listing Environment Variables Using a Wildcard with Env:

PS51> Get-Item -Path Env:user*

Finding Environment Variable Values with Env:

Wynikiem tych poleceń są obiekty klucz/wartość .NET. Obiekty te przechowują nazwę zmiennej środowiskowej we właściwości Name oraz wartość we właściwości Value.

Możesz uzyskać dostęp do określonej wartości zmiennej środowiskowej, zawijając odwołanie do polecenia Get-Item w nawiasy i odwołując się do właściwości Value, jak pokazano poniżej:

PS51> (Get-Item -Path Env:computername).ValueMYCOMPUTERHOSTNAME

W sytuacjach, gdy trzeba zwrócić tylko określone zmienne środowiskowe, należy użyć standardowych cmdletów PowerShell, takich jak Select-Object i Where-Object, aby wybrać i przefiltrować obiekty zwracane przez dostawcę Env:.

W poniższym przykładzie zwracana jest tylko zmienna środowiskowa COMPUTERNAME.

PS51> Get-ChildItem -Path Env: | Where-Object -Property Name -eq 'COMPUTERNAME'

Jako alternatywnej metody należy użyć cmdletu Get-Content. Ten cmdlet zwraca obiekt zawierający wartość zmiennej środowiskowej. Ten obiekt jest prostszy w obsłudze, ponieważ zwraca tylko wartość, a nie obiekt z właściwościami Name i Value.

PS51> Get-Content -Path Env:\COMPUTERNAME

Demo: Inserting Environment Values in a String

Używając Get-Content, możesz znaleźć wartość zmiennej środowiskowej i wstawić COMPUTERNAME zmienną środowiskową, na przykład, do ciągu tekstowego.

PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)Computer Name is: MYCOMPUTER

Ustawianie zmiennej środowiskowej (I tworzenie) za pomocą Env:

Tworzyć nowe zmienne środowiskowe za pomocą PowerShell przy użyciu cmdletu New-Item. Podaj nazwę zmiennej środowiskowej w postaci Env:\<EnvVarName> dla wartości Name oraz wartość zmiennej środowiskowej dla parametru Value jak pokazano poniżej.

PS51> New-Item -Path Env:\MYCOMPUTER -Value MY-WIN10-PCName Value---- -----MYCOMPUTER MY-WIN10-PC

Użyj cmdletu Set-item, aby ustawić zmienną środowiskową lub utworzyć nową, jeśli jeszcze nie istnieje. Poniżej możesz zobaczyć, jak za pomocą cmletu Set-Item możesz zarówno utworzyć, jak i zmodyfikować zmienną środowiskową.

PS51> Set-Item -Path Env:testvariable -Value "Alpha"

Kopiowanie zmiennej środowiskowej za pomocą Env:

Czasami pojawia się sytuacja, że trzeba powielić wartość zmiennej środowiskowej. Można to zrobić za pomocą cmdletu Copy-Item.

Poniżej widać, że wartość zmiennej COMPUTERNAME jest kopiowana do MYCOMPUTER, nadpisując jej istniejącą wartość.

Usuwanie zmiennej środowiskowej za pomocą Env:

Pojawiają się sytuacje, w których zmienna środowiskowa nie jest już potrzebna. Zmienne środowiskowe można usunąć za pomocą jednej z trzech metod:

  • Użyj polecenia Set-Item cmdlet, aby ustawić zmienną środowiskową na pustą wartość
PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''

  • Użyj polecenia Remove-Item cmdlet.
PS51> Remove-Item -Path Env:\MYCOMPUTER
  • Użyj Clear-Item cmdlet.
PS51> Clear-Item -Path Env:\MYCOMPUTER

Zmiana nazwy zmiennej środowiskowej za pomocą Env:

W sytuacjach, gdy nazwa zmiennej środowiskowej musi zostać zmieniona, masz możliwość zmiany nazwy, zamiast usuwania i ponownego tworzenia za pomocą Env: dostawcy.

Użyj Rename-Item cmdlet, aby zmienić nazwę zmiennej środowiskowej, zachowując jednocześnie jej wartość. Poniżej możesz zobaczyć, że zmienna MYCOMPUTER została przemianowana na OLDCOMPUTER przy jednoczesnym zachowaniu jej wartości.

$Env: Zmienne

Po opanowaniu napędu Env: do traktowania zmiennych środowiskowych jako plików, ta sekcja pokazuje, jak traktować je jako zmienne. Innym sposobem na zarządzanie zmiennymi środowiskowymi w sesji jest użycie Parsera wyrażeń PowerShell. Ta funkcja pozwala na użycie zakresu $Env: w celu uzyskania dostępu do zmiennych środowiskowych.

Uzyskanie zmiennej środowiskowej za pomocą $Env:

Używając zakresu $Env, możesz odwoływać się bezpośrednio do zmiennych środowiskowych bez użycia polecenia jak Get-Item jak pokazano poniżej.

PS51> $env:computername

Ta metoda ułatwia wstawianie zmiennych środowiskowych do ciągów znaków, jak poniżej:

Ustawianie lub tworzenie zmiennej środowiskowej za pomocą $Env:

Ustawienie zmiennej środowiskowej za pomocą tej metody jest proste. Spowoduje to również utworzenie nowej zmiennej środowiskowej, jeśli taka jeszcze nie istnieje, jak poniżej.

PS51> $env:testvariable = "Alpha"

Użyj składni += aby dodać do istniejącej wartości, zamiast ją nadpisywać.

PS51> $env:testvariable = "Alpha"PS51> $env:testvariable += ",Beta"PS51> $env:testvariableAlpha,Beta

Usuwanie zmiennej środowiskowej za pomocą $Env:

Aby usunąć zmienną środowiskową za pomocą tej metody, wystarczy ustawić jej wartość na pusty ciąg znaków.

PS51> $env:testvariable = ''

Używanie klasy .NET

Klasa .NET oferuje metody uzyskiwania i ustawiania zmiennych środowiskowych również. Jest to jedyna metoda, aby uzyskać bezpośredni dostęp do różnych zakresów środowiskowych i ustawić zmienne środowiskowe, które przetrwają przez sesje PowerShell.

W każdym z poniższych przykładów, jeśli nie podano zakresu, przyjmuje się zakres procesu.

Podczas używania , będziesz używał kilku różnych metod klasy statycznej .NET. Nie musisz rozumieć, czym jest metoda statyczna. Musisz jedynie zrozumieć, że aby użyć którejkolwiek z technik, których się nauczysz, musisz najpierw odwołać się do klasy (), a następnie do dwóch dwukropków (::), a następnie do metody.

Wyświetlanie zmiennych środowiskowych z

Jeśli chciałbyś zobaczyć wszystkie zmienne środowiskowe w określonym zakresie, użyłbyś metody GetEnvironmentVariables. Ta metoda zwraca wszystkie zmienne środowiskowe w zakresie określonym jako argument metody (w nawiasach).

Pobieranie pojedynczych zmiennych środowiskowych za pomocą

Jeśli potrzebujesz znaleźć konkretną zmienną środowiskową, możesz to zrobić na dwa różne sposoby.

  • GetEnvironmentVariables().<var name> – niezalecane
  • GetEnvironmentVariable('<var name>','<scope>')

GetEnvironmentVariables()

Używając metody GetEnvironmentVariables(), używasz notacji kropkowej do odwołania się do wartości. Zawieramy klasę i statyczne odwołanie do metody w nawiasie, po którym następuje kropka, a następnie nazwa zmiennej środowiskowej, jak poniżej:

PS51> (::GetEnvironmentVariables()).APPDATA

Uwaga, że kiedy odwołujemy się do zmiennych środowiskowych w ten sposób, musimy upewnić się, że zgadzamy się z wielkością liter! W powyższym przykładzie spróbuj odwołać się do zmiennej APPDATA używając appdata. Zamiast tego użyj GetEnvironmentVariable().

GetEnvironmentVariable()

Zamiast używać metody GetEnvironmentVariables(), zamiast tego użyj GetEnvironmentVariable(), aby znaleźć pojedyncze zmienne środowiskowe. Pozwala to obejść problem z wielkimi literami, a także pozwala na określenie zakresu.

Aby użyć tej metody, należy podać nazwę zmiennej środowiskowej oraz zakres, w którym chcemy szukać tej zmiennej oddzielony przecinkami.

Ustawianie zmiennej środowiskowej za pomocą

Użyj metody SetEnvironmentVariable() aby ustawić wartość zmiennej środowiskowej dla podanego zakresu, lub utworzyć nową, jeśli jeszcze nie istnieje.

Podczas ustawiania zmiennych w zakresie procesu, zauważysz, że zakres procesu jest zmienny, podczas gdy zmiany w zakresie użytkownika i maszyny są trwałe.

Uwaga: Wywołanie metody SetEnvironmentVariable z nazwą lub wartością zmiennej o długości 32767 znaków lub większej spowoduje rzucenie wyjątku.

Usuwanie zmiennej środowiskowej za pomocą

Użyj metody SetEnvironmentVariable() , aby usunąć zmienną środowiskową dla podanego zakresu, ustawiając jej wartość na pusty ciąg znaków.

Przydatne zmienne środowiskowe PowerShella

Podobnie jak wiele innych aplikacji Windows, PowerShell posiada pewne własne zmienne środowiskowe. Dwie przydatne zmienne środowiskowe, o których warto wiedzieć to PSExecutionPolicyPreference i PSModulePath.

PSExecutionPolicyPreference

Zmienna środowiskowa PSExecutionPolicyPreference przechowuje bieżącą politykę wykonania PowerShell. Jest ona tworzona, jeśli specyficzna dla sesji polityka wykonywania PowerShell jest ustawiona przez:

  • Uruchomienie cmdleta Set-ExecutionPolicy z parametrem Scope o wartości Process
  • Uruchomienie pliku wykonywalnego powershell.exe w celu uruchomienia nowej sesji, używając parametru linii poleceń ExecutionPolicy do ustawienia polityki dla sesji.

PSModulePath

Zmienna środowiskowa PSModulePath zawiera ścieżkę, którą PowerShell wyszukuje moduły, jeśli nie podamy pełnej ścieżki. Jest ona tworzona podobnie jak standardowa zmienna środowiskowa PATH, z poszczególnymi ścieżkami katalogów oddzielonymi średnikiem.

PS51> $env:PSModulePathC:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

Szybka wskazówka: Podziel każdy katalog, aby uzyskać tablicę łańcuchów, aby przetworzyć każdą ścieżkę indywidualnie za pomocą $env:PSModulePath.split(';')

Podsumowanie

Zmienne środowiskowe są użyteczną metodą uzyskiwania informacji o działającym systemie, lub przechowywania informacji pomiędzy sesjami i restartami. Niezależnie od tego, czy tylko czytasz domyślne zmienne środowiskowe systemu operacyjnego Windows, czy tworzysz własne, możesz teraz zarządzać nimi na wiele sposobów za pomocą PowerShella!

Dalsza lektura

  • about_Environment_Variables
  • Klasa .NET w Microsoft docs
  • Poznaj format łańcuchów w PowerShellu i rozszerzanie łańcuchów

.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *