Variáveis de ambiente do Windows e edição manual do registro - nenhum problema com valores incorretos

4

Abra regedit.exe , navegue para HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment . Crie duas variáveis de ambiente:

Name   Type            Data
-----  --------------  -----------
zbar   REG_SZ          water
zfoo   REG_EXPAND_SZ   %zbar%

Abra o novo cmd.exe , powershell.exe ou o que for. Essas variáveis estão ausentes . Faça o LogOff e depois o LogOn. Em cmd.exe , o tipo de janela echo %zbar% - water é exibido. Tipo echo %zfoo% e %zbar% é exibido, mas espero ver o valor expandido - water .

E agora. Abra o diálogo Windows Variáveis de Ambiente . Altere ou crie qualquer variável (por exemplo, zzz=zzz ). Reabra cmd.exe e digite echo %zfoo% - agora você vê water !

Na verdade, estou criando essas variáveis com o script do PowerShell. Mas tudo isso script é descrito manipulações de registro.

Perguntas:

  1. Como forçar a variável zfoo a ter um valor correto sem essa mágica ao abrir o diálogo Windows Variáveis de Ambiente e alterar algumas variáveis? Talvez eu deva chamar alguma API, algo como [Microsoft.Win32.Registry]::Refresh() ?
  2. É possível tornar essas variáveis visíveis para os usuários sem necessidade de operações LogOff / LogOn? Se eu editar variáveis de ambiente no nível do usuário (também no registro), elas estarão imediatamente disponíveis, mas com o global - elas não estão.

Obrigado.

    
por Roman 26.02.2011 / 12:18

2 respostas

9

Você precisa transmitir o < href="http://msdn.microsoft.com/en-gb/library/ms725497(VS.85).aspx" title="Mensagem WM_SETTINGCHANGE"> Mensagem WM_SETTINGCHANGE .

Lembre-se: na verdade, você não está definindo nenhuma variável de ambiente de qualquer forma ao modificar o registro. As variáveis de ambiente fazem parte do espaço de memória de cada processo individual, com cada processo tendo seu próprio conjunto. Eles não vivem no registro. Você está mudando um template . Você precisa persuadir os programas que definem as variáveis de ambiente real para reler o modelo e definir seus ambientes de acordo. Você faz isso transmitindo uma mensagem do Windows que informa a todas as partes interessadas que o modelo no registro foi alterado. O Microsoft Windows Explorer é uma dessas partes interessadas e modifica suas próprias variáveis de ambiente sempre que ouvir que o modelo foi alterado. Essas modificações são então herdadas da maneira normal por qualquer novo processo gerado pelo Explorer.

    
por 28.02.2011 / 04:55
0

Você pode usar o SETX, ele irá transmitir WM_SETTINGCHANGE depois de definir a variável:

SETX VAR VALUE /M

Ou, se você insiste em inserir as variáveis no registro, pode ter o SETX definir uma variável que já existe, para transmitir a alteração do registro:

SETX OS %OS% /M
    
por 07.03.2017 / 05:43