setx로 1024 자 제한 극복


74

setx다음과 같은 명령을 사용하여 환경 변수를 설정하려고 합니다.

setx 경로 "f : \ common tools \ git \ bin; f : \ common tools \ python \ app; f : \ common tools \ python \ app \ scripts; f : \ common tools \ ruby ​​\ bin; f : \ masm32 \ 빈; F : \ Borland \ BCC55 \ Bin; % PATH % "

그러나 값이 1024자를 초과하면 다음 오류가 발생합니다.

경고 : 저장중인 데이터가 1024 자로 잘립니다.

성공 : 지정된 값이 저장되었습니다.

그러나 결국 일부 경로는 변수에 저장되지 않습니다. 오류가 제안하는대로 문자 제한으로 인해 추측됩니다.


을 편집 할 수있는 다른 방법의 목록이 있습니다 %PATH%superuser.com/questions/297947은
Ehtesh Choudhury의

1
모든 환경 변수를 그래픽으로 편집 할 수있는 Rapid Environment Editor 를 살펴보십시오 (백업도 저장할 수 있음).
ja72

3
요청한 것을 명확하게 수행하지 않을 때 성공을 주장하는 다른 사람이 있습니까? 경로를 그대로 유지하면서 실패하지 않는 것이 문제가되지 않습니까?
Chad Schouggins

이것은 여전히 ​​Windows 10에서 잘립니다?
cowlinator

1
그렇습니다. Windows 10
Ivan

답변:


48

가장 좋은 방법은 레지스트리를 직접 편집하는 것입니다.

값으로 이동하여 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment편집 한 Path다음 재부팅하여 새 값을 활성화하십시오.

그러나 소스에 따라 최대 환경 변수 길이 (최대 2,048 또는 32,768 바이트) 까지 매우 긴 경로를 입력 할 수 있지만 너무 긴 경우 모든 소프트웨어가 올바르게 읽고 처리 할 수있는 것은 아닙니다.


1
여기서 재부팅이 정말로 필요합니까? setx는 어떻게합니까? Setx는 재부팅이 필요하지 않습니다.
Madhur Ahuja

11
예, 재부팅이 필요합니다. setx표시된대로 레지스트리를 편집 한 다음 WM_SETTINGCHANGE메시지 를 브로드 캐스트 합니다. 모든 최상위 창에 시스템 설정이 변경되었음을 알려줍니다 (이 경우 환경 변수). 이것이 없으면 탐색기와 함께 연 프로그램이 변경 사항을 알 수 없습니다. 당신은 할 수 수동으로 메시지를 직접 방송 (난 그냥 그렇게하는 프로그램을 작성하고 배치 파일 교체 SETX즉 방송 다음 레지스트리 편집한다)하지만, 단지 좋아 setx하고, 시스템 등록 정보 ENVVAR 대화, 그것은 부작용이있다 재부팅을 선호하십시오.
Synetech

2
아 그리고 환경 변수를 편집합니다. 다른 변수를 포함하는 환경 변수는 확장을 중지하기 때문에 재부팅하지 않으면 실제로 문제가 발생합니다. 예를 들어, 난 그냥 방송 지금 내 길이며 경로가 비어 / "깨진"이기 때문에 오류가 발생합니다. 재부팅 할 때까지 vars가 제대로 확장되지 않습니다. 불행히도 이것은“정상”입니다. :-|
Synetech

3
WM_SETTINGCHANGE 메시지를 브로드 캐스트 하는 작은 PowerShell 스크립트 를 찾았습니다 .
저스틴 친애하는

10
REG add 명령을 통해 위의 레지스트리 방법을 사용한 다음 SETX를 사용하여 다른 변수를 자체 변수로 설정할 수 있습니다 (예 : SETX / M USERNAME % USERNAME %). 그러면 WM_SETTINGCHANGE 메시지가 설정되고 배치 파일의 경로를 설정할 수 있습니다.
Art

29

Windows Vista 이상을 사용 symbolic link하는 경우 폴더를 만들 수 있습니다 . 예를 들면 다음과 같습니다.

mklink /d C:\pf "C:\Program Files"
mklink /d C:\pf86 "C:\Program Files (x86)"

c:\pf프로그램 파일 폴더와 같이 링크를 만듭니다 . 이 트릭을 사용하여 내 경로에서 300자를 깎았습니다.

(setx와 관련이 없지만 1024 자 제한을 극복하는 사람들에게 유용합니다)


18

다음과 유사한 PowerShell 스크립트를 사용할 수 있습니다.

$newPath = 'f:\common tools\git\bin;f:\common tools\python\app;f:\common tools\python\app\scripts;f:\common tools\ruby\bin;f:\masm32\bin;F:\Borland\BCC55\Bin'
$oldPath = [Environment]::GetEnvironmentVariable('path', 'machine');
[Environment]::SetEnvironmentVariable('path2', "$($newPath);$($oldPath)",'Machine');

Environment.SetEnvironmentVariable () API 호출이 방송됩니다 WM_SETTINGCHANGE그래서 당신이 다시 부팅 할 필요가 없습니다.


다음 줄도 필요하지 않습니다. [Environment] :: SetEnvironmentVariable ( 'path', "$ newPath", 'Machine');
Fedor Steeman

1
세 번째 줄에서는 여분의 달러 기호와 괄호가 어떤 이점을 가져 오는지 잘 모르겠습니다. 그냥 말할 수 [Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')없습니까?
twasbrillig

1
@twasbrillig 문자열에 변수를 포함시킬 때 조심합니다. 이 경우 불필요합니다.
저스틴 친애하는

3
관리자 명령 프롬프트에서이를 호출 할 수 있습니다.@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -Command "[Environment]::SetEnvironmentVariable('path',\"C:\Program Files (x86)\GNU\GnuPG;$([Environment]::GetEnvironmentVariable('path','Machine'))\",'Machine');"
Mark C

7

이 오픈 소스 SetEnv 명령 줄 도구는 PATH 및 기타 환경 변수를 제한없이 편집하는 데 좋습니다. 동적 버퍼를 사용하므로 1024와 같은 정적 제한이 없습니다.

http://www.codeproject.com/Articles/12153/SetEnv

변수에 추가 할 접두사로 %를 선택하는 것이 더 좋을 수 있습니다. 다른 배치 로컬 변수와 함께 사용하면 구문이 어려울 수 있습니다 ...


> SetEnv 도구는 PATH 및 기타 환경 변수를 제한없이 편집 할 수 있습니다. 실제로, 나는 그 페이지에서 Darka와 개인적으로 작업하여 SetEnv를 더욱 개선하여 확장 / 하위 변수 (동적 변수 확장 섹션)를 완전히 지원할 수있게되었으며, 이는 실제로 원시 경로의 길이 를 줄이는 데 도움이됩니다 .
Synetech

4

경로 조작을위한 setx보다 훨씬 뛰어난 도구는 pathed.exe 입니다. 불행히도 경로 편집에만 국한됩니다.

setx보다 우수한 사용자 경험 외에도 1024 자 제한이 없습니다. 직접 레지스트리 조작과 달리이 애플리케이션 은 브로드 캐스트 할 Environment.SetEnvironmentVariable () API 호출을 사용합니다 WM_SETTINGCHANGE.


2
superuser.com/questions/297947/is-the-the-re-way-to-edit-path-in-windows-7에있는 다른 도구 (pathed.exe 포함) 목록이 있습니다.
Ehtesh Choudhury


2

내가 가장 좋아하는 방법은 8.3 이름을 사용하도록 PATH 변수의 폴더 이름을 변경하는 것입니다. 이 StackOverflow 답변 에는 전체 PATH 변수의 "최소화 된"버전을 생성하는 멋진 스크립트 (.bat 파일에서 실행)가 있으며, 변수 편집 대화 상자에 붙여 넣을 수 있습니다. 주의 사항은 SYSTEM 부분과 USER 부분을 분리해야한다는 것입니다. 스크립트가 진행되고 각 폴더의 축소 버전을 알아 내면 유효하지 않거나 존재하지 않는 경로를 삭제하고 경고합니다. 좋은 작은 정리 보너스.


를 사용한 경우주의하십시오 fsutil.exe behavior set disable8dot3 1.
Andrew Morton

@AndrewMorton 좋은 지적이지만 스크립트가 8.3 이름을 "생성"하지 않는다는 사실로 인해 "처리되지"않을 것입니다. 파일 시스템이 지정한 8.3 이름 만보고합니까? 따라서 폴더에 8.3 이름이 없으면 스크립트는 대체 이름을 제안하지 않습니다. 그러나 fsutil 8dot3name strip스크립트를 사용하여 AFTER를 사용하면 영향을받는 폴더에 문제가 발생합니다.
Andrew Steitz

불행히도 나는 그것을 점검 할 여분의 드라이브 나 시스템이 없다. 그러나 fsutil 8dot3name strip오늘 이전에 일부를 사용 했으며 (a) 레지스트리를 먼저 확인하고 (b) 경로가 레지스트리에 저장되어 있다고 생각하면 사용자가 /f(강제) 옵션을 사용하지 않는 한 내 이전 관심사는 보증되지 않을 수 있습니다 .
Andrew Morton

2

이 줄을 BAT에 넣을 수 있습니다.

setx path "%%path%%;c:\drive\fr;c:\drive\installs\7z"

더블을 참조하십시오 %%.

(참조 : https://support.microsoft.com/en-us/kb/75634 )


링크가 깨졌습니다
Ivan

1
경고! 이로 인해 문제가 발생 %path%;c:\...[snip]...\7z하고 사용자 path변수에 쓰면서 거기 에 있던 다른 것을 버립니다.
유진 페트로프

프로그램이 사용하는 PATH 환경 변수는 기계와 로컬 PATH 변수의 조합입니다. 로컬 경로에서 현재 데이터를 파괴하는 것 외에도 이것이 아무것도하지 않는다고 생각합니다. 갖는 %path%로컬 경로 환경 변수에 아무런 효과가 없습니다.
Annan

0

시스템 PATH와 사용자 PATH를 별도로 유지할 필요가없는 경우 :

::setx /m truncate variable length to 1024 REG ADD 
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_SZ /f /d "%PATH%"
::empty local path, use system wide only, else it will enlarge with every setx /m
setx PATH ""
::setx is dummy but propagate system wide variables with it
setx /m A A

1
여기서 제안하는 내용에 대해 좀 더 설명해 주시겠습니까?
G-Man

setx 1024 문자 제한을 해결하기 위해 명령을 사용할 수 있습니다. 예는 PATH 변수에 직접 표시됩니다. 이전 답변이 도움이 되더라도 최종 솔루션이 없습니다.
판타지 스토리

0

가장 좋은 방법은 다음 방법이라고 생각합니다 (powershell 사용).이 방법으로도 1024 문자의 소동을 피하십시오.

https://gist.github.com/drazul/b92f780689bd89a0d2a7 에서 코드를 볼 수 있습니다.

#------------ Add path to system variable -------------------------------------

$path2add = ';C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

If (!$systemPath.contains($path2add)) {
    $systemPath += $path2add
    $systemPath = $systemPath -join ';'
    [Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');
    write-host "Added to path!"
    write-host $systemPath
}

#------------ Delete path from system variable --------------------------------

$path2delete = 'C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

$systemPath = $systemPath.replace($path2delete, '')
$systemPath = $systemPath -join ';'

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

write-host "Deleted from path!"
write-host $systemPath

#------------ Clean system variable -------------------------------------------

$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

while ($systemPath.contains(';;')) {
    $systemPath = $systemPath.replace(';;', ';')
}

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

write-host "Cleaned path!"
write-host $systemPath
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.