Czy istnieje narzędzie wiersza polecenia, którego można użyć do edycji zmiennych środowiskowych w systemie Windows?

15

Czy istnieje narzędzie wiersza polecenia, którego można użyć do edycji zmiennych środowiskowych w systemie Windows?

Byłoby miło, gdyby było to inteligentne narzędzie, na przykład:

  • Dodając ścieżkę, powiedzmy zmienną PATH i ta ścieżka już tam jest, nie powinna podwoić tego wpisu.
  • Wstawienie nowej ścieżki do zmiennej PATH powinno być możliwe przed / po innej ścieżce lub w określonej kolejności (pierwsza, siódma, ostatnia itd.).
  • Powinna istnieć możliwość zmiany tylko części wartości zmiennej (w przypadku PATH daną ścieżkę z listy wszystkich ścieżek).

I na koniec - chcę, żeby moje zmiany utrzymywały się między sesjami, więc prosty zestaw nie wchodzi w rachubę ...

Jest bardzo ładne narzędzie GUI do tego o nazwie Path Editor i potrzebuję czegoś takiego, ale do wiersza poleceń.

Piotr Dobrogost
źródło
4
Technicznie tak. Nazywa się SET. Wiem, że to nie jest ładne, ale nie można uzyskać dużo prostszego niż ustawienie zmiennych za pomocą dostępnych narzędzi.
Michael Todd
Ciekawy. Pomyślałem, że na pewno będzie do tego dość znane narzędzie innej firmy.
Sasha Chedygov
Z jakiej wersji systemu Windows korzystasz?
Sasha Chedygov
@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Odpowiedzi:

16

Nie znam żadnego narzędzia, które to robi, ale może możesz użyć regpolecenia:

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

odczytać bieżącą ścieżkę oraz

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

aby napisać nową wartość.

Potrzebujesz uprawnień administratora, aby uzyskać praw dostępu w HKLM. Jeśli jest to problem, rozważ zmodyfikowanie ustawienia ścieżki specyficznej dla użytkownika HKCU\Environment.

Treb
źródło
1
Ta odpowiedź powinna zostać zaakceptowana, może zmienić dowolną zmienną środowiskową, a nawet może być zawarta w pliku wsadowym, więc wystarczy wprowadzić nazwę i nową wartość.
Tamara Wijsman
W połączeniu z Vi zbliżyłoby się to do spełnienia kryteriów pytającego. np. plik wsadowy, który zapisuje ścieżkę do tymczasowego pliku tekstowego, otwiera go w vi, a następnie po zamknięciu vi zapisuje plik do ścieżki. W ten sposób możesz łatwo edytować swoją ścieżkę za pomocą wiersza poleceń. Zrobiłem coś takiego w XP, z plikiem wsadowym, notatnikiem i tymi poleceniami reg.
barlop
1
OSTRZEŻENIE NIE kopiuj i wklej to bezmyślnie, chyba że chcesz zrobić coś głupiego ...
n611x007
7

Jeśli potrzebujesz ogólnego sposobu ustawienia dowolnej zmiennej środowiskowej, a zmiany będą się utrzymywać, to setx.exe będzie narzędziem do użycia. Nie może jednak robić „inteligentnych” rzeczy, o które prosisz ...

setx.exe jest dołączony do systemu Windows Vista lub nowszego; jeśli korzystasz ze starszej wersji systemu Windows, możesz użyć powyższego łącza pobierania, aby ją uzyskać.

Bobbymcr
źródło
5

W przypadku bieżącego programu dostępne są path:

Wyświetla lub ustawia ścieżkę wyszukiwania plików wykonywalnych.

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

Wpisz, PATH ;aby wyczyścić wszystkie ustawienia ścieżki wyszukiwania i skieruj cmd.exewyszukiwanie tylko w bieżącym katalogu.

Wpisz PATHbez parametrów, aby wyświetlić bieżącą ścieżkę. Uwzględnienie %PATH%w nowym ustawieniu ścieżki powoduje dołączenie starej ścieżki do nowego ustawienia.

Jest to jednak prawie tak samo jak set PATH.

Aby zmienne środowiskowe były trwałe, musisz edytować rejestr lub użyć setx.

Joey
źródło
3

Właśnie odkryłem możliwość zezwalania użytkownikom na uruchamianie okna dialogowego edycji zmiennych środowiskowych bez podwyższonych uprawnień.

Z menu Start uruchom następujące polecenie:

rundll32 sysdm.cpl,EditEnvironmentVariables
David Tersigni
źródło
2
+1 za sposób dotarcia do widżetu edycji GUI z wiersza poleceń, ponieważ z pewnością jest to bardziej proste niż ścieżka kliknięcia, nawet jeśli odpowiedź jest nie na temat, ponieważ Q dotyczy edycji ŚCIEŻKI z wiersza poleceń.
matt wilkie
2

ustaw ŚCIEŻKĘ

(zestaw pomocy)

sangretu
źródło
1
dotyczy to tylko sesji terminalowej. Aby dodać / zmienić wartości, musisz również wpisać całą starą ścieżkę.
John T
2
Nie prawda. SET PATH =% path%; c: \ newpath
Michael Todd
2
wciąż go wpisałeś, po prostu nie rozwinięty :) To również nie zapisze, spróbuj wyjść z wiersza polecenia i otworzyć nowy, a następnie sprawdź swoją ścieżkę.
John T
Nie sprecyzował, czy musi trwać między sesjami.
sangretu
4
Cóż, jeśli sprawdziłeś, co robi patheditor (jego sugestia), zapisuje to na stałe. set PATH jest tak naprawdę używany tylko w skryptach kompilacji programów, ponieważ jest tymczasowy.
John T
2

Być może zechcesz wypróbować pathed kolekcji gtools: http://www.p-nand-q.com/gtools.html

Zapewnia zestaw poleceń dla polecenia promt jak

pathed /APPEND %CD% /USER

na przykład dołączyć bieżącą ścieżkę. Szczerze mówiąc, nie sprawdziłem tego, ponieważ nie mam nic przeciwko korzystaniu z GUI.

Inne opcje to:

  /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

Przypuszczam, że razem z tym samym zbiorem masz dobre narzędzia. Który „lokalizuje pliki wykonywalne na ŚCIEŻCE”.

 /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

Źródło: http://op111.net/82/

Hugo der Hungrige
źródło
1
Czy możesz wyjaśnić, z czym się łączysz? Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona treść stanie się niedostępna.
bwDraco,
Shure. Przepraszam, że domyślnie odnosiłem się do pytania.
hugo der hungrige
Wygląda na to, że URL dla Gtools, a pathed jest już martwy. p-nand-q.com/gtools.html
DevPlayer
1

Napisałem do tego zestaw skryptów wsadowych. addpath.bat dodaje elementy do ścieżki, rmpath.bat usuwa elementy ze ścieżki, a lpath.bat po prostu wyświetla ścieżkę. Ale potem potrzebowałem trochę skryptów pomocniczych, więc jest też chkpath.bat.

Okazało się, że nie jest to trywialne i wymaga tr.exe i cat.exe, kilku narzędzi w stylu unixowym. Powód, dla którego nie jest trywialny: nie ma backticks w cmd.exe (chociaż można do tego użyć pętli), a krótkie nazwy kontra długie nazwy.

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
źródło
Myślę, że formożna użyć pętli zamiast tr/ catteż.
user1686,
0

Path Manager (pathman.exe) z zestawu narzędzi Windows Server 2003 Resource Kit to najbliższe dopasowanie, jakie udało mi się znaleźć. Był już dostępny w NT Resource Kit.

Piotr Dobrogost
źródło
może spróbujsetx.exe
n611x007
@ n611x007, setxdotyczy ogólnych zmiennych środowiskowych; pathmanjest specjalnie do manipulowania (tj. analizowania ) ścieżką.
Synetech
0

Jak sprawdzić, czy katalog istnieje w% PATH%? na stosie przepełnienia ma znakomity opis tego, co utrudnia edycję ŚCIEŻKI Windows wraz z plikiem wsadowym do ich przezwyciężenia. Wymyślenie, jak prawidłowo używać, addpath.batwymagało trochę praktyki, ponieważ jego struktura wywoływania była dla mnie nowa, ale działa:

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

i wielokrotne odpalanie nie doda nowego katalogu, jeśli jest już obecny. Nie rozwiązuje to problemu utrzymywania zmian w sesjach.

matowe wilkie
źródło