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ń.


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.


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ć.


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.


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

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)


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/


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.

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.