Manipulação com variáveis de ambiente do usuário e do sistema a partir da linha de comando no Windows 10

0

Estou usando os seguintes comandos para definir / remover variáveis de ambiente do usuário / sistema:

SISTEMA:

setx -m PATH "%PATH%C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;"

USER:

setx VAR1 "CONTENT OF VAR1"

Mais tarde, encontrei essas limitações:

  1. Se o %PATH% for muito longo, receberei o seguinte aviso e a variável %PATH% será truncada:

WARNING: The data being saved is truncated to 1024 characters.

  1. Como a ajuda do comando setx diz:

When you use Setx.exe to clear an environment variable value, the environment variable name is not affected

Em outras palavras, quando eu executar setx -m OCVLIBDIR "" , o OCVLIBDIR não será excluído, mas vazio.

Como posso superar essas limitações?

PS: Eu prefiro ferramentas que fazem parte do Windows 10 (por exemplo, PowerShell), mas não é problema usar também ferramentas de terceiros (embora me pareça um exagero).

PPS: Eu sei que é possível editar variáveis via GUI do Windows, registros ou algumas ferramentas GUI de terceiros, mas eu prefiro scripts porque eu posso ter vários cenários com script e alternar rapidamente entre eles. Isso é útil quando estou experimentando várias bibliotecas no meu sistema (por exemplo, várias versões do opencv etc.).

    
por Wakan Tanka 11.08.2016 / 08:49

1 resposta

3

PowerShell

Este artigo do TechNet descreve o básico.

Esta resposta descreve como obter variáveis de ambiente do sistema versus usuário (o que foi sugerido apenas no primeiro artigo). "Machine" para o sistema, "User" para o usuário atual e "Process" para o processo atual que funciona para obter a combinação final do sistema / usuário.

A concatenação do PowerShell é comentada em essa pergunta e suas respostas . Você pode montar strings usando + para concatenar ou usar substituição como em "{0} {1}" -f "Hello","World" .

Os parênteses são usados para agrupar construções.

As variáveis são não tipificadas, não declaradas e começam com $ .

Juntando tudo, você recebe algo como:

$path = [Environment]::GetEnvironmentVariable("PATH","User")
[Environment]::SetEnvironmentVariable("PATH",$path+";C:\Temp","User")

Ou como um verso:

[Environment]::SetEnvironmentVariable("PATH",([Environment]::GetEnvironmentVariable("PATH","User"))+";C:\Temp","User")

Este artigo descreve como excluir variáveis de ambiente ( $null é especial variável):

[Environment]::SetEnvironmentVariable("MyTestVariable",$null,"User")

As alterações nas variáveis de ambiente feitas dessa maneira estão disponíveis globalmente.

CMD

reg.exe pode adicionar, alterar e excluir entradas do registro. Variáveis de ambiente vivem no registro. Esta resposta fala sobre o uso de reg para excluir variáveis de ambiente.

Para variáveis de ambiente do usuário:

reg DELETE HKCU\Environment /v envvarname

Para variáveis de ambiente do sistema:

reg DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v envvarname

( HKCU é intercambiável com HKEY_CURRENT_USER . HKLM é intercambiável com HKEY_LOCAL_MACHINE .)

(Observe que CMD trata as variáveis de ambiente vazias da mesma forma que as variáveis de ambiente inexistentes. Eu entendo, no entanto, que você está tentando limpar a variável do sistema.)

    
por 11.08.2016 / 23:08