Usando o PowerShell para definir variáveis de ambiente do Windows, ler variáveis de ambiente e criar novas variáveis de ambiente é fácil assim que você conhece o truque. Os truques que você aprende neste artigo funcionarão para variáveis de ambiente do Windows 10, bem como para qualquer cliente/servidor Windows após o Windows 7 SP1/Windows Server 2008.
O PowerShell oferece muitas maneiras diferentes de interagir com as variáveis de ambiente do Windows a partir do PSDrive $env:
, do registro e da classe [System.Environment]
.NET. Você aprenderá sobre cada método, incluindo entender o escopo das variáveis de ambiente neste passo a passo.
Pressupostos
Ao longo deste artigo, estarei usando o Windows PowerShell 5.1 no Windows 10. Mas se você tiver qualquer versão do Windows PowerShell posterior à v3 no Windows 7 SP1 ou posterior, as técnicas que estou prestes a mostrar devem funcionar muito bem.
O que são Variáveis de Ambiente?
As variáveis de ambiente, como o nome sugere, armazenam informações sobre o ambiente que é utilizado pelo Windows e pelas aplicações. As variáveis de ambiente podem ser acessadas por aplicativos gráficos como o Windows Explorer e editores de texto simples como o Notepad, bem como pelo cmd.exe e PowerShell.
O uso de variáveis de ambiente ajuda você a evitar a codificação rígida de caminhos de arquivos, nomes de usuário ou computador e muito mais em seus scripts ou módulos do PowerShell.
Variáveis de Ambiente Comuns
À medida que você aprende mais sobre como trabalhar com variáveis de ambiente no PowerShell, você encontrará muitas variáveis diferentes. Algumas são mais úteis do que outras. Abaixo está uma lista de algumas das variáveis de ambiente comuns e seu uso como referência.
Variable | Usage |
---|---|
ClientName | The name of the remote computer connected via a Remote Desktop session. |
SessionName | This helps to identify if the current Windows session is regarded by the operating system as running at the console. For console sessions SessionName will be ‘Console’. Enhanced Session connections to Hyper-V Virtual Machines do not report SessionName as ‘Console’, whereas Standard Sessions do. |
ComputerName | The name of the computer. |
SystemRoot and Windir | The path to the current Windows installation. |
ProgramFiles and ProgramFiles(x86) | The default locations for x64 and x86 programs. |
ProgramW6432 | The default location for programs, avoiding 32/64 bit redirection. This variable only applies for 32 bit processes running on a 64 bit platform. This means that you can use it to identify when a 32 bit instance of PowerShell is running on a 64 bit system. |
UserDNSDomain | The Fully Qualified Domain Name of the Active Directory domain that the current user logged on to. Only present for domain logons. |
UserDomain | The NETBIOS-style name of the domain that the current user logged on to. Can be a computer name if there’s no domain. |
UserDomainRoamingProfile | The location of the central copy of the roaming profile for the user, if any. Only present for domain logons. |
UserName | The name of the currently logged on user. |
UserProfile | The location of the profile of the current user on the local computer. |
Escopos de Variáveis de Ambiente
Há três escopos de variáveis de ambiente. Pense nos escopos como camadas de variáveis que se acumulam para dar uma imagem completa. Combinados, essas “camadas” fornecem muitas variáveis de ambiente diferentes para qualquer processo em execução no Windows.
Hierarquia dos Escopos de Variáveis de Ambiente
Cada uma dessas “camadas” combina ou sobrescreve a outra. Elas são definidas em uma hierarquia como: máquina -> usuário -> processo, com cada variável de escopo sobregravando a variável pai se uma existir no escopo pai.
Por exemplo, uma variável de ambiente comum é TEMP
. Essa variável armazena o caminho da pasta temporária local do Windows. Esta variável de ambiente é definida como:
C:\WINDOWS\TEMP
in the machine scopeC:\Users\<username>\AppData\Local\Temp
in the user scopeC:\Users\<username>\AppData\Local\Temp
in the process scope.
Se não houver uma variável de ambiente TEMP
definida no escopo usuário, o resultado final será C:\WINDOWS\TEMP
.
Tipos de Escopos de Variáveis de Ambiente
Há três tipos diferentes de escopos de variáveis de ambiente no Windows.
Máquina
As variáveis de ambiente no escopo máquina estão associadas à instância em execução do Windows. Qualquer conta de usuário pode lê-las, mas defini-las, alterá-las ou excluí-las precisa ser feito com privilégios elevados.
Usuário
Variáveis de ambiente no escopo do usuário estão associadas ao usuário que está executando o processo atual. Variáveis de usuário sobrescrevem variáveis de escopo de máquina com o mesmo nome.
Nota: A Microsoft recomenda que os valores das variáveis de ambiente de escopo de Máquina e Usuário não contenham mais que 2048 caracteres.
Processo
Variáveis de ambiente no escopo do processo são uma combinação dos escopos máquina e usuário, juntamente com algumas variáveis que o Windows cria dinamicamente.
Abaixo está uma lista de variáveis de ambiente disponíveis para um processo em execução. Todas essas variáveis são criadas dinamicamente.
ALLUSERSPROFILE
APPDATA
COMPUTERNAME
HOMEDRIVE
HOMEPATH
LOCALAPPDATA
LOGONSERVER
PROMPT
PUBLIC
SESSION
SystemDrive
SystemRoot
USERDNSDOMAIN
USERDOMAIN
USERDOMAIN_ROAMINGPROFILE
USERNAME
USERPROFILE
Variáveis de Ambiente no Registro
Variáveis de ambiente são armazenadas em duas localizações do registro, uma para o escopo do usuário e outra para o escopo da máquina.
Não use o Registro para gerenciar variáveis de ambiente
Existe uma restrição ao fazer alterações em variáveis dentro do registro. Quaisquer processos em execução não verão as alterações nas variáveis do registro. Os processos só veem as variáveis e valores do registro que estavam presentes quando o processo foi iniciado, a menos que o Windows os notifique que houve uma alteração.
Em vez de modificar diretamente o registro, você pode usar uma classe .NET. A classe .NET [System.Environment]
pode modificar variáveis de ambiente com escopo de máquina e usuário e lidar com a administração do registro para você.
Modificar variáveis de ambiente diretamente no registro, embora possível, não faz sentido. A classe .NET oferece uma abordagem mais simples e suportada pela Microsoft. Você aprenderá sobre o uso da classe .NET [System.Environment]
mais adiante neste artigo.
Localizações do Registro de Variáveis de Ambiente e Consulta
I hope you’ve been convinced to not modify the registry directly but if you’d like to take a peek at what’s in there, you can find all user environment variables in the HKEY_CURRENT_USER\Environment
key. Machine-scoped environment variables are stored at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
Dentro de uma dessas chaves estão valores do registro do tipo REG_SZ
ou REG_EXPAND_SZ
. Os valores REG_EXPAND_SZ
contêm variáveis de ambiente incorporadas como parte de seu valor. Essas variáveis de ambiente são expandidas quando o valor é recuperado.
Para demonstrar isso, use a utilitário REG
. Este é um pequeno utilitário de linha de comando incluído no Windows.
Consulte a variável de ambiente TEMP
conforme mostrado abaixo. Execute REG
com o parâmetro QUERY
para recuperar o valor da variável TEMP
.
Às vezes, você notará variáveis de ambiente exibidas entre símbolos de porcentagem (
%COMPUTERNAME%
) como acima. Esta é a maneira antiga de mostrar variáveis de ambiente via cmd.exe e arquivos em lote. Saiba que o PowerShell não reconhece este formato.
O utilitário REG
nos permite ver o valor nativo do valor do registro. O tipo de valor é REG_EXPAND_SZ
e o valor contém a variável de ambiente %USERPROFILE%
.
Se preferir usar o PowerShell para recuperar o valor do registro, você pode fazer isso usando o cmdlet Get-Item
conforme mostrado abaixo.
Visualizar e Definir Variáveis de Ambiente do Windows via GUI
Para ver uma visualização da GUI das variáveis de ambiente do usuário e do sistema, execute SystemPropertiesAdvanced.exe do PowerShell, de um prompt de comando ou pressione a tecla Windows+R para exibir a aba Propriedades do Sistema Avançadas. Clique no botão Variáveis de ambiente, que está destacado na imagem abaixo.

A caixa de diálogo Variáveis de Ambiente, mostrada abaixo, permite que você visualize, crie e modifique variáveis de ambiente com escopo de usuário e de máquina. Observe que a caixa de diálogo se refere às variáveis com escopo de máquina como variáveis do sistema.

Agora que você tem uma compreensão das variáveis de ambiente, vamos ao que você veio buscar, gerenciando-as com PowerShell!
Existem algumas maneiras diferentes de interagir com variáveis de ambiente usando o PowerShell.
- O PSDrive e Provedor
Env:
– baseado em sessão. Apenas define os valores das variáveis de ambiente para a sessão atual do PowerShell - Variáveis
$env:
– baseado em sessão. Apenas define os valores das variáveis de ambiente para a sessão atual do PowerShell - A Classe .NET
[System.Environment]
– permite persistir variáveis de ambiente com escopo de usuário e de sistema entre sessões e reinicializações
O PSDrive e Provedor Env:
Uma das melhores maneiras de ler variáveis de ambiente é um conceito do PowerShell conhecido como drives do PowerShell (PS drives). Um PS drive permite tratar as variáveis de ambiente como se fossem um sistema de arquivos através do drive Env:
.
Mudando para o Drive Env:
Como todos os PS drives, você faz referência a ele através de caminhos como Env:\TEMP
, Env:\COMPUTERNAME
, etc. Mas para economizar digitação, mude para o drive Env:
assim como faria com qualquer drive de sistema de arquivos, como mostrado abaixo.
Completando com Tabulação com o Drive Env:
Você pode usar os mesmos comandos que usaria para acessar um sistema de arquivos, como Get-Item
e Get-ChildItem
para acessar variáveis de ambiente. Mas, em vez do sistema de arquivos, você está lendo a unidade Env:
.
Porque as variáveis de ambiente são armazenadas em uma unidade PS, você pode usar o recurso de conclusão de guia do PowerShell para percorrer as variáveis disponíveis, como mostrado abaixo.

Agora, vamos dar uma olhada em alguns exemplos de como você pode usar a unidade Env:
para trabalhar com variáveis de ambiente.
Listando Variáveis de Ambiente com Env:
Listando Variáveis de Ambiente Usando um Wildcard com Env:
Encontrando Valores de Variáveis de Ambiente com Env:
Os resultados desses comandos são objetos .NET chave/valor [System.Collections.DictionaryEntry]
. Esses objetos contêm o nome da variável de ambiente na propriedade Name
e o valor na propriedade Value
.
Você pode acessar um valor específico de uma variável de ambiente envolvendo a referência de comando Get-Item
entre parênteses e referenciando a propriedade Value
, como mostrado abaixo:
Em situações em que você precisa retornar apenas certas variáveis de ambiente, use cmdlets padrão do PowerShell, como Select-Object
e Where-Object
para selecionar e filtrar os objetos retornados pelo provedor Env:
.
No exemplo abaixo, apenas a variável de ambiente COMPUTERNAME
é retornada.
Como método alternativo, utilize o cmdlet Get-Content
. Este cmdlet retorna um objeto [String]
contendo o valor da variável de ambiente. Este objeto é mais simples de lidar, pois retorna apenas o valor, ao invés de um objeto com propriedades Name
e Value
.
Demonstração: Inserindo Valores de Ambiente em uma String
Usando Get-Content
, você pode encontrar o valor de uma variável de ambiente e inserir, por exemplo, a variável de ambiente COMPUTERNAME
em uma string de texto.
Configurando uma Variável de Ambiente (e Criando) com Env:
Crie novas variáveis de ambiente com o PowerShell usando o cmdlet New-Item
. Forneça o nome da variável de ambiente no formato Env:\<EnvVarName>
para o valor de Name
e o valor da variável de ambiente para o parâmetro Value
, conforme mostrado abaixo.
Utilize o cmdlet Set-item
para definir uma variável de ambiente, ou crie uma nova se ela ainda não existir. Você pode ver abaixo que usando o cmdlet Set-Item
, você pode tanto criar quanto modificar uma variável de ambiente.
Copiando uma Variável de Ambiente com Env:
Às vezes surge a situação em que você precisa replicar o valor de uma variável de ambiente. Você pode fazer isso usando o cmdlet Copy-Item
.
Abaixo você pode ver que o valor da variável COMPUTERNAME
é copiado para MYCOMPUTER
, sobrescrevendo seu valor existente.
Removendo uma Variável de Ambiente com Env:
Situações surgirão em que uma variável de ambiente não é mais necessária. Você pode remover variáveis de ambiente usando um dos três métodos:
- Use o cmdlet
Set-Item
para definir uma variável de ambiente como um valor vazio
- Use o cmdlet
Remove-Item
.
- Use o cmdlet
Clear-Item
.
Renomeando uma Variável de Ambiente com Env:
Em situações em que o nome de uma variável de ambiente precisa ser alterado, você tem a opção de renomear, em vez de excluir e recriar com o provedor Env:
.
Use o cmdlet Rename-Item
para alterar o nome de uma variável de ambiente mantendo o seu valor. Abaixo, você pode ver que pode ver que a variável MYCOMPUTER
é renomeada para OLDCOMPUTER
mantendo o seu valor.
$Env:
Variáveis
Depois de dominar a unidade Env:
para tratar variáveis de ambiente como arquivos, esta seção mostra como tratá-las como variáveis. Outra maneira de gerenciar variáveis de ambiente na sessão é usando o PowerShell Expression Parser. Esta função permite que você use o escopo $Env:
para acessar variáveis de ambiente.
Obtendo uma Variável de Ambiente com $Env:
Usando o escopo $Env
, você pode referenciar variáveis de ambiente diretamente sem usar um comando como Get-Item
, como mostrado abaixo.
Este método facilita a inserção de variáveis de ambiente em strings, como abaixo:
Configurando ou Criando uma Variável de Ambiente com $Env:
Configurar uma variável de ambiente usando este método é direto. Isso também criará uma nova variável de ambiente se uma já não existir, como abaixo.
Use a sintaxe +=
para adicionar a um valor existente, em vez de sobrescrevê-lo.
Removendo uma Variável de Ambiente com $Env:
Para remover uma variável de ambiente usando este método, basta definir o seu valor como uma string vazia.
Usando a classe [System.Environment]
do .NET
A classe .NET [System.Environment]
oferece métodos para obter e definir variáveis de ambiente também. Este é o único método para acessar diretamente vários escopos de ambiente e definir variáveis de ambiente que persistem através das sessões do PowerShell.
Em todos os exemplos seguintes, se nenhum escopo for fornecido, assume-se o escopo do processo.
Ao usar a classe [System.Environment]
, você usará alguns métodos diferentes da classe estática .NET. Você não precisa entender o que é um método estático. Você só precisa entender que para usar qualquer uma das técnicas que está prestes a aprender, você precisará primeiro referenciar a classe ([System.Environment]
), seguida por dois dois pontos (::
) e então pelo método.
Listando Variáveis de Ambiente com [System.Environment]
Se desejar ver todas as variáveis de ambiente em um escopo específico, você usaria o método GetEnvironmentVariables
. Este método retorna todas as variáveis de ambiente pelo escopo especificado como argumento do método (entre parênteses).
Obtendo Variáveis de Ambiente Únicas com [System.Environment]
Se você precisar encontrar uma variável de ambiente específica, pode fazer isso de duas maneiras diferentes.
GetEnvironmentVariables().<nome da variável>
– não recomendadoGetEnvironmentVariable('<nome da variável>','<escopo>')
GetEnvironmentVariables()
Usando o método GetEnvironmentVariables()
, você utiliza a notação de ponto para referenciar o valor. Envolva a classe [System.Environment]
e a referência ao método estático em parênteses, seguido de um ponto e então o nome da variável de ambiente como abaixo:
Observe que ao referenciar variáveis de ambiente dessa maneira, você deve garantir que a capitalização esteja correta! No exemplo acima, tente referenciar a variável
APPDATA
usandoappdata
. Use oGetEnvironmentVariable()
ao invés disso.
GetEnvironmentVariable()
Em vez de usar o método GetEnvironmentVariables()
, use GetEnvironmentVariable()
para encontrar variáveis de ambiente únicas. Isso contorna o problema com a capitalização e também permite que você especifique o escopo.
Para usar este método, especifique o nome da variável de ambiente e o escopo que você gostaria de procurar por aquela variável, separados por vírgula.
Configurando uma Variável de Ambiente com [System.Environment]
Use o método SetEnvironmentVariable()
para definir o valor de uma variável de ambiente para o escopo fornecido, ou criar uma nova se ainda não existir.
Quando você define variáveis no escopo do processo, perceberá que o escopo do processo é volátil, enquanto as alterações nos escopos do usuário e da máquina são permanentes.
Nota: Chamar o método SetEnvironmentVariable com um nome de variável ou valor de 32767 caracteres ou mais causará uma exceção.
Removendo uma Variável de Ambiente com [System.Environment]
Use o método SetEnvironmentVariable()
para remover uma variável de ambiente para o escopo dado, definindo seu valor como uma string vazia.
Variáveis de Ambiente Úteis no PowerShell
Assim como muitos outros aplicativos do Windows, o PowerShell possui algumas variáveis de ambiente próprias. Duas variáveis de ambiente úteis são PSExecutionPolicyPreference
e PSModulePath
.
PSExecutionPolicyPreference
A variável de ambiente PSExecutionPolicyPreference
armazena a política de execução atual do PowerShell. Ela é criada se uma política de execução específica da sessão do PowerShell for definida por:
- Executando o cmdlet
Set-ExecutionPolicy
com um parâmetroScope
deProcesso
- Executando o executável
powershell.exe
para iniciar uma nova sessão, usando o parâmetro de linha de comandoExecutionPolicy
para definir uma política para a sessão.
PSModulePath
A variável de ambiente PSModulePath
contém o caminho que o PowerShell pesquisa para módulos se você não especificar um caminho completo. É formado de forma muito semelhante à variável de ambiente padrão PATH
, com caminhos de diretório individuais separados por ponto e vírgula.
Dica rápida: Divida cada pasta para obter uma matriz de strings para processar cada caminho individualmente usando $env:PSModulePath.split(‘;’)
Resumo
As variáveis de ambiente são um método útil para obter informações sobre um sistema em execução ou armazenar informações entre sessões e reinicializações. Seja apenas lendo as variáveis de ambiente padrão do sistema operacional Windows e criando as suas próprias, agora você pode gerenciá-las usando uma variedade de métodos com o PowerShell!
Leitura adicional
- sobre_Variáveis_de_Ambiente
- A Classe .NET [System.Environment] na documentação da Microsoft
- Aprenda o formato de string do PowerShell e expandindo strings
Source:
https://adamtheautomator.com/powershell-environment-variables/