Como anexar permanentemente uma entrada na variável PATH do sistema, via linha de comando?

13

O que eu preciso fazer:

  • Anexe uma pasta à %PATH%variável de ambiente no nível SYSTEM.
  • Faça a mudança permanente.

Como eu preciso fazer isso:

  • Usando o prompt de comando ou outro método pelo qual todos os comandos necessários podem ser gravados em um .BATarquivo.
  • Usando apenas ferramentas que estariam disponíveis em uma instalação simples do Windows XP SP3, sem conectividade com a Internet.
  • Prefiro executar o script localmente, mas também tenho acesso remoto aos sistemas de destino. Porém, lembre-se de que não posso presumir que nenhum serviço não padrão (por exemplo: Registro Remoto) esteja ativado nos sistemas.

Sistemas em que o script precisa trabalhar:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

Estou bastante familiarizado com o SETcomando, mas também estou ciente de que ele geralmente substituirá a variável existente em vez de anexá-la. Isso não é aceitável. Existe outra ferramenta (ou opção para a SETqual eu desconheço) que será anexada à variável? Ou preciso colocar uma solução alternativa no script que inclua a cópia temporária da variável existente para outra variável ou arquivo de texto?

Além disso, é meu entendimento que SETnão alterará permanentemente a variável. Eu já vi menção SETX, mas isso não parece incorporado ao Windows XP SP3 (ou, pelo menos, não parece estar disponível no sistema em que estou trabalhando). Existe outra maneira de tornar a alteração permanente, via edição do registro ou algo assim?

Fiz algumas pesquisas e aprendi bastante aqui sobre a configuração de variáveis ​​de ambiente no Windows. No entanto, ainda não encontrei uma pergunta duplicada exata que atenda às minhas necessidades. Se houver, informe-me.

Iszi
fonte
Setx não vem com o XP. Está em um ou mais kits de recursos, mas esqueço de imediato. Para fazer alterações permanentes na variável de ambiente na linha de comando, é definitivamente a maneira mais fácil. Você pode fazer a alteração no registro (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment), mas as alterações no registro na linha de comando também não são fáceis. Se eu fosse você, escreveria um VBScript para fazer isso.
EBGreen 16/02
@ EBGreen Estou um pouco familiarizado com o uso REGpara fazer alterações no registro. Se você gostaria de postar isso como resposta, com sugestões sobre como manter o caminho existente, eu pelo menos faria um voto positivo.
Iszi
1
Penso que, por sugestão da EBGreen, descobri como preciso fazê-lo. Agora eu só gostaria que houvesse uma maneira de forçar a atualização do registro (e enviar para variáveis ​​de ambiente) sem reiniciar ou recarregar o Explorer?
Iszi
1
@ EBGreen Sim, é assim que parece. A propósito, se você tiver algum tempo para descobrir a sintaxe, poderia postar uma resposta real? Prefiro que isso não se transforme em uma pergunta auto-respondida.
Iszi
1
@lszi, você deve responder sua própria pergunta. Uma boa resposta para uma boa pergunta é valiosa, mesmo quando você a responde.
Myrddin Emrys

Respostas:

4

O seguinte adiciona 'C: \ bin' ao seu caminho e salva o novo caminho no Registro:

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

Eu só testei isso no XP SP3, mas deve funcionar também na versão mais recente.

Eu acho que um novo usuário que efetua logon antes da reinicialização da máquina pode não obter o novo caminho.

Harry está certo com seu comentário sobre% SystemRoot%, se você deseja mantê-los, é necessário extrair primeiro o valor antigo do caminho:

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)
Peter Hahndorf
fonte
2
Esteja ciente de que isso alterará algumas das entradas PATH existentes expandindo as referências de variáveis ​​de ambiente. Por exemplo, a entrada padrão% SystemRoot% \ system32 será substituída por c: \ windows \ system32. Este exemplo em particular não importa porque o SystemRoot é uma constante, mas se alguém configurou um PATH com uma referência a uma variável de ambiente que muda, você o quebrará. (Eu faço isso em alguns dos meus computadores para apontar para o diretório bin na atual Sun JDK.)
Harry Johnston
O novo script não funciona como está escrito se o caminho contiver colchetes, por exemplo, referências a Arquivos de Programas (x86).
Harry Johnston
-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f
anon
fonte
2
Embora comandos simples possam ser úteis, esperamos um pouco mais de trabalho em nossas perguntas / respostas. Por favor, explique como isso responde à pergunta dos OPs.
Ƭᴇcʜιᴇ007