Existe alguma ferramenta de linha de comando que possa ser usada para editar variáveis ​​de ambiente no Windows?


15

Existe alguma ferramenta de linha de comando que possa ser usada para editar variáveis ​​de ambiente no Windows?

Seria bom se isso fosse uma ferramenta inteligente, por exemplo:

  • Ao adicionar algum caminho para, digamos, a variável PATH e esse caminho já estiver lá, não deve dobrar essa entrada.
  • A inserção de um novo caminho na variável PATH deve ser possível antes / depois de algum outro caminho ou em uma ordem específica (o primeiro, o sétimo, o último, etc.).
  • Deve ser possível alterar apenas parte do valor da variável (no caso do PATH, um determinado caminho de uma lista de todos os caminhos).

E o último, mas não menos importante - quero que minhas alterações persistam entre as sessões, para que o SET simples esteja fora de questão ...

Há uma ferramenta GUI muito boa para isso, chamada Path Editor, e eu preciso de algo assim, mas para a linha de comando.


4
Tecnicamente sim. Chama-se SET. Eu sei que não é bonito, mas você não pode ser muito mais direto do que apenas definir as variáveis ​​com as ferramentas disponíveis.
22710 Michael Todd

Interessante. Eu tinha certeza de que haveria uma ferramenta de terceiros bastante conhecida para isso.
Sasha Chedygov

Qual versão do Windows você está executando?
Sasha Chedygov

@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Respostas:


16

Não conheço nenhuma ferramenta que faça isso, mas talvez você possa usar o regcomando:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path

para ler o caminho atual e

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d "newPath" /f

para escrever seu novo valor.

Você precisa de direitos de administrador para obter o acesso correto no HKLM. Se isso for um problema, considere modificar a configuração de caminho específico do usuário HKCU\Environment.


11
Essa resposta deveria ter sido aceita, pode alterar qualquer variável de ambiente e pode até ser encapsulada em um arquivo em lotes, para que seja necessário inserir apenas o nome e o novo valor.
Tamara Wijsman

Se isso for combinado com Vi, chegaria mais perto de atender aos critérios do questionador. por exemplo, um arquivo em lotes que grava o caminho em um arquivo de texto temporário, abre-o no vi e, quando você fecha o vi, grava o arquivo no caminho. Dessa forma, você pode editar facilmente seu caminho via linha de comando. Eu fiz algo parecido no XP, com um arquivo em lotes, o bloco de notas e os comandos reg.
22613 barlop

11
AVISO não copiar e colar este sem pensar, a menos que você quer fazer algo bobo ...
n611x007

7

Se você precisar de uma maneira genérica de definir qualquer variável de ambiente e persistir com as alterações, o setx.exe seria a ferramenta a ser usada. Porém, ele não pode fazer as coisas "inteligentes" que você está pedindo ...

setx.exe está incluído no Windows Vista ou posterior; se você usa uma versão anterior do Windows, pode usar o link de download acima para obtê-lo.


5

Para o programa atual, há path:

Exibe ou define um caminho de pesquisa para arquivos executáveis.

PATH [[drive:]path[;...][;%PATH%]
PATH ;

Digite PATH ;para limpar todas as configurações do caminho de pesquisa e direcionar cmd.exea pesquisa apenas no diretório atual.

Digite PATHsem parâmetros para exibir o caminho atual. A inclusão %PATH%na nova configuração de caminho faz com que o caminho antigo seja anexado à nova configuração.

No entanto, isso é praticamente o mesmo que set PATH.

Para que as variáveis ​​de ambiente persistam, é necessário editar o registro ou usar setx.


3

Acabei de descobrir a capacidade de permitir que os usuários executem a caixa de diálogo de edição de variáveis ​​de ambiente sem privilégios elevados.

No menu Iniciar, execute o seguinte:

rundll32 sysdm.cpl,EditEnvironmentVariables

2
+1 para obter uma linha de comando para acessar o widget de edição da GUI, porque isso certamente é mais direto do que o caminho do clique, mesmo que a resposta esteja fora do tópico, porque Q trata da edição de PATH a partir da linha de comando.
Matt Wilkie

2

definir PATH

(conjunto de ajuda)


11
isso é apenas para a sessão do terminal e, para adicionar / alterar valores, é necessário digitar novamente o caminho antigo inteiro.
John T

2
Não é verdade. SET PATH =% path%; c: \ newpath
Michael Todd

2
você ainda digitou, apenas não expandido :) Isso também não será salvo, tente sair do prompt de comando e abrir um novo e verifique seu caminho.
John T

Ele não especificou se precisava persistir entre as sessões.
sangretu 27/07/09

4
Bem, se você verificou o que o patheditor (sua sugestão) faz, ele o salva permanentemente. set PATH é realmente usado apenas em scripts de construção de programas porque é temporário.
John T

2

Você pode verificar o caminho da coleção gtools: http://www.p-nand-q.com/gtools.html

Ele fornece um conjunto de comandos para o prompt de comando, como

pathed /APPEND %CD% /USER

para acrescentar o caminho atual, por exemplo. Eu realmente não fiz check-out para ser honesto, pois estou totalmente bem em usar uma GUI.

Outras opções são:

  /MACHINE: print machine PATH
     /USER: print user PATH
      /ADD: add variable at the head
   /APPEND: add variable at the tail
   /REMOVE: remove path / index
     /SLIM: strip duplicate vars
      /ENV: environment variable, defaults to PATH

Juntamente com quais da mesma coleção, você conseguiu algumas boas ferramentas, suponho. Que "localiza arquivos executáveis ​​no PATH".

 /EXTENSION: search for extension , can be a ; separated list
       /DIR: add directory , can be a ; separated list
 /RECURSIVE: search directories recursively
    /SINGLE: stop after the first find result
       /ENV: environment variable, defaults to PATH
FILE {FILE}: one or more files to find

Fonte: http://op111.net/82/


11
Você pode explicar o que está vinculando? As respostas somente para links podem se tornar inválidas se o conteúdo vinculado se tornar indisponível.
bwDraco - Restabelece Monica

Shure. Desculpe, eu estava me referindo implicitamente à pergunta.
Hugo der hungrige

Parece que o URL do Gtools e o caminho está morto. p-nand-q.com/gtools.html
DevPlayer

1

Eu escrevi um conjunto de scripts em lote para isso. addpath.bat adiciona elementos ao caminho, rmpath.bat remove elementos do caminho e lpath.bat apenas lista o caminho. Mas então eu precisava de alguns scripts de suporte, então também há chkpath.bat.

Acabou não sendo trivial e exigiu tr.exe e cat.exe, alguns utilitários no estilo unix. O motivo não é trivial: não há backticks no cmd.exe (embora você possa usar loops para isso) e nomes curtos versus nomes longos.

addpath.bat:

@echo off
setlocal
set cwd=%~dps0

goto testit

:loopy

call %cwd%chkpath "%~1"
if %errorlevel%==2 (
  set path=%path%;%~1
)

shift

:testit
if not _%1==_ goto loopy


call %cwd%lpath.bat

endlocal & set path=%path%

ChkPath.bat:

@echo off
goto START

-------------------------------------------------------
chkpath.bat

checks path for existence of the given segment.
Returns 1 if present, 2 if not present, 0 if not checked.

The matching and checking complicated by case sensitivity and "short pathnames".

created sometime in 2003 and lovingly maintained since then.


-------------------------------------------------------

:START
setlocal enabledelayedExpansion
set rc=0
set cwd=%~dps0
set curdrive=%~d0
set tr=%curdrive%\bin\tr.exe
set regexe=%windir%\system32\reg.exe


if _%1==_ goto Usage


@REM convert arg 1 to a fully-qualified, short path name,
@REM and then convert to uppercase.
set toupper=%~fs1
call :ToUpper
set tocheck=%toupper%


if not _%TEMP%==_ goto GotTemp
call :gettemp


:GotTemp
set d=%DATE:~4%
set stamp=%d:~6%%d:~3,2%%d:~0,2%%TIME::=%
set d=
set tempfile1=%TEMP%\chkpath1-%stamp%.tmp

echo %path% | %tr% ; \n  >  %tempfile1%

@REM check each element in the path for the match:
for /f  "delims=^" %%I in (%tempfile1%) do (
  if !rc!==0 (
call :CheckElt "%%I"
  )
)

if %rc%==0 set rc=2
goto END


--------------------------------------------
* checkelt
*
* check one element in the path to see if it is the same
* as the TOCHECK string. The element is first canonicalized.
*

:CheckElt
@REM remove surrounding quotes
set ERF=%1
if [x%ERF%]==[x] goto CheckEltDone
@REM convert to fully-qualified, short paths, uppercase
set TOUPPER=%~fs1%
call :ToUpper
if _%TOCHECK% == _%TOUPPER% set rc=1
:CheckEltDone
goto:EOF
--------------------------------------------


--------------------------------------------
* backtick
*
* invoke a command and return the result as a string.
* This is like backtick in csh or bash.
* To call, set variable BACKTICK to the command to be run.
* The result will be stored in the env variable of the same name.
*

:backtick
FOR /F "usebackq delims=" %%i IN (`%backtick%`) DO (
  SET backtick=%%i
)
goto backtick_done
:backtick_none
  SET backtick=nothing to exec
:backtick_done
goto:EOF
--------------------------------------------


--------------------------------------------
* gettemp
*
* get the temporary directory, as stored in the registry.
* Relies on backtick.
*
* The result set TEMP.
*

:gettemp
set regkey=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
set regvalname=Local AppData
set backtick=%regexe% query "%regkey%" /v "%regvalname%"
call :backtick
for /f "tokens=4" %%a in ("%backtick%") do (
  set temp=%%a
)
goto:EOF
--------------------------------------------



--------------------------------------------
* ToUpper
*
* Convert a string to all uppercase.
* To call, set variable TOUPPER to the thing to be converted.
* The result will be stored in the env variable of the same name.
*

:ToUpper
  FOR /F "usebackq delims=" %%I IN (`echo %toupper% ^| %tr% a-z A-Z`) DO (
SET toupper=%%I
  )
goto:EOF
--------------------------------------------


--------------------------------------------
:CleanUp
  if _%tempfile1%==_ goto CleanUpDone
  if exist %tempfile1% del %tempfile1%
  :CleanUpDone
goto:EOF
--------------------------------------------


--------------------------------------------
:Usage
echo.
echo Usage: chkpath ^<path^>
echo checks if path element is included in path variable.
echo returns 1 if yes, 2 if no, 0 if not checked.
echo.
goto END
--------------------------------------------


:END
call :CleanUp

:ReallyEnd

endlocal & set errorlevel=%rc%
@REM set errorlevel=%rc%
@REM echo %errorlevel%

lpath.bat:

@echo.
@set curdrive=%~d0

@REM This form post-fixes a | at the end of each path element. Useful for debugging trailing spaces.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e s/PATH=// -e 's/;/^|\n/g' -e 's/$/^|/g'

@REM This form shows bare path elements.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e 's/PATH=//' -e 's/;/^\n/g'
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.

Eu acho que o forloop poderia ser usado em vez de tr/ cattambém.
28610

0

O Path Manager (pathman.exe) do Windows Server 2003 Resource Kit Tools é a correspondência mais próxima que pude encontrar. Já estava disponível no NT Resource Kit.


talvez tentesetx.exe
n611x007

@ n611x007, setxé para variáveis ​​de ambiente gerais; pathmané especificamente para manipular (ou seja, analisar ) o caminho.
Synetech 23/03

0

Como verificar se o diretório existe em% PATH%? O Stack Overflow possui uma descrição excelente do que dificulta a edição do PATH do Windows, juntamente com um arquivo em lotes para superá-los. Descobrir como usar corretamente addpath.batexigiu um pouco de prática, pois a estrutura de chamada era nova para mim, mas isso funciona:

set _path=C:\new\directory\to\add\to\path
call addpath.bat _path
set _path=

e demissões repetidas não adicionarão o novo diretório se ele já estiver presente. Isso não resolve tornar as edições persistentes nas sessões.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.