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 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.
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:\TEMP
Env:\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.
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ącappdata
. Zamiast tego użyjGetEnvironmentVariable()
.
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 parametremScope
o wartościProcess
- 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
.