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.