Usar o PowerShell para definir variáveis de ambiente Windows, ler variáveis de ambiente e criar novas variáveis de ambiente é fácil uma vez que se conhece o truque. Os truques que aprender neste artigo irão funcionar para as variáveis de ambiente do Windows 10, bem como para qualquer cliente/servidor Windows após o Windows 7 SP1/Windows Server 2008.
PowerShell fornece muitas formas diferentes de interagir com as variáveis de ambiente Windows a partir do $env:
PSDrive. o registo, e o .NET class. Aprenderá sobre cada método incluindo a compreensão do âmbito da variável de ambiente neste passo-a-passo.
Table of Contents
Pressupostos
Através deste artigo, utilizarei o Windows PowerShell 5.1 no Windows 10. Mas se tiver qualquer versão do Windows PowerShell depois da 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?
Variáveis de Ambiente, como o nome sugere, armazenar informação sobre o ambiente que é utilizado pelo Windows e aplicações. As variáveis de ambiente podem ser acedidas por aplicações gráficas como o Windows Explorer e editores de texto simples como o Notepad, bem como o cmd.exe e PowerShell.
Utilizar variáveis de ambiente ajuda-o a evitar caminhos de ficheiros de codificação dura, nomes de utilizadores ou computadores e muito mais nos seus scripts ou módulos PowerShell.
Variáveis de Ambiente Comuns
Quando começar a aprender mais sobre como trabalhar com variáveis de ambiente no PowerShell, deparar-se-á com 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 a sua utilização como referência.
Variavel | Usage |
---|---|
ClientName | O nome do computador remoto ligado através de uma sessão de Desktop Remoto. |
SessionName | Isto ajuda a identificar se a sessão actual do Windows é considerada pelo sistema operativo como sendo executada na consola. Para sessões de consola, SessionName será ‘Console’. As ligações melhoradas de Sessão a máquinas virtuais Hyper-V não reportam SessionName como ‘Console’, enquanto que as Sessões Padrão fazem. |
ComputerName | O nome do computador. |
O caminho para a instalação actual do Windows. | |
As localizações padrão para programas x64 e x86. | |
ProgramW6432 | A localização padrão para programas, evitando o redireccionamento de 32/64 bits. Esta variável só se aplica a processos de 32 bits em execução numa plataforma de 64 bits. Isto significa que pode utilizá-la para identificar quando uma instância de 32 bit do PowerShell está a correr num sistema de 64 bit. |
UserDNSDomain | O nome de domínio totalmente qualificado do domínio Active Directory no qual o utilizador actual iniciou sessão. Apenas presente para logons de domínio. |
UserDomain | O nome do domínio ao estilo NETBIOS em que o utilizador actual iniciou sessão. Pode ser um nome de computador se não houver domínio. |
A localização da cópia central do perfil de roaming para o utilizador, se existir. Apenas presente para logons de domínio. | |
UserName | O nome do utilizador actualmente ligado. |
UserProfile | A localização do perfil do utilizador actual no computador local. |
Escopos das variáveis de ambiente
Existem três escopos de variáveis de ambiente. Pense nos âmbitos como camadas de variáveis que se acumulam para dar uma imagem total. Combinadas, estas “camadas” fornecem muitas variáveis de ambiente diferentes a qualquer processo em execução no Windows.
Escopo da variável de ambiente “Hierarquia”
Cada uma destas “camadas” ou combinam-se ou sobregravam-se umas às outras. São definidas numa hierarquia como: machine -> user -> process with each scoped variable overwriting the parent variable if one exists in the parent scope.
For example, a common environment variable is TEMP
. Esta variável armazena o caminho da pasta para a pasta temporária local do Windows. Esta variável de ambiente é definida para:
se não houver TEMP
variável de ambiente definida no âmbito do utilizador então o resultado final será C:\WINDOWS\TEMP
.
Tipos de variáveis de ambiente no âmbito da máquina
Existem três âmbitos diferentes de variáveis de ambiente no Windows.
Máquina
As variáveis de ambiente no âmbito da máquina estão associadas com a instância em execução do Windows. Qualquer conta de utilizador pode lê-las, mas a sua definição, alteração ou eliminação precisa de ser feita com privilégios elevados.
Utilizador
Varáveis de ambiente no âmbito do utilizador estão associadas ao utilizador que executa o processo actual. As variáveis de utilizador sobrescrevem variáveis com o mesmo nome.
Nota: A Microsoft recomenda que os valores das variáveis de ambiente de máquina e de utilizador com o mesmo nome não contenham mais de 2048 caracteres.
Processo
As variáveis de ambiente no âmbito do processo são uma combinação dos âmbitos da máquina e do utilizador, juntamente com algumas variáveis que o Windows cria dinamicamente.
Below é uma lista de variáveis de ambiente disponíveis para um processo em execução. Todas estas variáveis são criadas de forma dinâmica.
ALLUSERSPROFILE
APPDATA
-
COMPUTERNAME
HOMEDRIVE
HOMEPATH
-
LOCALAPPDATA
LOGONSERVER
PROMPT
PUBLIC
SESSION
-
SystemDrive
SystemRoot
USERDNSDOMAIN
USERDOMAIN
USERDOMAIN_ROAMINGPROFILE
USERNAME
USERPROFILE
Variáveis de Ambiente no Registo
Variáveis de Ambiente são armazenadas em dois locais de registo, uma para o âmbito do utilizador e outra para o âmbito da máquina.
Não Utilizar o Registo para Gerir Variáveis de Ambiente
Existe um senão quando se fazem alterações a variáveis dentro do registo. Quaisquer processos em execução não verão alterações de variáveis no registo. Os processos só vêem as variáveis e valores do registo que estavam presentes quando o processo foi iniciado, a menos que o Windows as notifique de que houve uma alteração.
Em vez de modificar directamente o registo, pode utilizar uma classe .NET em vez disso. A classe .NET pode modificar as variáveis de máquina e de ambiente do utilizador e tratar da manutenção do registo por si.
Modificar variáveis de ambiente no registo directamente, embora possível, não faz sentido. A classe .NET oferece uma abordagem mais simples, suportada pela Microsoft. Aprenderá a utilizar o classe .NET mais tarde neste artigo.
Locais de Registo e Consulta de Variáveis de Ambiente
Espero que tenha sido convencido a não modificar directamente o registo, mas se quiser dar uma espreitadela ao que lá está, pode encontrar todas as variáveis de ambiente do utilizador na chave HKEY_CURRENT_USER\Environment
. As variáveis de ambiente de máquina são armazenadas em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
Dentro de qualquer uma destas chaves encontram-se valores de registo do tipo REG_SZ
ou REG_EXPAND_SZ
REG_EXPAND_SZ
valores contêm variáveis de ambiente incorporadas como parte do seu valor. Estas variáveis de ambiente são expandidas quando o valor é recuperado.
Para demonstrar isto, usar a utilidade REG
. Este é um pequeno utilitário de linha de comando incluído com Windows.
P>Query the TEMP
variável de ambiente como se vê abaixo. Executar REG
com a variável QUERY
parâmetro para recuperar o valor da variável TEMP
.
> REG QUERY HKCU\Environment /V TEMPHKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
Por vezes notará variáveis de ambiente exibidas rodeadas por símbolos percentuais (
%COMPUTERNAME%
) como acima. Esta é a forma antiga de mostrar as variáveis de ambiente através de cmd.exe e ficheiros de lote. Saiba que o PowerShell não reconhece este formato.
The REG
utilidade permite-nos ver o valor nativo do valor do registo. 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 de registo, pode assim usar o Get-Item
cmdlet como se mostra abaixo.
Ver e Definir Variáveis de Ambiente Windows através da GUI
Para ver uma vista GUI das variáveis de ambiente do utilizador e do sistema, executar SystemPropertiesAdvanced.exe a partir do PowerShell, um prompt de comando ou a partir da Tecla+R do Windows para exibir o separador System Properties Advanced. Clique no botão EnvironmentVariables, que se encontra destacado na imagem abaixo.
O diálogo Variáveis de Ambiente, mostrado abaixo, permite visualizar, criar e modificar variáveis de ambiente de utilizador e de máquina. Note-se que o diálogo se refere a variáveis de âmbito de máquina como variáveis de Sistema.
Agora que tenha uma compreensão das variáveis de ambiente, vamos ao que está aqui a fazer, gerindo-as com PowerShell!
Existem algumas formas diferentes de interagir com variáveis de ambiente usando PowerShell.
- The
Env:
PSDrive and Provider – session-based. Apenas define os valores das variáveis de ambiente para a actual sessão PowerShell -
$env:
variáveis – baseadas na sessão. Apenas define os valores das variáveis de ambiente para a actual sessão PowerShell - O
.NET Class – permite persistir variáveis de ambiente de utilizador e de sistema através de sessões e reinícios
O Env: PSDrive e Fornecedor
Uma das melhores formas de ler variáveis de ambiente é um conceito PowerShell conhecido como unidades PowerShell (unidades PS). Uma unidade PS permite tratar as variáveis de ambiente como se fossem um sistema de ficheiros através da unidade Env:
.
Mudando para o Env:
Unidade
Como todas as unidades PS, referencia-se através de caminhos como Env:\TEMP
Env:\COMPUTERNAME
, etc. Mas para guardar algumas teclas, mude para a unidade Env:
, tal como faria com qualquer unidade de sistema de ficheiros, como se mostra abaixo.
PS51> cd Env:PS51 Env:\>## orPS51> Set-Location Env:PS Env:\>
Tab-Completion com o Env:
Drive
Pode usar os mesmos comandos que usaria para aceder a um sistema de ficheiros, tais como Get-Item
e Get-ChildItem
para aceder a variáveis de ambiente. Mas em vez do sistema de ficheiros, está a ler o Env:
drive.
porque as variáveis de ambiente são armazenadas numa drive PS, pode usar a função de preenchimento de tabulação do PowerShell para percorrer as variáveis disponíveis, como se mostra abaixo.
Vamos agora saltar para alguns exemplos de como se pode usar o Env:
drive PS para trabalhar com variáveis de ambiente.
Listagem de variáveis de ambiente com Env:
PS51> Get-Item -Path Env:PS51> Get-Item -Path Env:USERNAME
Listing Environment Variables Using a Wildcard with Env:
PS51> Get-Item -Path Env:user*
Listar Variáveis de Ambiente com Env:
PS51> Get-Item -Path Env:user*
Listar variáveis de ambiente com Env:
Os resultados destes comandos são chave/valor objectos .NET. Estes objectos contêm o nome da variável de ambiente no
Name
propriedade e o valor no Value
propriedade.
p>É possível aceder a um valor específico de uma variável de ambiente envolvendo a propriedade Get-Item
referência de comando entre parênteses e referenciando a propriedade Value
como se mostra abaixo:
PS51> (Get-Item -Path Env:computername).ValueMYCOMPUTERHOSTNAME
Em situações em que só é necessário devolver certas variáveis de ambiente, usar os cmdlets padrão PowerShell como Select-Object
e Where-Object
para seleccionar e filtrar os objectos devolvidos pelo Env:
fornecedor.
No exemplo abaixo, apenas a variável de ambiente COMPUTERNAME
é devolvida.
PS51> Get-ChildItem -Path Env: | Where-Object -Property Name -eq 'COMPUTERNAME'
Como método alternativo, utilizar o Get-Content
cmdlet. Este cmdlet retorna um objecto contendo o valor da variável ambiente. Este objecto é mais simples de tratar, pois devolve apenas o valor, em vez de um objecto com
Name
e Value
propriedades.
PS51> Get-Content -Path Env:\COMPUTERNAME
Demo: Inserindo Valores de Ambiente numa String
Using Get-Content
, pode encontrar o valor de uma variável de ambiente e inserir a variável de ambiente COMPUTERNAME
, por exemplo, numa string de texto.
PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)Computer Name is: MYCOMPUTER
Definir uma Variável de Ambiente (E Criar) com Env:
Criar novas variáveis de ambiente com o PowerShell usando o New-Item
cmdlet. Fornecer o nome da variável de ambiente na forma Env:\<EnvVarName>
para o parâmetro Name
valor e o valor da variável de ambiente para o parâmetro Value
como se mostra abaixo.
PS51> New-Item -Path Env:\MYCOMPUTER -Value MY-WIN10-PCName Value---- -----MYCOMPUTER MY-WIN10-PC
Utilizar o Set-item
cmdlet para definir uma variável de ambiente, ou criar uma nova se esta ainda não existir. Pode ver abaixo usando o Set-Item
cmdlet, tanto pode criar ou modificar e variável de ambiente.
PS51> Set-Item -Path Env:testvariable -Value "Alpha"
Copiar uma variável de ambiente com Env:
Por vezes surge a situação de que é necessário replicar o valor de uma variável de ambiente. Pode fazê-lo utilizando a variável Copy-Item
cmdlet.
Below pode ver que o valor da variável de ambiente COMPUTERNAME
é copiado para MYCOMPUTER
, substituindo o seu valor existente.
Removendo uma Variável de Ambiente com Env:
Situações surgirão onde uma variável de ambiente já não é necessária. Pode-se remover variáveis de ambiente utilizando um de três métodos:
- Utilizar o
Set-Item
cmdlet para definir uma variável de ambiente para um valor vazio
/ul>
PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''
ul>>>li>Utilizar oRemover-Item
cmdlet.
PS51> Remove-Item -Path Env:\MYCOMPUTER
- Utilizar o
Clear-Item
cmdlet.
PS51> Clear-Item -Path Env:\MYCOMPUTER
Renomear uma Variável de Ambiente com Env:
Em situações em que o nome de uma variável de ambiente precisa de ser alterado, tem a opção de renomear, em vez de apagar e recriar com o Env:
provider.
p>Utilizar oRename-Item
cmdlet para alterar o nome de uma variável de ambiente mantendo o seu valor. Abaixo pode ver-se que a variávelMYCOMPUTER
é renomeada paraOLDCOMPUTER
mantendo o seu valor.
$Env: Variables
Having mastered the Env:
drive to treat environment variables as files, esta secção mostra-lhe como tratá-las como variáveis. Outra forma de gerir variáveis de ambiente em sessão é utilizando o Parser de Expressão PowerShell. Esta funcionalidade permite-lhe utilizar o $Env:
escopo para aceder a variáveis de ambiente.
Obter uma Variável de Ambiente com $Env:
usando o $Env
âmbito, pode fazer referência directa a variáveis de ambiente sem usar um comando como Get-Item
como se mostra abaixo.
PS51> $env:computername
Este método facilita a inserção de variáveis de ambiente em strings como abaixo:
Definir ou Criar uma Variável de Ambiente com $Env:
A definição de uma variável de ambiente utilizando este método é simples. Isto também criará uma nova variável de ambiente se ainda não existir como abaixo.
PS51> $env:testvariable = "Alpha"
Utilizar o +=
sintaxe para adicionar a um valor existente, em vez de o sobrescrever.
PS51> $env:testvariable = "Alpha"PS51> $env:testvariable += ",Beta"PS51> $env:testvariableAlpha,Beta
Removendo uma Variável de Ambiente com $Env:
Para remover uma variável de ambiente usando este método, basta definir o seu valor para uma string vazia.
PS51> $env:testvariable = ''
Usando a classe .NET
A classe .NET oferece também métodos para obter e definir variáveis de ambiente. Este é apenas um método para aceder directamente a vários âmbitos de ambiente e definir variáveis de ambiente que sobrevivem através das sessões PowerShell.
Em todos os exemplos seguintes, se não for fornecido nenhum âmbito, assume-se o âmbito do processo.
Ao utilizar o , utilizará alguns métodos diferentes de classe estática .NET. Não precisa de compreender o que é um método estático. Só precisa de compreender para usar qualquer uma das técnicas que está prestes a aprender, precisará primeiro de referir a classe (
) seguida de dois colons (
::
) depois seguido do método.
Listing Environment Variables with
Se desejar ver todas as variáveis de ambiente num determinado âmbito, utilizaria o método GetEnvironmentVariables
. Este método retorna todas as variáveis de ambiente pelo âmbito especificado como argumento do método (entre parênteses).
Obter variáveis de ambiente únicas com
Se precisar de encontrar uma variável de ambiente específica, pode fazê-lo de duas maneiras diferentes.
-
GetEnvironmentVariables().<var name>
– não recomendado - >
GetEnvironmentVariable('<var name>','<scope>')
GetEnvironmentVariables()
usando o método GetEnvironmentVariables()
, usa-se a notação de pontos para referenciar o valor. Coloque entre parênteses o referência de classe e método estático seguido de um ponto e depois o nome da variável de ambiente como abaixo:
PS51> (::GetEnvironmentVariables()).APPDATA
Note que ao referenciar as variáveis de ambiente desta forma, deve assegurar-se de que corresponde à capitalização! No exemplo acima, tente referenciar a variável
APPDATA
usandoappdata
. Utilize em vez disso oGetEnvironmentVariable()
.
GetEnvironmentVariable()
p>Couro do que utilizar o método GetEnvironmentVariables()
, em vez disso utilizar GetEnvironmentVariable()
para encontrar variáveis de ambiente únicas. Contorna a questão com capitalização e também permite especificar o âmbito.
Para utilizar este método, especificar o nome da variável de ambiente e o âmbito que gostaria de procurar por essa variável em separado por vírgula.
Definir uma variável de ambiente com
Utilizar o método SetEnvironmentVariable()
para definir o valor de uma variável de ambiente para o âmbito dado, ou criar uma nova se ainda não existir.
Quando definir variáveis no âmbito do processo, verificará que o âmbito do processo é volátil enquanto as alterações no âmbito do utilizador e da máquina são permanentes.
Nota: Chamando o método SetEnvironmentVariable com um nome de variável ou valor de 32767 caracteres ou mais fará com que seja lançada uma excepção.
Removendo uma variável de ambiente com
Utilizar o método SetEnvironmentVariable()
para remover uma variável de ambiente para o âmbito dado, definindo o seu valor para uma cadeia vazia.
Variáveis de ambiente úteis PowerShell
Tal como muitas outras aplicações Windows, PowerShell tem algumas variáveis de ambiente próprias. Duas variáveis de ambiente úteis a conhecer são PSExecutionPolicyPreference
e PSModulePath
.
PSExecutionPolicyPreference
The PSExecutionPolicyPreference
variável de ambiente armazena a actual política de execução PowerShell. É criada se uma política de execução PowerShell específica da sessão for definida por:
- Executar o
Set-ExecutionPolicy
cmdlet com umScope
parâmetro deProcess
- Executar o executável para iniciar uma nova sessão, usando o parâmetro
ExecutionPolicy
linha de comando para definir uma política para a sessão.
PSModulePath
O PSModulePath
variável de ambiente contém o caminho que o PowerShell procura por módulos se não especificar um caminho completo. É formado muito semelhante ao padrão PATH
variável de ambiente, com caminhos de directório individuais separados por ponto e vírgula.
PS51> $env:PSModulePathC:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
Dica rápida: Dividir cada pasta para obter uma matriz de strings para processar cada caminho individualmente usando $env:PSModulePath.split(‘;’)
Resumo
Variáveis ambientais são um método útil para obter informação sobre um sistema em execução, ou armazenar informação através de sessões e reinicializações. Quer esteja apenas a ler as variáveis de ambiente padrão do sistema operativo Windows e a criar as suas próprias, pode agora geri-las usando uma variedade de formas com PowerShell!
Leitura adicional
- sobre_Ambiente_Variáveis
- A Classe .NET nos documentos da Microsoft
- Aprenda o formato de string PowerShell e expandindo strings