เอาชนะขีด จำกัด 1024 อักขระด้วย setx


74

ฉันพยายามตั้งค่าตัวแปรสภาพแวดล้อมโดยใช้setxคำสั่งดังต่อไปนี้

เส้นทาง setx "f: \ tools ทั่วไป \ git \ bin; f: \ tools ทั่วไป \ python \ app; f: \ tools ทั่วไป \ python \ app \ script; f: \ 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
มีใครอีกไหมที่รบกวนความสำเร็จที่อ้างว่านี้เมื่อมันไม่ได้ทำในสิ่งที่ขอ? มันไม่ได้เป็นปัญหาหรือเปล่าที่สิ่งนี้จะไม่ล้มเหลวในขณะที่ออกจากเส้นทางเหมือนเดิมหรือไม่?
ชาด Schouggins

สิ่งนี้ยังคงถูกตัดทอนใน windows 10 หรือไม่?
ประสานงาน

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ข้อความ สิ่งนี้จะบอกหน้าต่างระดับบนสุดทั้งหมดว่าการตั้งค่าระบบมีการเปลี่ยนแปลง (ในกรณีนี้คือตัวแปรสภาพแวดล้อม) หากไม่มีสิ่งนั้น Explorer และโปรแกรมที่คุณเปิดด้วยจะไม่ทราบเกี่ยวกับการเปลี่ยนแปลง คุณสามารถออกอากาศข้อความด้วยตนเอง (ฉันเขียนโปรแกรมเพื่อทำเช่นนั้นและไฟล์แบตช์เพื่อแทนที่SETXที่ทำให้การแก้ไขรีจิสทรีตามด้วยการออกอากาศ) แต่ก็เหมือนกับsetxและไดอะล็อก envvar คุณสมบัติของระบบมีผลข้างเคียงที่ ทำให้การรีบูตดีกว่า
Synetech

2
โอ้และแก้ไข env.var จริง ๆ แล้วทำให้เกิดปัญหาหากคุณไม่รีบูตเพราะตัวแปรสภาพแวดล้อมใด ๆ ที่มีตัวแปรอื่น ๆ จะหยุดการขยายตัว ตัวอย่างเช่นฉันเพิ่งออกอากาศและตอนนี้นี่คือเส้นทางของฉันและฉันได้รับข้อผิดพลาดเนื่องจากเส้นทางตอนนี้“ เสีย” / ว่างเปล่า ไม่มี vars ใดที่จะขยายอย่างถูกต้องอีกครั้งจนกว่าฉันจะรีบูต น่าเสียดายที่นี่เป็น“ ปกติ” :-|
Synetech

3
ฉันพบสคริปต์ PowerShell ขนาดเล็กที่จะออกอากาศข้อความ WM_SETTINGCHANGE
Justin Dearing

10
คุณสามารถใช้วิธีการรีจิสทรีด้านบนผ่านคำสั่ง REG add จากนั้นใช้ SETX เพื่อตั้งค่าตัวแปรอื่น ๆ ให้กับตัวเอง (เช่น: SETX / M USERNAME% USERNAME%) สิ่งนี้จะทำให้ข้อความ WM_SETTINGCHANGE ถูกตั้งค่าและให้ความสามารถในการตั้งค่าเส้นทางจากแบตช์ไฟล์
ศิลปะ

29

หากคุณใช้ windows vista ขึ้นไปคุณสามารถสร้าง a symbolic linkไปยังโฟลเดอร์ได้ ตัวอย่างเช่น:

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

จะสร้างลิงค์ดังนั้นc:\pfจะเป็นโฟลเดอร์ไฟล์โปรแกรมของคุณ ฉันโกนหนวดออกไป 300 ตัวจากเส้นทางของฉันโดยใช้เคล็ดลับนี้

(ฉันรู้ว่ามันไม่เกี่ยวข้องกับ setx แต่มันมีประโยชน์สำหรับคนที่กำลังค้นหา overcomming ที่ 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
ในบรรทัดที่ 3 ฉันไม่แน่ใจว่าประโยชน์ที่จะได้รับจากเครื่องหมายดอลลาร์และวงเล็บคืออะไร คุณพูด[Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')ไม่ได้เหรอ
twasbrillig

1
@twasbrillig ฉันแค่ระวังเมื่อฉันรวมตัวแปรในสตริง ในกรณีนี้มันไม่จำเป็น
Justin Dearing

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');"
ทำเครื่องหมาย C

7

เครื่องมือบรรทัดคำสั่ง SetEnv แบบโอเพ่นซอร์สนี้ดีสำหรับการแก้ไข PATH และตัวแปรสภาพแวดล้อมอื่น ๆ โดยไม่มีข้อ จำกัด มันใช้บัฟเฟอร์แบบไดนามิกจึงไม่มีข้อ จำกัด คงที่เช่น 1024

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

การเลือก% a เป็นส่วนนำหน้าเพื่อผนวกเข้ากับตัวแปรอาจทำได้ดีกว่าแม้ว่าจะทำให้ไวยากรณ์ยากขึ้นบางครั้งหากใช้กับตัวแปรโลคัลแบตช์อื่น ...


> เครื่องมือ SetEnv นั้นดีในการแก้ไข PATH และตัวแปรสภาพแวดล้อมอื่น ๆ โดยไม่มีข้อ จำกัด แน่นอน ในความเป็นจริงฉันได้ทำงานร่วมกับ Darka ในหน้านั้นเพื่อช่วยให้ SetEnv ดียิ่งขึ้นเพื่อให้สามารถรองรับการขยาย / ตัวแปรย่อยอย่างเต็มที่ (ส่วน Dynamic Variable Expansion) ซึ่งช่วยลดความยาวของเส้นทางดิบ
Synetech

4

เครื่องมือที่ดีกว่าไกลกว่า setX สำหรับการจัดการเส้นทางpathed.exe น่าเสียดายที่การแก้ไขเส้นทางมี จำกัด

นอกเหนือจากประสบการณ์การใช้งานที่เหนือกว่า setx คุณไม่มีขีด จำกัด 1024 ตัวอักษร ซึ่งแตกต่างจากการจัดการรีจิสทรีโดยตรงโปรแกรมนี้ใช้Environment.SetEnvironmentVariable ()เรียก API WM_SETTINGCHANGEซึ่งจะออกอากาศ


2
มีรายการเครื่องมืออื่น ๆ (รวมถึง pathed.exe) ที่ superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7
Ehtesh Choudhury


2

วิธีที่ฉันชอบคือเปลี่ยนชื่อโฟลเดอร์ในตัวแปร PATH เพื่อใช้ชื่อ 8.3 คำตอบ StackOverflow นี้มีสคริปต์ที่ยอดเยี่ยม (เรียกใช้จากไฟล์. bat) ที่จะสร้างตัวแปร PATH ทั้งหมด "เวอร์ชั่น" ซึ่งคุณสามารถวางลงในกล่องโต้ตอบแก้ไขตัวแปรได้ ข้อแม้เท่านั้นคือคุณจะต้องแยกส่วน SYSTEM และ USER ออก เมื่อสคริปต์ดำเนินการและตรวจสอบเวอร์ชันที่ย่อเล็กสุดของแต่ละโฟลเดอร์มันจะยกเลิกและแจ้งเตือนคุณเกี่ยวกับเส้นทางที่ไม่ถูกต้อง / ไม่มีอยู่ โบนัสทำความสะอาดเล็กน้อยดี


fsutil.exe behavior set disable8dot3 1ระวังถ้าคุณได้ใช้
Andrew Morton

@AndrewMorton จุดที่ดี แต่นั่นจะไม่ "จัดการ" โดยความจริงที่ว่าสคริปต์ไม่ได้ "สร้าง" ชื่อ 8.3 มันเพียงแค่รายงานชื่อ 8.3 ที่ระบบไฟล์มอบหมาย? ดังนั้นหากโฟลเดอร์ไม่มีชื่อ 8.3 สคริปต์จะไม่เสนอการแทนที่ อย่างไรก็ตามการใช้fsutil 8dot3name stripAFTER โดยใช้สคริปต์จะทำให้เกิดปัญหากับโฟลเดอร์ที่ได้รับผลกระทบ
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ตัวแปรผู้ใช้ปล่อยสิ่งอื่นที่คุณมีอยู่
Eugene Petrov

ตัวแปรสภาพแวดล้อม 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

มันเป็นเพียงความพร้อมที่จะใช้คำสั่งเพื่อแก้ไขข้อ จำกัด อักขระ 1024 setx ตัวอย่างแสดงโดยตรงบนตัวแปร PATH แม้ว่าคำตอบก่อนหน้าจะมีประโยชน์ แต่ก็ไม่มีวิธีแก้ปัญหาขั้นสุดท้าย
fantastory

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.