Compartilhar via


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 . O local do escopo de Todos os Usuários é .
    • Em sistemas não Windows, o local do escopo do CurrentUser específico do usuário é a pasta . O local do escopo de Todos os Usuários é .

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 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 do . Você pode verificar o local da pasta documentos do usando o seguinte comando: .

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
    • mais:
      • Basta usar PSModulePath conforme definido, já que o usuário removeu deliberadamente o local do $PSHOME

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 Pathno 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 AllUsersPSModulePath ao final seguindo a semântica da variável de ambiente Path
      • O caminho System32 do Windows vem do computador definido PSModulePath portanto, não precisa ser adicionado explicitamente
    • Se diferente, trate como se o usuário o tivesse modificado explicitamente e não acrescentasse AllUsersPSModulePath
  • Prefixo com caminhos de usuário, sistema e $PSHOME PS7 nessa ordem
    • Se powershell.config.json contiver um PSModulePathno escopo do usuário, use-o em vez do padrão para o usuário
    • Se powershell.config.json contiver um PSModulePathno escopo do sistema, use-o em vez do padrão para o sistema

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 para arquivos de módulo ( ou ). 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 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 à medida que cadeias de caracteres expandidas, use o método GetValue na sub-chave 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').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