about_PSModulePath

Krótki opis

W tym artykule opisano przeznaczenie i użycie zmiennej środowiskowej $Env:PSModulePath .

Długi opis

Zmienna $Env:PSModulePath środowiskowa zawiera listę lokalizacji folderów. Program PowerShell cyklicznie wyszukuje każdy folder dla plików modułu (.psd1 lub .psm1).

Domyślnie obowiązującą lokalizacją przypisaną do $Env:PSModulePath :

  • Moduły zainstalowane w zakresie CurrentUser :
    • W systemie Windows te moduły są przechowywane w programie $HOME\Documents\PowerShell\Modules. Określona lokalizacja Documents folderu różni się w zależności od wersji systemu Windows i podczas korzystania z przekierowania folderów. Ponadto usługa Microsoft OneDrive może zmienić lokalizację Documents folderu. Aby sprawdzić lokalizację Documents folderu, uruchom następujące polecenie: [Environment]::GetFolderPath('MyDocuments').
    • W systemach innych niż Windows te moduły są przechowywane w folderze $HOME/.local/share/powershell/Modules .
  • Moduły zainstalowane w zakresie AllUsers :
    • W systemie Windows te moduły są przechowywane w programie $Env:ProgramFiles\PowerShell\Modules.
    • W systemach innych niż Windows te moduły są przechowywane w programie /usr/local/share/powershell/Modules.
  • Moduły dostarczane za pomocą programu PowerShell są przechowywane w programie $PSHOME\Modules.

Uwaga

Aplikacje zawierające moduły programu PowerShell mogą instalować moduły w innych katalogach w systemie Windows, takich jak Program Files folder. Pakiet instalatora może nie dołączać lokalizacji do pliku $Env:PSModulePath.

Domyślne lokalizacje programu Windows PowerShell 5.1 różnią się od programu PowerShell 7.

  • Moduły zainstalowane w zakresie CurrentUser są przechowywane w programie $HOME\Documents\WindowsPowerShell\Modules.
  • Moduły zainstalowane w zakresie AllUsers są przechowywane w folderze $Env:ProgramFiles\WindowsPowerShell\Modules.
  • Moduły dostarczane za pomocą programu Windows PowerShell przechowywane w $PSHOME\Modulesprogramie , czyli $Env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.

Konstrukcja programu PowerShell PSModulePath

Wartość jest tworzona $Env:PSModulePath za każdym razem, gdy program PowerShell jest uruchamiany. Wartość różni się w zależności od wersji programu PowerShell i sposobu jej uruchamiania.

Uruchamianie programu Windows PowerShell

Program Windows PowerShell używa następującej logiki do konstruowania podczas uruchamiania PSModulePath :

  • Jeśli PSModulePath nie istnieje, połącz ścieżki CurrentUser, AllUsers i $PSHOME modułów
  • Jeśli PSModulePath istnieje:
    • Jeśli PSModulePath zawiera $PSHOME ścieżkę modułów:
      • Ścieżka modułów AllUsers jest wstawiana przed $PSHOME ścieżką modułów
    • inaczej:
      • Po prostu użyj PSModulePath jako zdefiniowanego, ponieważ użytkownik celowo usunął lokalizację $PSHOME

Ścieżka modułu CurrentUser jest poprzedzona prefiksem tylko wtedy, gdy zakres $Env:PSModulePath użytkownika nie istnieje. W przeciwnym razie zakres $Env:PSModulePath użytkownika jest używany zgodnie z definicją.

Uruchamianie programu PowerShell 7

W systemie Windows w przypadku większości zmiennych środowiskowych, jeśli istnieje zmienna o zakresie użytkownika, nowy proces używa tej wartości tylko wtedy, gdy istnieje zmienna o zakresie maszyny o tej samej nazwie. Zmienne środowiskowe ścieżki są traktowane inaczej.

W systemie Windows PSModulePath jest traktowany podobnie jak w przypadku traktowania zmiennej środowiskowej Path . Path jest traktowany inaczej niż inne zmienne środowiskowe. Po uruchomieniu procesu system Windows łączy zakres użytkownika Path z zakresem Pathmaszyny .

  • Pobieranie zakresu użytkownika PSModulePath
  • Porównanie z dziedziczonej PSModulePath zmiennej środowiskowej procesu
    • Jeśli to samo:
      • Dołącz wartość AllUsersPSModulePath na końcu po semantyce zmiennej środowiskowej PATH
      • Ścieżka systemu Windows System32 pochodzi ze zdefiniowanej PSModulePath maszyny, więc nie trzeba ich jawnie dodawać
    • Jeśli jest inaczej, traktuj je tak, jakby użytkownik jawnie go zmodyfikował i nie dołączaj użytkowników AllUsersPSModulePath
  • Prefiks z ps7 użytkownika, systemu i $PSHOME ścieżek w tej kolejności
    • Jeśli powershell.config.json zawiera użytkownika o PSModulePathokreślonym zakresie , użyj tego zamiast wartości domyślnej dla użytkownika
    • Jeśli powershell.config.json zawiera system o PSModulePathzakresie , należy użyć tego zamiast domyślnego dla systemu

Systemy inne niż Windows nie mają separacji zmiennych środowiskowych użytkownika i systemu. PSModulePath jest dziedziczony, a ścieżki specyficzne dla programu PS7 są poprzedzone prefiksem, jeśli jeszcze nie zostały zdefiniowane.

Uruchamianie programu Windows PowerShell z poziomu programu PowerShell 7

Na potrzeby tej dyskusji program Windows PowerShell oznacza zarówno , jak powershell.exe i powershell_ise.exe.

Wartość $Env:PSModulePath elementu jest kopiowana do WinPSModulePath elementu z następującymi modyfikacjami:

  • Usuwanie ps7 ścieżki modułu User
  • Usuwanie ps7 ścieżki modułu systemowego
  • Usuwanie ścieżki modułu $PSHOME PS7

Ścieżki PS7 są usuwane, aby moduły PS7 nie zostały załadowane w programie Windows PowerShell. Wartość jest używana podczas uruchamiania WinPSModulePath programu Windows PowerShell.

Ta modyfikacja dotyczy tylko Windows procesów programu PowerShell uruchamianych bezpośrednio przez program PowerShell 7. Po uruchomieniu Windows programu PowerShell przez proces pośredni, taki jak cmd.exe proces lub Python uruchomiony przez program PowerShell 7, proces pośredni dziedziczy niezmodyfikowany $Env:PSModulePath program PowerShell 7 i przekazuje go do własnych procesów podrzędnych. Windows program PowerShell został uruchomiony w ten sposób, utrzymuje dziedziczone ścieżki modułów programu PowerShell 7. Ponieważ te ścieżki poprzedzają ścieżkę modułu systemu Windows PowerShell, Windows program PowerShell może rozpoznawać nazwy modułów udostępnionych, takie jak Microsoft.PowerShell.Utility, do wersji modułu programu PowerShell 7, których nie można załadować. Spowoduje to uszkodzenie automatycznego ładowania modułu, a polecenia cmdlet z tych modułów kończą się niepowodzeniem z powodu błędu CommandNotFoundException .

Aby rozpocząć Windows programu PowerShell z pośredniego procesu z odpowiednimi ścieżkami modułu, usuń je PSModulePath ze środowiska procesu podrzędnego. Windows program PowerShell tworzy wartość domyślną podczas uruchamiania. Na przykład:

  • W programie PowerShell w wersji 7.4 lub nowszej użyj parametru Environment polecenia Start-Process , aby usunąć zmienną ze środowiska procesu pośredniego:

    Start-Process python harness.py -Environment @{ PSModulePath = $null }
    
  • W cmd.exepliku wyczyść zmienną przed rozpoczęciem Windows programu PowerShell:

    cmd /c "set PSModulePath=&& powershell.exe -File script.ps1"
    
  • W Python usuń zmienną ze środowiska przekazywanego do procesu podrzędnego:

    import os
    import subprocess
    
    env = {k: v for k, v in os.environ.items() if k.upper() != "PSMODULEPATH"}
    subprocess.run(["powershell.exe", "-File", "script.ps1"], env=env)
    

Uruchamianie programu PowerShell 7 z poziomu programu Windows PowerShell

Uruchamianie programu PowerShell 7 jest kontynuowane w miarę dodawania dziedziczych ścieżek dodanych przez program Windows PowerShell. Ponieważ ścieżki specyficzne dla ps7 są poprzedzone prefiksem, nie ma problemu z funkcjonalnością.

Zachowanie wyszukiwania modułu

Program PowerShell cyklicznie wyszukuje każdy folder w folderze PSModulePath dla plików modułu (.psd1 lub .psm1). Ten wzorzec wyszukiwania umożliwia zainstalowanie wielu wersji tego samego modułu w różnych folderach. Na przykład:

    Directory: C:\Program Files\WindowsPowerShell\Modules\PowerShellGet

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           8/14/2020  5:56 PM                1.0.0.1
d----           9/13/2019  3:53 PM                2.1.2

Domyślnie program PowerShell ładuje najwyższy numer wersji modułu po znalezieniu wielu wersji. Aby załadować określoną wersję, użyj parametru Import-ModuleFullyQualifiedName . Aby uzyskać więcej informacji, zobacz Import-Module.

Modyfikowanie ścieżki PSModulePath

W większości sytuacji należy instalować moduły w domyślnych lokalizacjach modułów. Może jednak być konieczne zmianę wartości zmiennej środowiskowej PSModulePath .

Aby na przykład tymczasowo dodać C:\Program Files\Fabrikam\Modules katalog do $Env:PSModulePath bieżącej sesji, wpisz:

$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"

Średnik (;) w poleceniu oddziela nową ścieżkę od ścieżki, która poprzedza ją na liście. Na platformach innych niż Windows dwukropek (:) oddziela lokalizacje ścieżek w zmiennej środowiskowej.

Modyfikowanie ścieżki PSModulePath w systemach innych niż Windows

Aby zmienić wartość PSModulePath dla każdej sesji w środowisku innych niż Windows, dodaj poprzednie polecenie do profilu programu PowerShell.

Modyfikowanie ścieżki PSModulePath w systemie Windows

Aby zmienić wartość PSModulePath w każdej sesji, zmodyfikuj klucz rejestru przechowując PSModulePath wartości. Wartości PSModulePath są przechowywane w rejestrze jako niezrozpaczone ciągi. Aby uniknąć trwałego zapisywania PSModulePath wartości jako rozszerzonych ciągów, użyj GetValue() metody w podkluczu i edytuj wartość bezpośrednio.

Poniższy przykład dodaje ścieżkę C:\Program Files\Fabrikam\Modules do wartości PSModulePath zmiennej środowiskowej bez rozszerzania niezrozpaczone ciągi.

$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Aby dodać ścieżkę do ustawienia użytkownika, użyj następującego kodu:

$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Zobacz także