Articles

O zmiennych środowiskowych

  • 09/22/2020
  • 8 minut na przeczytanie
    • S
    • r
    • s
    • d
    • c
    • +1

Skrócony opis

Opisuje, jak uzyskać dostęp do zmiennych środowiskowych systemu Windows w PowerShell.

DŁUGI OPIS

Zmienne środowiskowe przechowują informacje o środowisku systemu operacyjnego. Informacje te obejmują takie szczegóły, jak ścieżka systemu operacyjnego, liczba procesorów używanych przez system operacyjny oraz lokalizacja folderów tymczasowych.

Zmienne środowiskowe przechowują dane, które są używane przez system operacyjny i inne programy. Na przykład, zmienna środowiskowa WINDIR zawiera lokalizację katalogu instalacyjnego systemu Windows. Programy mogą odpytywać wartość tej zmiennej, aby określić, gdzie znajdują się pliki systemu operacyjnego Windows.

PowerShell może uzyskać dostęp do zmiennych środowiskowych i zarządzać nimi na każdej z obsługiwanych platform systemu operacyjnego. Dostawca środowiska PowerShell upraszcza ten proces, ułatwiając wyświetlanie i zmienianie zmiennych środowiskowych.

Zmienne środowiskowe, w przeciwieństwie do innych typów zmiennych w PowerShell, są dziedziczone przez procesy potomne, takie jak lokalne zadania w tle i sesje, w których działają członkowie modułu. To sprawia, że zmienne środowiskowe dobrze nadają się do przechowywania wartości, które są potrzebne zarówno w procesach rodzica jak i dziecka.

Używanie i zmiana zmiennych środowiskowych

W systemie Windows zmienne środowiskowe mogą być zdefiniowane w trzech zakresach:

  • Zakres maszyny (lub systemu)
  • Zakres użytkownika
  • Zakres procesu

Zakres procesu zawiera zmienne środowiskowe dostępne w bieżącym procesie lub sesji PowerShell. Ta lista zmiennych jest dziedziczona po procesie macierzystym i jest tworzona na podstawie zmiennych z zakresów Machine iUser. Platformy uniksowe mają tylko zakres Process.

Można wyświetlić i zmienić wartości zmiennych środowiskowych bez użycia acmdleta, używając składni zmiennej z dostawcą środowiska. Aby wyświetlić wartość zmiennej środowiskowej, należy użyć następującej składni:

$Env:<variable-name>

Na przykład, aby wyświetlić wartość zmiennej środowiskowej WINDIR, należy wpisać następujące polecenie w wierszu poleceń PowerShell:

$Env:windir

W tej składni znak dolara ($) oznacza zmienną, a nazwa dysku(Env:) oznacza zmienną środowiskową, po której następuje nazwa zmiennej(windir).

Kiedy zmieniasz zmienne środowiskowe w PowerShell, zmiana wpływa tylko na bieżącą sesję. Zachowanie to przypomina zachowanie polecenia Set w powłoce poleceń systemu Windows oraz polecenia Setenv w środowiskach opartych na systemie UNIX. Aby zmienić wartości w zakresach Machine lub User, należy użyć metod klasy System.Environment.

Aby dokonać zmian w zmiennych w zakresie Machine, należy również posiadać uprawnienia. Jeśli spróbujesz zmienić wartość bez wystarczających uprawnień, polecenie zakończy się niepowodzeniem, a PowerShell wyświetli błąd.

Możesz zmienić wartości zmiennych bez użycia cmdleta, używając następującej składni:

$Env:<variable-name> = "<new-value>"

Na przykład, aby dodać ;c:\temp do wartości zmiennej środowiskowej Path, użyj następującej składni:

$Env:Path += ";c:\temp"

W systemach Linux lub macOS, dwukropek (:) w poleceniu oddziela nową ścieżkę od ścieżki, która poprzedza ją na liście.

$Env:PATH += ":/usr/local/temp"

Można również użyć poleceń cmdlet Item, takich jak Set-ItemRemove-Item iCopy-Item do zmiany wartości zmiennych środowiskowych. Na przykład, aby użyć cmdleta Set-Item do dodania ;c:\temp do wartości zmiennej środowiskowej Path, należy użyć następującej składni:

Set-Item -Path Env:Path -Value ($Env:Path + ";C:\Temp")

W tym poleceniu wartość jest ujęta w nawiasy, aby była interpretowana jako jednostka.

Zmienne środowiskowe przechowujące preferencje

Funkcje PowerShell mogą używać zmiennych środowiskowych do przechowywania preferencji użytkownika.Zmienne te działają jak zmienne preferencji, ale są dziedziczone przez sesje potomne sesji, w których zostały utworzone. Aby uzyskać więcej informacji o zmiennych preferencji, zobacz about_preference_variables.

Zmienne środowiskowe, które przechowują preferencje, obejmują:

  • PSExecutionPolicyPreference

    Przechowuje politykę wykonania ustawioną dla bieżącej sesji. Ta zmienna środowiskowa istnieje tylko wtedy, gdy ustawiono politykę wykonania dla pojedynczej sesji. Można to zrobić na dwa różne sposoby.

    • Uruchomienie sesji z wiersza poleceń przy użyciu parametru ExecutionPolicy w celu ustawienia polityki wykonania dla sesji.

    • Użycie polecenia Set-ExecutionPolicy cmdlet. Użyj parametru Scope z wartością „Process”.

      Więcej informacji znajdziesz w about_Execution_Policies.

  • PSModuleAnalysisCachePath

    PowerShell zapewnia kontrolę nad plikiem, który jest używany do buforowania danych o modułach i ich cmdletach. Pamięć podręczna jest odczytywana podczas uruchamiania programu podczas wyszukiwania polecenia i jest zapisywana w wątku tła po zaimportowaniu modułu.

    Domyślna lokalizacja pamięci podręcznej to:

    • Windows PowerShell 5.1: $env:LOCALAPPDATA\Microsoft\Windows\PowerShell
    • PowerShell 6.0 i nowsze: $env:LOCALAPPDATA\Microsoft\PowerShell
    • Domyślnie dla systemów innych niż Windows: ~/.cache/powershell

    Domyślna nazwa pliku dla pamięci podręcznej to ModuleAnalysisCache. Jeśli masz zainstalowanych wiele instancji PowerShella, nazwa pliku zawiera przyrostek szesnastkowy, tak aby nazwa pliku była unikalna dla każdej instalacji.

    Uwaga

    Jeśli wykrywanie poleceń nie działa poprawnie, na przykład Intellisenses pokazuje polecenia, które nie istnieją, możesz usunąć plik pamięci podręcznej. Pamięć podręczna zostanie odtworzona przy następnym uruchomieniu PowerShell.

    Aby zmienić domyślną lokalizację pamięci podręcznej, przed uruchomieniem PowerShell należy ustawić zmienną środowiskową. Zmiany w tej zmiennej środowiskowej wpływają tylko na procesy dzieci. Wartość powinna określać pełną ścieżkę (łącznie z nazwą pliku), do której PowerShell ma prawo tworzyć i zapisywać pliki.

    Aby wyłączyć pamięć podręczną plików, ustaw tę wartość na nieprawidłową lokalizację, na przykład:

    # `NUL` here is a special device on Windows that cannot be written to,# on non-Windows you would use `/dev/null`$env:PSModuleAnalysisCachePath = 'NUL'

    To ustawia ścieżkę do urządzenia NUL. PowerShell nie może pisać do thepath, ale nie jest zwracany żaden błąd. Możesz zobaczyć błędy zgłaszane za pomocą atracera:

    Trace-Command -PSHost -Name Modules -Expression { Import-Module Microsoft.PowerShell.Management -Force }
  • PSDisableModuleAnalysisCacheCleanup

    Podczas wypisywania pamięci podręcznej analizy modułów, PowerShell sprawdza, czy nie ma modułów, które już nie istnieją, aby uniknąć niepotrzebnie dużej pamięci podręcznej. Czasami te sprawdzenia nie są pożądane, w tym przypadku można je wyłączyć ustawiając wartość zmiennej środowiskowej na 1.

    Ustawienie tej zmiennej środowiskowej działa natychmiast w bieżącym procesie.

  • PSModulePath

    Zmienna środowiskowa $env:PSModulePath zawiera listę lokalizacji folderów, które są przeszukiwane w celu znalezienia modułów i zasobów.

    Domyślnie, efektywne lokalizacje przypisane do $env:PSModulePath to:

    • Lokalizacje ogólnosystemowe: Foldery te zawierają moduły dostarczane wraz zPowerShell. Moduły są przechowywane w lokalizacji $PSHOME\Modules. Jest to również lokalizacja, w której instalowane są moduły zarządzania Windows.

    • Moduły instalowane przez użytkownika: Są to moduły instalowane przez użytkownika.Install-Module ma parametr Scope, który pozwala określić, czy moduł jest instalowany dla bieżącego użytkownika, czy dla wszystkich użytkowników. Więcej informacji znajdziesz w temacie Install-Module.

      • W systemie Windows, lokalizacją zakresu CurrentUser jest folder $HOME\Documents\PowerShell\Modules. Lokalizacją zakresuAllUsers jest $env:ProgramFiles\PowerShell\Modules.
      • W systemach innych niż Windows lokalizacją zakresu CurrentUserscope specyficznego dla użytkownika jest folder $HOME/.local/share/powershell/Modules. Lokalizacja zakresu AllUsers to /usr/local/share/powershell/Modules.

    Dodatkowo, programy instalacyjne, które instalują moduły w innych katalogach, takich jak katalog Program Files, mogą dodać ich lokalizacje do wartości$env:PSModulePath.

    Więcej informacji, zobacz about_PSModulePath.

Zarządzanie zmiennymi środowiskowymi

PowerShell udostępnia kilka różnych metod zarządzania zmiennymi środowiskowymi.

  • Dysk dostawcy środowiska
  • Części cmdletów Item
  • Klasa .NET klasy System.Environment
  • W systemie Windows, Panel sterowania systemu

Używanie dostawcy środowiska

Każda zmienna środowiskowa jest reprezentowana przez instancję klasySystem.Collections.DictionaryEntry. W każdym obiekcie DictionaryEntry nazwa zmiennej środowiskowej jest kluczem słownika. Wartość zmiennej jest wartością słownika.

Aby wyświetlić właściwości i metody obiektu reprezentującego zmienną środowiskową w PowerShell, należy użyć polecenia Get-Member cmdlet. Na przykład, aby wyświetlić metody i właściwości wszystkich obiektów w napędzie Env:,wpisz:

Get-Item -Path Env:* | Get-Member

Dostawca środowiska PowerShell umożliwia dostęp do zmiennych środowiskowych w napędzie PowerShell (napęd Env:). Napęd ten wygląda podobnie jak napęd systemu plików. Aby przejść do napędu Env:, wpisz:

Set-Location Env:

Użyj cmdletów Content, aby uzyskać lub ustawić wartości zmiennej środowiskowej.

PS Env:\> Set-Content -Path Test -Value 'Test value'PS Env:\> Get-Content -Path TestTest value

Możesz wyświetlić zmienne środowiskowe w dysku Env: z dowolnego innego dysku PowerShell, a także możesz wejść do dysku Env:, aby wyświetlić i zmienić zmienne środowiskowe.

Używanie poleceń cmdlet Item

Kiedy odwołujesz się do zmiennej środowiskowej, wpisz Env: nazwę napędu, a następnie nazwę zmiennej. Na przykład, aby wyświetlić wartość zmiennej środowiskowejCOMPUTERNAME, wpisz:

Get-ChildItem Env:Computername

Aby wyświetlić wartości wszystkich zmiennych środowiskowych, wpisz:

Get-ChildItem Env:

Ponieważ zmienne środowiskowe nie mają elementów potomnych, dane wyjściowe Get-Item i Get-ChildItem są takie same.

Domyślnie PowerShell wyświetla zmienne środowiskowe w kolejności, w jakiej je pobiera. Aby posortować listę zmiennych środowiskowych według nazwy zmiennej, należy przesłać wyjście polecenia Get-ChildItem do cmdletu Sort-Object. Przykładowo, z dowolnego dysku PowerShell wpisz:

Get-ChildItem Env: | Sort Name

Możesz również przejść do dysku Env: za pomocą cmdletu Set-Location:

Set-Location Env:

Gdy znajdujemy się na dysku Env:, możemy pominąć Env: nazwę dysku w thepath. Na przykład, aby wyświetlić wszystkie zmienne środowiskowe, wpisz:

PS Env:\> Get-ChildItem

Aby wyświetlić wartość zmiennej COMPUTERNAME z wnętrza napędu Env:, wpisz:

PS Env:\> Get-ChildItem ComputerName

Zapisywanie zmian w zmiennych środowiskowych

Aby dokonać trwałej zmiany w zmiennej środowiskowej w systemie Windows, należy użyć Panelu sterowania systemu. Wybierz opcję Zaawansowane ustawienia systemu. Na karcie Zaawansowane kliknij Zmienna środowiskowa…. Możesz dodać lub edytować istniejące zmienne środowiskowe w zakresach Użytkownik i System (Maszyna). Window zapisuje te wartości w rejestrze, dzięki czemu zachowują się one podczas sesji i restartów systemu.

Alternatywnie można dodać lub zmienić zmienne środowiskowe w profilu PowerShell. Ta metoda działa dla każdej wersji PowerShella na każdej obsługiwanej platformie.

Używanie metod System.Environment

Klasa System.Environment udostępnia metody GetEnvironmentVariable i SetEnvironmentVariable, które pozwalają określić zakres zmiennej.

Poniższy przykład wykorzystuje metodę GetEnvironmentVariable do uzyskania ustawienia maszynowego PSModulePath oraz metodę SetEnvironmentVariable do dodania ścieżki C:\Program Files\Fabrikam\Modules do wartości.

$path = ::GetEnvironmentVariable('PSModulePath', 'Machine')$newpath = $path + ';C:\Program Files\Fabrikam\Modules'::SetEnvironmentVariable("PSModulePath", $newpath, 'Machine')

Więcej informacji o metodach klasy System.Environment znajdziesz w dziale MetodyEnvironment.

Zobacz także

  • Environment (provider)
  • about_Modules

.

Dodaj komentarz

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