Adam the Automator

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.

>>SystemRoot e Windir

ProgramFiles and ProgramFiles(x86)

UserDomainRoamingProfile

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_SZREG_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 Propriedades do Sistema, separador Avançado

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.

O diálogo Variáveis de Ambiente

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:\TEMPEnv:\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.

Env: tab completion – encontrar variáveis de ambiente começando com a letra C

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-Itemcmdlet.

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-Itemcmdlet para alterar o nome de uma variável de ambiente mantendo o seu valor. Abaixo pode ver-se que a variávelMYCOMPUTERé renomeada paraOLDCOMPUTERmantendo 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 usando appdata. Utilize em vez disso o GetEnvironmentVariable().

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 um Scope parâmetro de Process
  • 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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *