cmd에서 PATH 변수를 영구적으로 업데이트하는 방법은 무엇입니까? 윈도우
set PATH=%PATH%;C:\\Something\\bin
cmd에서 실행 한 다음 실행 echo %PATH%
하면이 문자열이 경로에 추가 된 것을 볼 수 있습니다. cmd를 닫고 열면 해당 새 문자열이 PATH에 없습니다. 현재 프로세스뿐만 아니라 향후 모든 프로세스에 대해 cmd에서 PATH를 영구적으로 업데이트하려면 어떻게해야합니까? 시스템 속성-> 고급-> 환경 변수로 이동하여 PATH를 업데이트 하여이 작업을 수행하고 싶지 않습니다.
이 명령은 Java 응용 프로그램에서 실행해야합니다 (다른 질문 ).
이를 수행하는 방법에 대한 설명서는 MSDN 에서 찾을 수 있습니다 . 주요 추출물은 다음과 같습니다.
프로그래밍 방식으로 시스템 환경 변수를 추가하거나 수정하려면 HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment 레지스트리 키에 변수를 추가 한 다음
WM_SETTINGCHANGE
lParam을 "Environment"문자열로 설정하여 메시지 를 브로드 캐스트하십시오 . 이를 통해 셸과 같은 응용 프로그램에서 업데이트를 선택할 수 있습니다.
이 키를 수정하려면 응용 프로그램에 관리자 권한이 필요합니다.
의견에서 사용자 별 환경 만 수정하면 좋을 것입니다. HKEY_CURRENT_USER \ Environment 의 값을 편집하여이를 수행하십시오 . 이전과 마찬가지로 WM_SETTINGCHANGE
메시지 를 브로드 캐스트해야 합니다.
JNI 레지스트리 클래스를 사용하여 Java 애플리케이션에서이를 쉽게 수행 할 수 있어야합니다.
당신이 사용할 수있는:
setx PATH "%PATH%;C:\\Something\\bin"
그러나 setx
저장된 문자열을 1024 바이트로 자르면 PATH가 손상 될 수 있습니다.
/M
변경됩니다 PATH
에 HKEY_LOCAL_MACHINE
대신 HKEY_CURRENT_USER
. 다시 말해, 사용자 변수 대신 시스템 변수입니다. 예를 들면 다음과 같습니다.
SETX /M PATH "%PATH%;C:\your path with spaces"
새 PATH는 현재에 표시되지 않습니다 cmd.exe
.
레지스트리에서 또는 새에 보면 그러나 cmd.exe
와 "set p"
당신이 새 값을 볼 수 있습니다.
나는 명령을 사용하지 않도록주의
setx PATH "%PATH%;C:\Something\bin"
구현의 "기능"으로 인해 PATH 변수를 수정합니다. 요즘 많은 (대부분의) 설치에서 변수는 길어질 것입니다- setx
저장된 문자열을 1024 바이트로 자르고 PATH를 손상시킬 수 있습니다 ( 여기서 논의 참조 ).
( 이 문제를 신고하기 위해 특별히 가입 했으므로 '12 년 5 월 2 일에 게시 된 답변에 직접 댓글을 달 수있는 사이트 평판이 부족합니다. 댓글을 추가해 주신 beresfordt에게 감사드립니다 )
이 Python-script [*]는 정확히 다음을 수행합니다.
"""
Show/Modify/Append registry env-vars (ie `PATH`) and notify Windows-applications to pickup changes.
First attempts to show/modify HKEY_LOCAL_MACHINE (all users), and
if not accessible due to admin-rights missing, fails-back
to HKEY_CURRENT_USER.
Write and Delete operations do not proceed to user-tree if all-users succeed.
Syntax:
{prog} : Print all env-vars.
{prog} VARNAME : Print value for VARNAME.
{prog} VARNAME VALUE : Set VALUE for VARNAME.
{prog} +VARNAME VALUE : Append VALUE in VARNAME delimeted with ';' (i.e. used for `PATH`).
{prog} -VARNAME : Delete env-var value.
Note that the current command-window will not be affected,
changes would apply only for new command-windows.
"""
import winreg
import os, sys, win32gui, win32con
def reg_key(tree, path, varname):
return '%s\%s:%s' % (tree, path, varname)
def reg_entry(tree, path, varname, value):
return '%s=%s' % (reg_key(tree, path, varname), value)
def query_value(key, varname):
value, type_id = winreg.QueryValueEx(key, varname)
return value
def yield_all_entries(tree, path, key):
i = 0
while True:
try:
n,v,t = winreg.EnumValue(key, i)
yield reg_entry(tree, path, n, v)
i += 1
except OSError:
break ## Expected, this is how iteration ends.
def notify_windows(action, tree, path, varname, value):
win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')
print("---%s %s" % (action, reg_entry(tree, path, varname, value)), file=sys.stderr)
def manage_registry_env_vars(varname=None, value=None):
reg_keys = [
('HKEY_LOCAL_MACHINE', r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'),
('HKEY_CURRENT_USER', r'Environment'),
]
for (tree_name, path) in reg_keys:
tree = eval('winreg.%s'%tree_name)
try:
with winreg.ConnectRegistry(None, tree) as reg:
with winreg.OpenKey(reg, path, 0, winreg.KEY_ALL_ACCESS) as key:
if not varname:
for regent in yield_all_entries(tree_name, path, key):
print(regent)
else:
if not value:
if varname.startswith('-'):
varname = varname[1:]
value = query_value(key, varname)
winreg.DeleteValue(key, varname)
notify_windows("Deleted", tree_name, path, varname, value)
break ## Don't propagate into user-tree.
else:
value = query_value(key, varname)
print(reg_entry(tree_name, path, varname, value))
else:
if varname.startswith('+'):
varname = varname[1:]
value = query_value(key, varname) + ';' + value
winreg.SetValueEx(key, varname, 0, winreg.REG_EXPAND_SZ, value)
notify_windows("Updated", tree_name, path, varname, value)
break ## Don't propagate into user-tree.
except PermissionError as ex:
print("!!!Cannot access %s due to: %s" %
(reg_key(tree_name, path, varname), ex), file=sys.stderr)
except FileNotFoundError as ex:
print("!!!Cannot find %s due to: %s" %
(reg_key(tree_name, path, varname), ex), file=sys.stderr)
if __name__=='__main__':
args = sys.argv
argc = len(args)
if argc > 3:
print(__doc__.format(prog=args[0]), file=sys.stderr)
sys.exit()
manage_registry_env_vars(*args[1:])
다음은 setenv.py
현재 경로의 어딘가에 파일로 저장된 것으로 가정 한 사용 예 입니다. 이 예제 에서는 admin-rights 가 없으므로 변경 사항이 로컬 사용자의 레지스트리 트리에만 영향을 미쳤습니다.
> REM ## Print all env-vars
> setenv.py
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
HKEY_CURRENT_USER\Environment:PATH=...
...
> REM ## Query env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
!!!Cannot find HKEY_CURRENT_USER\Environment:PATH due to: [WinError 2] The system cannot find the file specified
> REM ## Set env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo
> REM ## Append env-var:
> setenv.py +PATH D:\Bar
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo;D:\Bar
> REM ## Delete env-var:
> setenv.py -PATH
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Deleted HKEY_CURRENT_USER\Environment:PATH
[*] 적응 : http://code.activestate.com/recipes/416087-persistent-environment-variables-on-windows/
For reference purpose, for anyone searching how to change the path via code, I am quoting a useful post by a Delphi programmer from this web page: http://www.tek-tips.com/viewthread.cfm?qid=686382
TonHu (Programmer) 22 Oct 03 17:57 I found where I read the original posting, it's here: http://news.jrsoftware.org/news/innosetup.isx/msg02129....
The excerpt of what you would need is this:
You must specify the string "Environment" in LParam. In Delphi you'd do it this way:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
It was suggested by Jordan Russell, http://www.jrsoftware.org, the author of (a.o.) InnoSetup, ("Inno Setup is a free installer for Windows programs. First introduced in 1997, Inno Setup today rivals and even surpasses many commercial installers in feature set and stability.") (I just would like more people to use InnoSetup )
HTH
In a corporate network, where the user has only limited access and uses portable apps, there are these command line tricks:
- Query the user env variables:
reg query "HKEY_CURRENT_USER\Environment"
. Use"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
for LOCAL_MACHINE. - Add new user env variable:
reg add "HKEY_CURRENT_USER\Environment" /v shared_dir /d "c:\shared" /t REG_SZ
. UseREG_EXPAND_SZ
for paths containing other %% variables. - Delete existing env variable:
reg delete "HKEY_CURRENT_USER\Environment" /v shared_dir
.
This script http://www.autohotkey.com/board/topic/63210-modify-system-path-gui/
includes all the necessary Windows API calls which can be refactored for your needs. It is actually an AutoHotkey GUI to change the System PATH easily. Needs to be run as an Administrator.
참고URL : https://stackoverflow.com/questions/8358265/how-to-update-path-variable-permanently-from-cmd-windows
'programing tip' 카테고리의 다른 글
dyld : 라이브러리가로드되지 않음 : PHP 관련 항목이있는 /usr/local/lib/libpng16.16.dylib (0) | 2020.07.18 |
---|---|
요소 이름에 대한 사례 규칙? (0) | 2020.07.18 |
앱 실행 실패 앱 : processDebugResources Android Studio (0) | 2020.07.18 |
jQuery ajax 함수의 contentType과 dataType의 차이점 (0) | 2020.07.18 |
한 줄에 Java 로깅 출력을 표시하려면 어떻게합니까? (0) | 2020.07.18 |