Partilhar via


about_PSModulePath

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. O PowerShell pesquisa recursivamente em cada pasta arquivos de módulo (.psd1 ou .psm1).

Por padrão, os locais efetivos atribuídos a $Env:PSModulePath são:

  • Os 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 Documents varia 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 pasta Documents. Para verificar a localização da pasta Documents, execute o seguinte comando: [Environment]::GetFolderPath('MyDocuments').
    • Em sistemas que não sejam Windows, esses módulos são armazenados na pasta $HOME/.local/share/powershell/Modules.
  • Os módulos instalados no AllUsers escopo:
    • 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.
  • Os módulos fornecidos com o PowerShell são armazenados em $PSHOME\Modules.

Observação

Os 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 anexar 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 em $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 na inicialização:

  • Se PSModulePath não existir, combine CurrentUser, AllUserse os caminhos $PSHOME módulos
  • Se PSModulePath existir:
    • Se PSModulePath contiver $PSHOME caminho de módulos:
      • AllUsers caminho dos módulos é inserido antes $PSHOME caminho dos módulos
    • senão:
      • Basta usáPSModulePath como definido, uma vez que o usuário deliberadamente removeu o local $PSHOME

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á apenas esse valor, mesmo quando existir uma variável com escopo de máquina com o mesmo nome. As variáveis de caminho ambiente são tratadas de forma diferente.

No Windows, PSModulePath é tratada de forma semelhante à forma como a variável de ambiente Path é tratada. Path é tratada de forma diferente de outras variáveis ambientais. Quando um processo é iniciado, o Windows combina a Path com escopo do usuário com a Pathescopo da máquina .

  • Recuperar o PSModulePath com escopo do usuário
  • Comparar com o processo herdado PSModulePath variá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 System32 vem da máquina definida PSModulePath portanto, não precisa ser adicionado explicitamente
    • Se diferente, trate como se o usuário o tivesse modificado explicitamente e não anexe AllUsersPSModulePath
  • Prefixo com caminhos de usuário, sistema e $PSHOME 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 escopo do sistema PSModulePath, use-o em vez do padrão para o sistema

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 é 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, 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 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 valores de PSModulePath como expandido cadeias de caracteres, 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)

Consulte também