Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Descrição curta
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. 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:
- Módulos instalados no escopo do CurrentUser:
- No Windows, esses módulos são armazenados em
$HOME\Documents\PowerShell\Modules. 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 o local da pastaDocuments. 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 pasta
$HOME/.local/share/powershell/Modules.
- No Windows, esses módulos são armazenados em
- Módulos instalados no escopo de Todos os Usuários do:
- No Windows, esses módulos são armazenados em
$Env:ProgramFiles\PowerShell\Modules. - Em sistemas não 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 em
$PSHOME\Modules.
Nota
Aplicativos que incluem módulos do PowerShell podem instalar módulos em outros diretórios no Windows, como a pasta Program Files. 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 do CurrentUser são armazenados no
$HOME\Documents\WindowsPowerShell\Modules. - Os módulos instalados no escopo de Todos os Usuários são armazenados no
$Env:ProgramFiles\WindowsPowerShell\Modules. - Módulos que são fornecidos com o Windows PowerShell armazenado em
$PSHOME\Modules, que é$Env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.
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 você o iniciou.
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, de AllUsers e os caminhos dos módulos$PSHOME - Se
PSModulePathexistir:- Se
PSModulePathcontiver$PSHOMEcaminho de módulos:-
o caminho dos módulos dos AllUsers é inserido antes de
$PSHOMEcaminho dos módulos
-
o caminho dos módulos dos AllUsers é inserido antes de
- mais:
- Basta usar
PSModulePathconforme 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 somente, mesmo quando houver uma variável com escopo de computador com o mesmo nome. O caminho variáveis de ambiente são tratados de forma diferente.
No Windows, PSModulePath é tratado de forma semelhante à forma como a variável de ambiente Path é tratada.
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 Pathno escopo do computador.
- Recuperar o
PSModulePathno escopo do usuário - Comparar com o processo herdado
PSModulePathvariável de ambiente- Se for o mesmo:
- Acrescente os os AllUsers
PSModulePathao final seguindo a semântica da variável de ambientePATH - O caminho
System32do Windows vem do computador definidoPSModulePathportanto, 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
$PSHOMEPS7 nessa ordem- Se
powershell.config.jsoncontiver umPSModulePathno escopo do usuário, use-o em vez do padrão para o usuário - Se
powershell.config.jsoncontiver umPSModulePathno escopo do sistema, use-o em vez do padrão para o sistema
- Se
Sistemas que não são do Windows 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 para arquivos de 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 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 em cada sessão, edite a chave do Registro armazenando os valores de PSModulePath. Os valores de PSModulePath são armazenados no registro como cadeias de caracteres de nãoexpanadas. Para evitar salvar permanentemente os valores de PSModulePath à medida que cadeias de caracteres expandidas, use o método GetValue() na subchave e edite o valor diretamente.
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\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)