Vượt qua giới hạn 1024 ký tự với setx


74

Tôi đang cố gắng thiết lập các biến môi trường bằng cách sử dụng setxlệnh, chẳng hạn như sau

setx PATH "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;% PATH% "

Tuy nhiên, tôi gặp lỗi sau nếu giá trị dài hơn 1024 ký tự:

CẢNH BÁO: Dữ liệu đang được lưu bị cắt ngắn thành 1024 ký tự.

THÀNH CÔNG: Giá trị được chỉ định đã được lưu.

Nhưng một số đường dẫn cuối cùng không được lưu trong biến, tôi đoán do giới hạn ký tự như lỗi cho thấy.


Có một danh sách các cách khác để chỉnh sửa %PATH%tại superuser.com/questions/297947
Ehtesh Choudhury

1
Nhìn vào Trình chỉnh sửa môi trường nhanh cho phép bạn chỉnh sửa tất cả các biến môi trường (bạn cũng có thể lưu bản sao lưu).
ja72

3
Có ai khác bận tâm bởi sự thành công này không khi nó rõ ràng không làm những gì được yêu cầu? Có phải nó không gặp rắc rối khi điều này không thất bại trong khi rời khỏi con đường chính xác như thế nào?
Chad Schouggins 17/07/17

Điều này vẫn còn cắt trên windows 10?
chăn bò

1
Vâng, nó có trên Windows 10
Ivan

Câu trả lời:


48

Đặt cược tốt nhất của bạn là chỉnh sửa sổ đăng ký trực tiếp.

Điều hướng đến HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentvà chỉnh sửa Pathgiá trị (sau đó khởi động lại để kích hoạt giá trị mới).

Tuy nhiên, xin lưu ý rằng mặc dù bạn có thể nhập một đường dẫn rất dài, (tối đa chiều dài biến môi trường tối đa; 2.048 hoặc 32.768 byte tùy theo nguồn), không phải tất cả phần mềm đều có thể đọc và xử lý chính xác nếu quá dài.


1
Là khởi động lại thực sự cần thiết ở đây? Làm thế nào để setx làm điều đó? Setx không yêu cầu khởi động lại.
Madhur Ahuja

11
Có, cần phải khởi động lại. setxchỉnh sửa sổ đăng ký như tôi đã chỉ ra, sau đó phát đi một WM_SETTINGCHANGEtin nhắn. Điều này cho tất cả các cửa sổ cấp cao nhất rằng cài đặt hệ thống đã thay đổi (trong trường hợp này là biến môi trường). Không có điều đó, Explorer và các chương trình bạn đã mở bằng nó sẽ không biết về sự thay đổi. Bạn có thể tự phát tin nhắn theo cách thủ công (Tôi đã viết một chương trình để thực hiện điều đó và một tệp bó để thay thế SETXcho việc chỉnh sửa sổ đăng ký theo sau phát sóng), nhưng giống như setxvà hộp thoại System Properties envvar, nó có tác dụng phụ làm cho khởi động lại thích hợp hơn.
Synetech

2
Oh và chỉnh sửa một env.var. thực sự gây ra vấn đề nếu bạn không khởi động lại bởi vì bất kỳ biến môi trường nào chứa các biến khác sẽ ngừng được mở rộng. Ví dụ, tôi chỉ phát nó và bây giờ đây là đường dẫn của tôi và tôi gặp lỗi vì đường dẫn hiện tại đã bị hỏng / trống. Không có vars nào sẽ mở rộng đúng cách một lần nữa cho đến khi tôi khởi động lại. Thật không may, đây là một cuộc bình thường. :-|
Synetech

3
Tôi đã tìm thấy một tập lệnh PowerShell nhỏ sẽ phát thông báo WM_SETTINGCHANGE.
Justin Dearing

10
Bạn có thể sử dụng phương thức đăng ký ở trên thông qua lệnh REG add và sau đó sử dụng SETX để đặt một số biến khác thành chính nó (ví dụ: SETX / M USERNAME% USERNAME%). Điều này sẽ khiến thông báo WM_SETTINGCHANGE được đặt và cung cấp cho bạn khả năng đặt đường dẫn từ tệp bó.
Nghệ thuật

29

nếu bạn đang sử dụng windows vista trở lên, bạn có thể tạo một symbolic linkthư mục. ví dụ:

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

sẽ tạo một liên kết vì vậy c:\pfsẽ là thư mục tập tin chương trình của bạn. Tôi đã loại bỏ 300 ký tự khỏi đường dẫn của mình bằng cách sử dụng thủ thuật này.

(Tôi biết nó không liên quan đến setx nhưng nó hữu ích cho những người đang tìm kiếm quá mức trên giới hạn 1024 char)


18

Bạn có thể sử dụng tập lệnh PowerShell tương tự như sau:

$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');

Cuộc gọi API của môi trường.SetEn Môi trườngVariable () sẽ phát sóng WM_SETTINGCHANGEđể bạn không cần phải khởi động lại.


Bạn cũng không cần dòng sau: [Môi trường] :: SetEn Môi trường Biến đổi ('đường dẫn', "$ newPath", 'Máy');
Fedor Steeman

1
Trong dòng thứ 3, tôi không chắc những gì có lợi cho các ký hiệu đô la và dấu ngoặc đơn mang lại. Bạn không thể nói [Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')sao?
twasbrillig

1
@twasbrillig Tôi chỉ cẩn thận khi bao gồm một biến trong chuỗi. trong trường hợp này là không cần thiết
Justin thân mến

3
Bạn có thể gọi nó từ Nhắc lệnh của Quản trị viên:@"%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');"
Đánh dấu C

7

Công cụ dòng lệnh SetEnv mã nguồn mở này rất tốt để chỉnh sửa PATH và các biến môi trường khác mà không bị giới hạn. Nó sử dụng bộ đệm động nên không có giới hạn tĩnh như 1024.

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

Mặc dù vậy, việc chọn% làm tiền tố để thêm vào một biến có thể tốt hơn, vì đôi khi làm cho cú pháp trở nên khó khăn nếu được sử dụng với các biến cục bộ khác ...


> Công cụ SetEnv rất tốt để chỉnh sửa PATH và các biến môi trường khác mà không bị giới hạn . Trên thực tế, tôi đã trực tiếp làm việc với Darka trên trang đó để giúp SetEnv trở nên tốt hơn để nó có thể hỗ trợ đầy đủ các biến phụ / mở rộng (phần Mở rộng biến đổi động), thực sự giúp giảm độ dài của đường dẫn thô.
Synetech

4

Một công cụ vượt trội hơn nhiều so với setx để thao tác đường dẫn là pathed.exe . Thật không may, nó bị giới hạn trong việc chỉnh sửa đường dẫn.

Ngoài trải nghiệm người dùng vượt trội hơn setx, bạn không có giới hạn 1024 ký tự. Không giống như thao tác đăng ký trực tiếp, ứng dụng này sử dụng lệnh gọi API của môi trường.SetEn MôiVariable () sẽ phát WM_SETTINGCHANGE.


2
Có một danh sách các công cụ khác (bao gồm cả pathed.exe) tại superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7
Ehtesh Choudhury


2

Cách ưa thích của tôi là thay đổi tên thư mục trong các biến PATH để sử dụng tên 8.3. Câu trả lời StackOverflow này có một tập lệnh tuyệt vời (chạy từ tệp .bat) sẽ tạo phiên bản "rút gọn" của toàn bộ biến PATH, sau đó bạn có thể dán vào hộp thoại Chỉnh sửa biến. Chỉ có một điều lưu ý là bạn sẽ cần phải tách ra các phần HỆ THỐNG và NGƯỜI DÙNG. Khi tập lệnh đi qua và tìm ra phiên bản rút gọn cho mỗi thư mục, nó sẽ loại bỏ và cảnh báo bạn về mọi đường dẫn không hợp lệ / không tồn tại. Đẹp chút dọn dẹp tiền thưởng.


Hãy cẩn thận nếu bạn đã sử dụng fsutil.exe behavior set disable8dot3 1.
Andrew Morton

@AndrewMorton điểm tốt nhưng sẽ không bị "xử lý" bởi thực tế là tập lệnh không "tạo" tên 8.3, nó chỉ báo cáo tên 8.3 mà hệ thống tệp được gán? Vì vậy, nếu một thư mục không có tên 8.3, tập lệnh sẽ không đề xuất thay thế. Tuy nhiên, sử dụng fsutil 8dot3name stripSAU bằng cách sử dụng tập lệnh chắc chắn sẽ gây ra sự cố cho các thư mục bị ảnh hưởng.
Andrew Steitz

Thật không may, tôi không có ổ đĩa dự phòng hoặc hệ thống để kiểm tra. Tuy nhiên, đã sử dụng một số fsutil 8dot3name stripsớm hơn ngày hôm nay và xem xét rằng (a) nó kiểm tra sổ đăng ký trước và (b) đường dẫn được lưu trữ trong sổ đăng ký, mối quan tâm trước đó của tôi có thể không chính đáng, miễn là người dùng không sử dụng /ftùy chọn (bắt buộc) .
Andrew Morton

2

Bạn có thể đặt dòng này trong BAT của bạn:

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

Xem đôi %%.

(Tham khảo: https://support.microsoft.com/en-us/kb/75634 )


Liên kết hiện đã bị hỏng
Ivan

1
CẢNH BÁO! Điều này có thể sẽ phá vỡ mọi thứ, nó sẽ ghi %path%;c:\...[snip]...\7zvào pathbiến người dùng , bỏ đi bất cứ thứ gì bạn có ở đó.
Eugene Petrov

Biến môi trường PATH được các chương trình sử dụng là sự kết hợp giữa máy và biến PATH cục bộ. Ngoài việc phá hủy dữ liệu hiện tại trong đường dẫn cục bộ, tôi không nghĩ việc này có tác dụng gì. Có %path%trong biến môi trường đường dẫn cục bộ nên không có hiệu lực.
Annan

0

nếu không bắt buộc phải tách riêng hệ thống PATH và người dùng 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
Bạn có thể giải thích thêm một chút về những gì bạn đang đề xuất ở đây?
G-Man

Nó chỉ là một lệnh sẵn sàng để sử dụng giới hạn setx 1024 ký tự. Ví dụ được hiển thị trực tiếp trên biến PATH. Mặc dù các câu trả lời trước rất hữu ích nhưng họ thiếu một giải pháp cuối cùng.
tưởng tượng

0

Tôi nghĩ rằng cách tốt nhất là cách tiếp theo (với powershell) Với cách này, bạn cũng tránh được việc chấp nhận 1024 ký tự.

Bạn có thể xem mã trên: 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.