Apakah ada alat baris perintah yang dapat digunakan untuk mengedit variabel lingkungan di Windows?

15

Apakah ada alat baris perintah yang dapat digunakan untuk mengedit variabel lingkungan di Windows?

Alangkah baiknya jika ini adalah alat pintar, misalnya:

  • Ketika menambahkan beberapa path ke katakanlah variabel PATH dan path ini sudah ada di sana seharusnya tidak menggandakan entri ini.
  • Memasukkan lintasan baru ke variabel PATH harus dimungkinkan sebelum / sesudah lintasan lain atau dalam urutan tertentu (yang pertama, yang ke-7, yang terakhir, dll.).
  • Seharusnya dimungkinkan untuk mengubah hanya sebagian dari nilai variabel (dalam hal PATH jalur yang diberikan dari daftar semua jalur).

Dan yang terakhir tetapi tidak sedikit - saya ingin perubahan saya bertahan di antara sesi sehingga SET yang sederhana tidak mungkin ...

Ada alat GUI yang sangat bagus untuk ini disebut Path Editor dan saya butuh sesuatu seperti ini tetapi untuk baris perintah.

Piotr Dobrogost
sumber
4
Secara teknis, ya. Ini disebut SET. Saya tahu itu tidak cantik, tetapi Anda tidak bisa mendapatkan lebih langsung daripada hanya mengatur variabel dengan alat di tangan.
Michael Todd
Menarik. Saya pikir pasti akan ada alat pihak ketiga yang cukup terkenal untuk ini.
Sasha Chedygov
Versi Windows apa yang Anda jalankan?
Sasha Chedygov
@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Jawaban:

16

Saya tidak tahu alat apa pun yang melakukan ini, tetapi mungkin Anda dapat menggunakan regperintah:

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

untuk membaca jalur saat ini, dan

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

untuk menulis nilai baru Anda.

Anda memerlukan hak admin untuk mendapatkan akses kanan di HKLM. Jika itu masalah, pertimbangkan memodifikasi pengaturan jalur khusus pengguna HKCU\Environmentsebagai gantinya.

Treb
sumber
1
Jawaban ini seharusnya diterima, dapat mengubah variabel lingkungan apa pun dan bahkan dapat dienkapsulasi dalam file batch sehingga orang hanya perlu memasukkan nama dan nilai baru.
Tamara Wijsman
Jika ini dikombinasikan dengan Vi, itu akan mendekati memenuhi kriteria penanya. misalnya file batch yang menulis path ke file teks sementara, membukanya di vi, kemudian ketika Anda menutup vi itu menulis file ke path. Dengan begitu Anda dapat dengan mudah mengedit jalur Anda melalui baris perintah. Saya melakukan sesuatu seperti itu di XP, dengan file batch, notepad, dan perintah reg tersebut.
barlop
1
PERINGATAN JANGAN salin-tempel ini tanpa berpikir kecuali Anda ingin melakukan sesuatu yang konyol ...
n611x007
7

Jika Anda memerlukan cara umum untuk mengatur variabel lingkungan apa pun dan perubahannya tetap ada, maka setx.exe akan menjadi alat untuk digunakan. Itu tidak dapat melakukan hal-hal "pintar" yang Anda minta, meskipun ...

setx.exe disertakan dengan Windows Vista atau yang lebih baru; jika Anda menggunakan versi Windows yang lebih lama, Anda dapat menggunakan tautan unduhan di atas untuk mendapatkannya.

bobbymcr
sumber
5

Untuk program saat ini, ada path:

Menampilkan atau menetapkan jalur pencarian untuk file yang dapat dieksekusi.

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

Ketik PATH ;untuk menghapus semua pengaturan jalur pencarian dan mengarahkan cmd.exeuntuk mencari hanya di direktori saat ini.

Ketik PATHtanpa parameter untuk menampilkan jalur saat ini. Termasuk %PATH%dalam pengaturan jalur baru menyebabkan jalur lama ditambahkan ke pengaturan baru.

Namun, ini hampir sama dengan set PATH.

Agar variabel lingkungan tetap ada, Anda harus mengedit registri atau menggunakannya setx.

Joey
sumber
3

Saya baru saja menemukan kemampuan untuk memungkinkan pengguna untuk menjalankan dialog edit Variabel Lingkungan tanpa hak yang lebih tinggi.

Dari menu Mulai, jalankan yang berikut:

rundll32 sysdm.cpl,EditEnvironmentVariables
David Tersigni
sumber
2
Memberi +1 untuk cara baris perintah menuju ke widget edit GUI, karena itu tentu lebih lurus daripada jalur klik, meskipun jawabannya di luar topik karena Q adalah tentang mengedit PATH dari baris perintah.
matt wilkie
2

atur PATH

(set bantuan)

sangretu
sumber
1
ini hanya untuk sesi terminal, dan untuk menambah / mengubah nilai Anda perlu mengetik ulang seluruh jalur lama juga.
John T
2
Tidak benar. SET PATH =% path%; c: \ newpath
Michael Todd
2
Anda masih mengetiknya, hanya tidak diperluas :) Itu juga tidak akan menyimpan, coba keluar dari command prompt dan buka yang baru kemudian periksa jalan Anda.
John T
Dia tidak merinci apakah perlu untuk tetap di antara sesi.
sangretu
4
Nah, jika Anda memeriksa apa yang dilakukan patheditor (sarannya), ia menyimpannya secara permanen. set PATH hanya benar-benar digunakan dalam membangun skrip untuk program karena bersifat sementara.
John T
2

Anda mungkin ingin memeriksa lintasan koleksi gtools: http://www.p-nand-q.com/gtools.html

Ini menyediakan satu set perintah untuk perintah promt like

pathed /APPEND %CD% /USER

untuk menambahkan jalur saat ini misalnya. Saya belum benar-benar memeriksanya, karena saya benar-benar baik-baik saja dengan menggunakan GUI.

Pilihan lain adalah:

  /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

Bersama dengan koleksi yang sama, Anda punya sendiri beberapa alat yang bagus, saya kira. Yang "menempatkan file yang dapat dieksekusi di 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

Sumber: http://op111.net/82/

hugo der hungrige
sumber
1
Bisakah Anda menjelaskan apa yang Anda tautkan? Jawaban hanya tautan dapat menjadi tidak valid jika konten tertaut menjadi tidak tersedia.
bwDraco
Shure. Maaf saya secara implisit merujuk pada pertanyaan.
hugo der hungrige
Tampaknya URL untuk Gtools dan pathed sudah mati. p-nand-q.com/gtools.html
DevPlayer
1

Saya menulis satu set skrip batch untuk ini. addpath.bat menambahkan elemen ke path, rmpath.bat menghapus elemen dari path, dan lpath.bat hanya mencantumkan path. Tapi kemudian saya membutuhkan beberapa skrip dukungan, jadi ada juga chkpath.bat.

Itu akhirnya tidak sepele dan diperlukan tr.exe dan cat.exe, beberapa utilitas unix-style. Alasannya tidak sepele: tidak ada backticks di cmd.exe (meskipun Anda dapat menggunakan untuk loop untuk ini), dan nama pendek versus nama panjang.

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
sumber
Saya pikir forloop bisa digunakan sebagai ganti tr/ catjuga.
user1686
0

Path Manager (pathman.exe) dari Windows Server 2003 Resource Kit Tools adalah pasangan terdekat yang bisa saya temukan. Itu sudah tersedia di NT Resource Kit.

Piotr Dobrogost
sumber
mungkin mencobasetx.exe
n611x007
@ n611x007, setxadalah untuk variabel lingkungan umum; pathmankhusus untuk memanipulasi (yaitu, parsing ) jalan.
Synetech
0

Bagaimana cara memeriksa apakah direktori ada di% PATH%? pada Stack Overflow memiliki deskripsi yang luar biasa tentang apa yang membuat pengeditan Windows PATH sulit bersama dengan file batch untuk mengatasinya. Mencari tahu cara menggunakan yang benar addpath.batmemerlukan sedikit latihan karena struktur panggilan itu baru bagi saya, tetapi ini berhasil:

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

dan pemecatan berulang tidak akan menambah direktori baru jika sudah ada. Ini tidak membahas untuk membuat pengeditan tetap berlangsung di seluruh sesi.

matt wilkie
sumber