about_PSModulePath
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 cada pasta em busca de arquivos de módulo (.psd1
ou .psm1
).
Por padrão, os locais efetivos atribuídos a $env:PSModulePath
são:
Locais em todo o sistema: essas pastas contêm módulos que são fornecidos com o PowerShell. Esses módulos são armazenados na pasta
$PSHOME\Modules
. Esse também é o local onde os módulos de gerenciamento do Windows estão instalados.Módulos instalados pelo usuário: são módulos instalados pelo usuário.
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.- No Windows, o local do escopo do CurrentUser
específico do usuário é a pasta de Todos os Usuários. O local do escopo é . - Em sistemas não Windows, o local do escopo do CurrentUser
específico do usuário é a pasta de Todos os Usuários. O local do escopo é .
- No Windows, o local do escopo do CurrentUser
Além disso, programas de instalação que instalam módulos em outros diretórios, como o diretório Arquivos de Programas, podem acrescentar seus locais ao valor de $env:PSModulePath
.
Nota
No Windows, o local específico do usuário é a pasta
Construção do PSModulePath do PowerShell
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
PSModulePath
não existir, combine CurrentUser, de AllUsers e os caminhos dos módulos$PSHOME
- Se
PSModulePath
existir:- Se
PSModulePath
contiver$PSHOME
caminho de módulos:-
o caminho dos módulos dos AllUsers é inserido antes de
$PSHOME
caminho dos módulos
-
o caminho dos módulos dos AllUsers é inserido antes de
- mais:
- Basta usar
PSModulePath
conforme definido, já que o usuário removeu deliberadamente o local do$PSHOME
- Basta usar
- Se
O caminho do módulo CurrentUser será prefixado somente se o escopo do usuário $env:PSModulePath
não existir. Caso contrário, o escopo do usuário $env:PSModulePath
será usado como definido.
Inicialização do PowerShell 7
No Windows, para a maioria das variáveis de ambiente, se a variável com escopo de usuário existir, um novo processo usará esse valor apenas mesmo que exista uma variável com escopo de computador com o mesmo nome.
No PowerShell 7, PSModulePath
é tratado de forma semelhante à forma como a variável de ambiente Path
é tratada no Windows. No Windows, Path
é tratado de forma diferente de outras variáveis de ambiente. Quando um processo é iniciado, o Windows combina o Path
no escopo do usuário com o Path
no escopo do computador.
- Recuperar o
PSModulePath
no escopo do usuário - Comparar com o processo herdado
PSModulePath
variável de ambiente- Se for o mesmo:
- Acrescente os os AllUsers
PSModulePath
ao final seguindo a semântica da variável de ambientePath
- O caminho
System32
do Windows vem do computador definidoPSModulePath
portanto, não precisa ser adicionado explicitamente
- Acrescente os os AllUsers
- Se diferente, trate como se o usuário o tivesse modificado explicitamente e não acrescentasse AllUsers
PSModulePath
- Se for o mesmo:
- Prefixo com caminhos de usuário, sistema e
$PSHOME
PS7 nessa ordem- Se
powershell.config.json
contiver umPSModulePath
no escopo do usuário, use-o em vez do padrão para o usuário - Se
powershell.config.json
contiver umPSModulePath
no escopo do sistema, 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 serão prefixados se ainda não estiverem definidos.
Iniciando o Windows PowerShell do PowerShell 7
Para esta discussão, do Windows PowerShell significa powershell.exe
e powershell_ise.exe
.
O valor de $env:PSModulePath
é copiado para WinPSModulePath
com as seguintes modificações:
- Remover o PS7 do caminho do módulo usuário
- Remover ps7 do caminho do módulo do sistema
- Remover PS7 do caminho do módulo
$PSHOME
Os caminhos PS7 são removidos para que os módulos PS7 não sejam carregados no Windows PowerShell. O valor WinPSModulePath
é usado ao iniciar o Windows PowerShell.
Iniciando o PowerShell 7 do Windows PowerShell
A inicialização do PowerShell 7 continua as-is com a adição de caminhos herdados que o Windows PowerShell adicionou. Como os caminhos específicos do PS7 são prefixados, não há nenhum problema funcional.
Comportamento de pesquisa de módulo
O PowerShell pesquisa recursivamente cada pasta no PSModulePath
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 PSModulePath
Para a maioria das situações, você deve instalar módulos nos locais de módulo padrão. No entanto, talvez seja necessário alterar o valor da variável de ambiente PSModulePath
.
Por exemplo, para adicionar temporariamente o diretório C:\Program Files\Fabrikam\Modules
a $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 são do 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 de PSModulePath
para cada sessão em um ambiente que não seja do Windows, adicione o comando anterior ao seu perfil do PowerShell.
Modificando o PSModulePath no Windows
Para alterar o valor de PSModulePath
para cada sessão em um ambiente do Windows, edite a chave do Registro armazenando os valores PSModulePath
. Os valores PSModulePath
são armazenados no registro como cadeias de caracteres de não expandidas. Para evitar salvar permanentemente os valores de
O exemplo a seguir adiciona o caminho C:\Program Files\Fabrikam\Modules
ao valor da variável de ambiente PSModulePath
sem expandir as cadeias de caracteres não expandidas.
$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';C:\Program Files\Fabrikam\Modules' # or '%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:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';C:\Program Files\Fabrikam\Modules' # or '%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Consulte também
- about_Modules
- métodos de ambiente