Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Breve descrição
Este artigo descreve a finalidade e o uso da variável de ambiente $env:PSModulePath.
Descrição longa
A variável de ambiente $env:PSModulePath contém uma lista de locais de pasta que são pesquisados para localizar módulos e recursos. O PowerShell pesquisa recursivamente em cada pasta arquivos de módulo (.psd1 ou .psm1).
Install-Module tem um parâmetro Scope que permite especificar se o módulo está instalado para o usuário atual ou para todos os usuários. Para obter mais informações, consulte Install-Module.
Por padrão, os locais efetivos atribuídos a $env:PSModulePath são:
Locais em todo o sistema: essas pastas contêm módulos fornecidos com o PowerShell. Esses módulos são armazenados na
$PSHOME\Modulespasta.- No Windows, os módulos instalados no escopo AllUsers são armazenados no
$env:ProgramFiles\WindowsPowerShell\Modules. - Em sistemas que não sejam Windows, os módulos instalados no escopo AllUsers são armazenados no
/usr/local/share/powershell/Modules.
- No Windows, os módulos instalados no escopo AllUsers são armazenados no
Módulos instalados pelo usuário: no Windows, os módulos instalados no escopo CurrentUser normalmente são armazenados na
$HOME\Documents\WindowsPowerShell\Modulespasta. O local específico da pastaDocumentsvaria de acordo com a versão do Windows e quando você usa o redirecionamento de pasta. Além disso, o Microsoft OneDrive pode alterar a localização da sua pastaDocuments. Você pode verificar o local da suaDocumentspasta usando o seguinte comando:[Environment]::GetFolderPath('MyDocuments').Em sistemas que não sejam Windows, os módulos instalados no escopo CurrentUser são armazenados na
$HOME/.local/share/powershell/Modulespasta.Módulos específicos do aplicativo: Os programas de instalação podem instalar módulos em outros diretórios, como a
Program Filespasta no Windows. O pacote de instalação pode ou não anexar o local ao$env:PSModulePatharquivo .
Construção do PowerShell PSModulePath
O valor de $env:PSModulePath é construído sempre que o PowerShell é iniciado.
O valor varia de acordo com a versão do PowerShell e como ele é iniciado.
Inicialização do Windows PowerShell
O Windows PowerShell usa a seguinte lógica para construir o PSModulePath na inicialização:
- Se
PSModulePathnão existir, combine CurrentUser, AllUserse os caminhos$PSHOMEmódulos - Se
PSModulePathexistir:- Se
PSModulePathcontiver$PSHOMEcaminho de módulos:-
AllUsers caminho dos módulos é inserido antes
$PSHOMEcaminho dos módulos
-
AllUsers caminho dos módulos é inserido antes
- senão:
- Basta usá
PSModulePathcomo definido, uma vez que o usuário deliberadamente removeu o local$PSHOME
- Basta usá
- Se
O caminho do módulo CurrentUser só será prefixado se o $env:PSModulePath de escopo do usuário não existir. Caso contrário, o escopo do usuário $env:PSModulePath será usado conforme definido.
Inicialização do PowerShell 7
No Windows, para a maioria das variáveis de ambiente, se a variável User-scoped existir, um novo processo usará esse valor somente mesmo se existir uma variável de escopo de máquina com o mesmo nome.
No PowerShell 7, PSModulePath é tratado de forma semelhante à forma como a Path variável de ambiente é tratada no Windows. No Windows, Path é tratado de forma diferente de outras variáveis de ambiente. Quando um processo é iniciado, o Windows combina a Path com escopo do usuário com a Pathescopo da máquina .
- Recuperar o
PSModulePathcom escopo do usuário - Comparar com o processo herdado
PSModulePathvariável de ambiente- Se o mesmo:
- Anexe o AllUsers ao final seguindo a semântica da variável de ambiente
PSModulePath - O caminho do Windows
System32vem da máquina definidaPSModulePath, portanto, não precisa ser adicionado explicitamente
- Anexe o AllUsers ao final seguindo a semântica da variável de ambiente
- Se diferente, trate como se o usuário o tivesse modificado explicitamente e não anexe AllUsers
PSModulePath
- Se o mesmo:
- Prefixo com caminhos de usuário, sistema e
$PSHOMEdo PS7 nessa ordem- Se
powershell.config.jsoncontiver um escopo de usuárioPSModulePath, use-o em vez do padrão para o usuário - Se
powershell.config.jsoncontiver um escopo do sistemaPSModulePath, use-o em vez do padrão para o sistema
- Se
Os sistemas Unix não têm uma separação de variáveis de ambiente de usuário e sistema.
PSModulePath é herdado e os caminhos específicos do PS7 são prefixados se ainda não estiverem definidos.
Iniciando o Windows PowerShell a partir do PowerShell 7
Para esta discussão, Windows PowerShell significa powershell.exe e powershell_ise.exe.
O valor de $env:PSModulePath é copiado para WinPSModulePath com as seguintes modificações:
- Remover PS7 o caminho do módulo de usuário
- Remover PS7 o caminho do módulo Sistema
- Remover PS7 o caminho do módulo
$PSHOME
Os caminhos do PS7 são removidos para que os módulos do PS7 não sejam carregados no Windows PowerShell. O valor WinPSModulePath é usado ao iniciar o Windows PowerShell.
Iniciando o PowerShell 7 a partir do Windows PowerShell
A inicialização do PowerShell 7 continua as-is com a adição de caminhos de herança que o Windows PowerShell adicionou. Como os caminhos específicos do PS7 são prefixados, não há nenhum problema funcional.
Comportamento de pesquisa do módulo
O PowerShell pesquisa recursivamente cada pasta no PSModulePath arquivos de módulo (.psd1 ou .psm1). Este padrão de pesquisa permite que várias versões do mesmo módulo sejam instaladas em pastas diferentes. Por exemplo:
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
Por padrão, o PowerShell carrega o número de versão mais alto de um módulo quando várias versões são encontradas. Para carregar uma versão específica, use Import-Module com o parâmetro FullyQualifiedName. Para obter mais informações, consulte Import-Module.
Modificando o PSModulePath
Para a maioria das situações, você deve instalar módulos nos locais de módulo padrão. No entanto, você pode ter a necessidade de alterar o valor da variável de PSModulePath ambiente.
Por exemplo, para adicionar temporariamente o diretório C:\Program Files\Fabrikam\Modules ao $env:PSModulePath para a sessão atual, digite:
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
O ponto-e-vírgula (;) no comando separa o novo caminho do caminho que o precede na lista. Em plataformas que não sejam Windows, os dois pontos (:) separam os locais de caminho na variável de ambiente.
Modificando o PSModulePath em não-Windows
Para alterar o valor do PSModulePath para cada sessão em um ambiente que não seja Windows, adicione o comando anterior ao seu perfil do PowerShell.
Modificando o PSModulePath no Windows
Para alterar o valor de PSModulePath em cada sessão, edite a chave do Registro que armazena os valores PSModulePath. Os valores PSModulePath são armazenados no registro como cadeias de caracteres não expandidas. Para evitar salvar permanentemente os PSModulePath valores como cadeias de caracteres expandidas , use o método GetValue na subchave e edite o valor diretamente.
O exemplo a seguir adiciona o C:\Program Files\Fabrikam\Modules caminho ao valor da variável de ambiente sem expandir as cadeias de PSModulePath caracteres não expandidas.
$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Para adicionar um caminho à configuração do usuário, altere o provedor do Registro de HKLM:\ para HKCU:\.
$key = (Get-Item 'HKCU:\').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)