about_PSModulePath
A $env:PSModulePath
variável de ambiente 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
$PSHOME\Modules
pasta . 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 CurrentUser específico do usuário é a
$HOME\Documents\PowerShell\Modules
pasta . O local do escopo AllUsers é$env:ProgramFiles\PowerShell\Modules
. - Em sistemas não Windows, o local do escopo CurrentUser específico do usuário é a
$HOME/.local/share/powershell/Modules
pasta. O local do escopo AllUsers é/usr/local/share/powershell/Modules
.
- No Windows, o local do escopo CurrentUser específico do usuário é a
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
.
Observação
No Windows, o local específico do usuário é a PowerShell\Modules
pasta localizada na pasta Documentos em seu perfil de usuário. O caminho específico desse local varia de acordo com a versão do Windows e se você está usando ou não o redirecionamento de pasta. O Microsoft OneDrive também pode alterar o local da pasta Documentos . Você pode verificar o local da pasta Documentos usando o seguinte comando: [Environment]::GetFolderPath('MyDocuments')
.
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 Windows PowerShell
Windows PowerShell usa a seguinte lógica para construir o PSModulePath
na inicialização:
- Se
PSModulePath
não existir, combine CurrentUser, AllUsers e os caminhos de$PSHOME
módulos - Se
PSModulePath
existir:- Se
PSModulePath
contiver$PSHOME
o caminho dos módulos:- O caminho dos módulos AllUsers é inserido antes
$PSHOME
do caminho dos módulos
- O caminho dos módulos AllUsers é inserido antes
- Mais:
- Basta usar
PSModulePath
conforme definido, pois o usuário removeu deliberadamente o$PSHOME
local
- Basta usar
- Se
O caminho do módulo CurrentUser será prefixado somente se o escopo $env:PSModulePath
do usuário não existir. Caso contrário, o escopo $env:PSModulePath
do 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 no escopo do usuário existir, um novo processo usará esse valor somente mesmo que exista uma variável no escopo do computador 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 o escopo Path
do usuário com o escopo Path
do computador.
- Recuperar o escopo do usuário
PSModulePath
- Comparar com a variável de ambiente herdada do
PSModulePath
processo- Se o mesmo:
- Acrescente os AllUsers
PSModulePath
ao final após a semântica da variável dePath
ambiente - O caminho do Windows
System32
vem do computador definidoPSModulePath
, portanto, não precisa ser adicionado explicitamente
- Acrescente os AllUsers
- Se diferente, trate como se o usuário o tivesse modificado explicitamente e não acrescentasse AllUsers
PSModulePath
- Se o mesmo:
- Prefixo com Usuário PS7, Sistema e
$PSHOME
caminhos nessa ordem- Se
powershell.config.json
contiver um escopo dePSModulePath
usuário, use isso em vez do padrão para o usuário - Se
powershell.config.json
contiver um escopoPSModulePath
do sistema, use isso em vez do padrão para o sistema
- Se
Os sistemas Unix não têm uma separação de variáveis de ambiente usuário e sistema.
PSModulePath
é herdado e os caminhos específicos do PS7 são prefixados se ainda não estiverem definidos.
Começando Windows PowerShell do PowerShell 7
Para essa 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 do caminho do módulo usuário
- Remover ps7 o caminho do módulo do sistema
- Remover PS7 do caminho do
$PSHOME
módulo
Os caminhos PS7 são removidos para que os módulos PS7 não sejam carregados em Windows PowerShell. O WinPSModulePath
valor é usado ao iniciar Windows PowerShell.
Iniciando o PowerShell 7 de Windows PowerShell
A inicialização do PowerShell 7 continua como está com a adição de caminhos herdados que Windows PowerShell adicionados. 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 nos arquivos PSModulePath para módulo (.psd1
ou .psm1
). Esse 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 PSModulePath
Para a maioria das situações, você deve instalar módulos nos locais de módulo padrão. No entanto, talvez você precise alterar o valor da variável de PSModulePath
ambiente.
Por exemplo, para adicionar temporariamente o C:\Program Files\Fabrikam\Modules
diretório para $env:PSModulePath
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 não Windows, os dois-pontos (:
) separam os locais do caminho na variável de ambiente.
Modificando PSModulePath em não Windows
Para alterar o valor de PSModulePath
para cada sessão em um ambiente não Windows, adicione o comando anterior ao seu perfil do PowerShell.
Modificando 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 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 método GetValue na sub-chave e edite o valor diretamente.
O exemplo a seguir adiciona o C:\Program Files\Fabrikam\Modules
caminho ao valor da variável de PSModulePath
ambiente 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:\').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)