Defina a variável de ambiente PSModulePath com o PowerShell no Windows 10

2

Eu não entendo isso. Então, atualmente, minha variável de ambiente do sistema chamada "PSModulePath" é assim:

%ProgramFiles%\WindowsPowerShell\Modules;%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules

Agora observe o seguinte script do PowerShell:

$envarname = "PSModulePath"
$envar = (get-item env:$envarname).Value
[Environment]::SetEnvironmentVariable($envarname, $envar + ";C:\Expedited", "Machine")

Tudo o que deve estar fazendo é adicionar o caminho "C: \ Expedited" à variável de ambiente PSModulesPath, certo? Bem, depois de executar esse script como administrador, a variável de ambiente PSModulePath é alterada para isso:

C:\Users\Username\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules;C:\Expedited

Observe como:

  1. Havia originalmente dois caminhos, cada um contendo sinais de porcentagem (variáveis) no original, mas depois todos eles foram alterados diretamente em caminhos codificados.
  2. O caminho "C: \ Usuários \ Nome de usuário \ Documents \ WindowsPowerShell \ Modules" surgiu do nada (não estava no original!)

Eu não tenho ideia de por que essas duas coisas aconteceram. Ao adicionar um caminho a essa variável, gostaria de mantê-la o mais próximo possível do original, e não fazer todas essas outras alterações. Existe alguma maneira de preservar os sinais percentuais que foram perdidos? Como edito essa variável de ambiente corretamente no PowerShell?

    
por jippyjoe4 16.07.2018 / 21:49

2 respostas

2

PowerShell - Obtenha variáveis ambientais do SO sem expandir

Você pode usar o cmdlet Get-Item com o parâmetro -path e passar o caminho do a chave do registro que contém a variável ambiental PSModulePath .

Você pode então usar o RegistryKey.GetValue Método juntamente com DoNotExpandEnvironmentNames para obtenha o valor da string da variável ambiental PSModulePath sem expandi-la.

PowerShell

$envarname = "PSModulePath"
$regkey    = Get-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$envar     = $regkey.GetValue($envarname, "", "DoNotExpandEnvironmentNames")
ECHO $envar

Note: You will want to be sure you run this from administrator elevated PowerShell command prompt or ISE screen for it to work correctly.

Maisrecursos

  • HowTo: defina um Variável de Ambiente no Windows - Linha de Comando e Registro

    The location of the user variables in the registry is: HKEY_CURRENT_USER\Environment. The location of the system variables in the registry is:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    

    When setting environment variables through the registry, they will not recognized immediately. One option is to log out and back in again. However, we can avoid logging out if we send a WM_SETTINGCHANGE message, which is just another line when doing this programatically, however if doing this on the command line it is not as straightforward.

  • Get-Item

  • Método RegistryKey.GetValue

    Retrieves the value associated with the specified name and retrieval options. If the name is not found, returns the default value that you provide.

  • Método RegistryKey.GetValue (String, Object, RegistryValueOptions)

    Use this overload to specify special processing of the retrieved value. For example, you can specify RegistryValueOptions.DoNotExpandEnvironmentNames when retrieving a registry value of type RegistryValueKind.ExpandString to retrieve the string without expanding embedded environment variables.

por 18.07.2018 / 01:13
0

Você está realizando etapas adicionais que não são realmente necessárias para sua meta final. Basta usar o padrão, conforme mostrado na orientação MS.

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-6

Portanto, com base no artigo acima, você só precisará do último exemplo, ou apenas de uma linha, usando as variáveis de ambiente padrão / automáticas integradas.

[System.Environment]::SetEnvironmentVariable("PSModulePath", $Env:PSModulePath + ";C:\Expedited","Machine")
    
por 17.07.2018 / 01:32