¿Existe alguna herramienta de línea de comando que pueda usarse para editar variables de entorno en Windows?

15

¿Existe alguna herramienta de línea de comando que pueda usarse para editar variables de entorno en Windows?

Sería bueno si esta fuera una herramienta inteligente, por ejemplo:

  • Al agregar alguna ruta a la variable PATH y esta ruta ya está allí, no debería duplicar esta entrada.
  • La inserción de una nueva ruta a la variable PATH debería ser posible antes / después de alguna otra ruta o en un orden específico (el primero, el séptimo, el último, etc.).
  • Debería ser posible cambiar solo una parte del valor de la variable (en el caso de la RUTA, una ruta dada de una lista de todas las rutas).

Y lo último, pero no menos importante: quiero que mis cambios persistan entre sesiones, por lo que SET simple está fuera de discusión ...

Hay una herramienta GUI muy buena para esto llamada Path Editor y necesito algo como esto pero para la línea de comandos.

Piotr Dobrogost
fuente
44
Técnicamente sí. Se llama SET. Sé que no es bonito, pero no puede ser mucho más sencillo que solo configurar las variables con las herramientas disponibles.
Michael Todd
Interesante. Pensé con seguridad que habría una herramienta de terceros bastante conocida para esto.
Sasha Chedygov
¿Qué versión de Windows tienes?
Sasha Chedygov
@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Respuestas:

16

No conozco ninguna herramienta que haga esto, pero tal vez puedas usar el regcomando:

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

para leer la ruta actual, y

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

para escribir tu nuevo valor.

Necesita derechos de administrador para acceder correctamente a HKLM. Si eso es un problema, considere modificar la configuración de ruta específica del usuario en su HKCU\Environmentlugar.

Treb
fuente
1
Esta respuesta debería haber sido aceptada, puede cambiar cualquier variable de entorno e incluso puede encapsularse en un archivo por lotes, por lo que solo es necesario ingresar el nombre y el nuevo valor.
Tamara Wijsman
Si esto se combina con Vi, estaría más cerca de cumplir con los criterios del interrogador. por ejemplo, un archivo por lotes que escribe la ruta a un archivo de texto temporal, lo abre en vi y luego, cuando cierra vi, escribe el archivo en la ruta. De esa manera, puede editar fácilmente su ruta a través de la línea de comandos. Hice algo así en XP, con un archivo por lotes, un bloc de notas y esos comandos de registro.
barlop
1
ADVERTENCIA NO copie y pegue esto sin pensar a menos que quiera hacer algo tonto ...
n611x007
7

Si necesita una forma genérica de establecer cualquier variable de entorno y hacer que los cambios persistan, entonces setx.exe sería la herramienta a utilizar. Sin embargo, no puede hacer las cosas "inteligentes" que está pidiendo ...

setx.exe se incluye con Windows Vista o posterior; si usa una versión anterior de Windows, puede usar el enlace de descarga anterior para obtenerlo.

bobbymcr
fuente
5

Para el programa actual, hay path:

Muestra o establece una ruta de búsqueda para archivos ejecutables.

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

Escriba PATH ;para borrar todas las configuraciones de la ruta de búsqueda y dirigir cmd.exea la búsqueda solo en el directorio actual.

Escriba PATHsin parámetros para mostrar la ruta actual. La inclusión %PATH%en la nueva configuración de ruta hace que la ruta anterior se agregue a la nueva configuración.

Sin embargo, esto es más o menos lo mismo que set PATH.

Para que las variables de entorno persistan, debe editar el registro o usarlo setx.

Joey
fuente
3

Acabo de descubrir la capacidad de permitir a los usuarios ejecutar el diálogo de edición de Variables de entorno sin privilegios elevados.

Desde el menú Inicio, ejecute lo siguiente:

rundll32 sysdm.cpl,EditEnvironmentVariables
David Tersigni
fuente
2
+1 para una forma de línea de comando de llegar al widget de edición de la GUI, porque eso es ciertamente más directo que la ruta de clic, a pesar de que la respuesta está fuera de tema porque Q se trata de editar RUTA desde la línea de comando.
Matt Wilkie
2

establecer RUTA

(conjunto de ayuda)

sangretu
fuente
1
esto es solo para la sesión de terminal, y para agregar / cambiar valores, también debe volver a escribir toda la ruta anterior.
John T
2
No es verdad. SET PATH =% path%; c: \ newpath
Michael Todd
2
todavía lo escribiste, simplemente sin expandir :) Eso tampoco se guardará, intenta salir del símbolo del sistema y abrir uno nuevo y luego verifica tu ruta.
John T
No especificó si debía persistir entre sesiones.
sangretu
44
Bueno, si revisaste lo que hace Patheditor (su sugerencia), lo guarda de forma permanente. set PATH solo se usa realmente en scripts de compilación para programas porque es temporal.
John T
2

Puede consultar la colección de gtools: http://www.p-nand-q.com/gtools.html

Proporciona un conjunto de comandos para la solicitud de comando como

pathed /APPEND %CD% /USER

para agregar la ruta actual, por ejemplo. Realmente no lo he verificado para ser honesto, ya que estoy totalmente de acuerdo con el uso de una GUI.

Otras opciones son:

  /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

Junto con cuál de la misma colección, obtuviste algunas buenas herramientas, supongo. Que "localiza archivos ejecutables en la RUTA".

 /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

Fuente: http://op111.net/82/

hugo der hungrige
fuente
1
¿Puedes explicar a qué te estás vinculando? Las respuestas de solo enlace pueden dejar de ser válidas si el contenido vinculado no está disponible.
bwDraco
Shure Lo siento, me refería implícitamente a la pregunta.
hugo der hungrige
Parece que la URL de Gtools y pathed ahora está muerta. p-nand-q.com/gtools.html
DevPlayer
1

Escribí un conjunto de scripts por lotes para esto. addpath.bat agrega elementos a la ruta, rmpath.bat elimina elementos de la ruta y lpath.bat solo enumera la ruta. Pero luego necesitaba algunos scripts de soporte, por lo que también hay chkpath.bat.

Terminó no siendo trivial y requirió tr.exe y cat.exe, un par de utilidades de estilo unix. La razón no es trivial: no hay backticks en cmd.exe (aunque puede usar bucles para esto), y nombres cortos versus nombres largos.

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.
Cheeso
fuente
Creo que el forbucle podría usarse en lugar de tr/ cattambién.
user1686
0

Path Manager (pathman.exe) de Windows Server 2003 Resource Kit Tools es la coincidencia más cercana que pude encontrar. Ya estaba disponible en NT Resource Kit.

Piotr Dobrogost
fuente
tal vez intentesetx.exe
n611x007
@ n611x007, setxes para variables de entorno generales; pathmanes específicamente para manipular (es decir, analizar ) el camino.
Synetech
0

¿Cómo verificar si el directorio existe en% PATH%? on Stack Overflow tiene una descripción sobresaliente de lo que dificulta la edición de Windows PATH junto con un archivo por lotes para superarlos. Descubrir cómo usarlo correctamente addpath.batrequirió un poco de práctica, ya que su estructura de llamadas era nueva para mí, pero esto funciona:

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

y los disparos repetidos no agregarán el nuevo directorio si ya está presente. Esto no aborda hacer que las ediciones sean persistentes en todas las sesiones.

wilkie mate
fuente