about_PSModulePath
Breve descrição
Este artigo descreve a finalidade e o $env:PSModulePath
uso da variável de ambiente.
Descrição longa
A $env:PSModulePath
variável de ambiente contém uma lista de locais de pasta. O PowerShell pesquisa recursivamente cada pasta em busca de arquivos de módulo (.psd1
ou .psm1
).
Por padrão, os locais efetivos atribuídos são $env:PSModulePath
:
- Módulos instalados no escopo CurrentUser :
- No Windows, esses módulos são armazenados em
$HOME\Documents\PowerShell\Modules
. O local específico da pasta varia de acordo com a versão do Windows e quando você usa oDocuments
redirecionamento de pasta. Além disso, o Microsoft OneDrive pode alterar a localização da suaDocuments
pasta. Para verificar o local da pastaDocuments
, execute o seguinte comando:[Environment]::GetFolderPath('MyDocuments')
. - Em sistemas não-Windows, esses módulos são armazenados na
$HOME/.local/share/powershell/Modules
pasta.
- No Windows, esses módulos são armazenados em
- Módulos instalados no escopo AllUsers :
- No Windows, esses módulos são armazenados em
$env:ProgramFiles\PowerShell\Modules
. - Em sistemas que não sejam Windows, esses módulos são armazenados em
/usr/local/share/powershell/Modules
.
- No Windows, esses módulos são armazenados em
- Os módulos fornecidos com o PowerShell são armazenados no
$PSHOME\Modules
.
Nota
Os aplicativos que incluem módulos do PowerShell podem instalar módulos em outros diretórios no Windows, como a Program Files
pasta. O pacote do instalador pode não acrescentar o local ao $env:PSModulePath
.
Os locais padrão do Windows PowerShell 5.1 são diferentes do PowerShell 7.
- Os módulos instalados no escopo CurrentUser são armazenados em
$HOME\Documents\WindowsPowerShell\Modules
. - Os módulos instalados no escopo AllUsers são armazenados no
$env:ProgramFiles\WindowsPowerShell\Modules
. - Módulos fornecidos com o Windows PowerShell armazenados no
$PSHOME\Modules
, que é$env:SystemRoot\System32\WindowsPowerShell\1.0\Modules
.
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 você o iniciou.
Inicialização do Windows PowerShell
O Windows PowerShell usa a seguinte lógica para construir o PSModulePath
at startup:
- Se
PSModulePath
não existir, combine CurrentUser, AllUsers e os caminhos dos$PSHOME
módulos - Se
PSModulePath
existir:- Se
PSModulePath
contiver$PSHOME
o caminho dos módulos:- O caminho dos módulos AllUsers é inserido antes do caminho dos
$PSHOME
módulos
- O caminho dos módulos AllUsers é inserido antes do caminho dos
- senão:
- Basta usar
PSModulePath
como definido, uma vez que o usuário deliberadamente removeu o$PSHOME
local
- Basta usar
- Se
O caminho do módulo CurrentUser será prefixado somente se o escopo $env:PSModulePath
User não existir. Caso contrário, o escopo $env:PSModulePath
Usuário 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á apenas esse valor, mesmo quando existir uma variável com escopo de máquina com o mesmo nome. As variáveis de ambiente de caminho são tratadas de forma diferente.
No Windows, PSModulePath
é tratado de forma semelhante à forma como a Path
variável de ambiente é tratada. Path
é tratada de forma diferente de outras variáveis ambientais. Quando um processo é iniciado, o Windows combina o escopo do Path
usuário com o escopo da Path
máquina .
- Recuperar o escopo do usuário
PSModulePath
- Comparar com a variável de ambiente herdada
PSModulePath
do processo- Se o mesmo:
- Anexe o AllUsers
PSModulePath
ao final seguindo a semântica da variável dePath
ambiente - O caminho do Windows
System32
vem da máquina definidaPSModulePath
, portanto, não precisa ser adicionado explicitamente
- Anexe o AllUsers
- Se diferente, trate como se o usuário o tivesse modificado explicitamente e não anexe AllUsers
PSModulePath
- Se o mesmo:
- Prefixo com usuário, sistema e
$PSHOME
caminhos do PS7 nessa ordem- Se
powershell.config.json
contiver um escopo de usuário ,PSModulePath
use-o em vez do padrão para o usuário - Se
powershell.config.json
contiver um sistema com escopo ,PSModulePath
use-o em vez do padrão para o sistema
- Se
Os sistemas que não são Windows não têm uma separação das variáveis de ambiente do Usuário e do Sistema. PSModulePath
é herdada 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 e powershell.exe
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
$PSHOME
módulo
Os caminhos do PS7 são removidos para que os módulos do PS7 não sejam carregados no Windows PowerShell. O valor é usado ao iniciar o WinPSModulePath
Windows PowerShell.
Iniciando o PowerShell 7 a partir do Windows PowerShell
A inicialização do PowerShell 7 continua como está 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 em busca de 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, talvez seja necessário alterar o PSModulePath
valor da variável de ambiente.
Por exemplo, para adicionar temporariamente o C:\Program Files\Fabrikam\Modules
diretório à sessão atual, digite $env:PSModulePath
:
$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 não-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 cada sessão em um ambiente que não seja Windows, adicione o comando anterior ao seu perfil do PSModulePath
PowerShell.
Modificando o PSModulePath no Windows
Para alterar o valor de em cada sessão, edite a chave do PSModulePath
Registro que armazena os PSModulePath
valores. Os PSModulePath
valores 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 GetValue()
método 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\Environment')
$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, use o seguinte código:
$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)