Mengatasi batas 1024 karakter dengan setx

74

Saya mencoba mengatur variabel lingkungan menggunakan setxperintah, seperti berikut

setx PATH "f: \ alat umum \ git \ bin; f: \ alat umum \ python \ app; f: \ alat umum \ python \ app \ skrip; f: \ alat umum \ ruby ​​\ bin; f: \ masm32 \ bin; F: \ Borland \ BCC55 \ Bin;% PATH% "

Namun, saya mendapatkan kesalahan berikut jika nilainya lebih dari 1024 karakter:

PERINGATAN: Data yang disimpan terpotong hingga 1024 karakter.

SUKSES: Nilai yang ditentukan telah disimpan.

Tetapi beberapa jalur pada akhirnya tidak disimpan dalam variabel, saya kira karena batas karakter seperti kesalahan menunjukkan.

Madhur Ahuja
sumber
Ada daftar cara alternatif untuk mengedit %PATH%di superuser.com/questions/297947
Ehtesh Choudhury
1
Lihat ke dalam Rapid Environment Editor yang memungkinkan Anda untuk mengedit semua variabel envirnoment secara grafis (Anda juga dapat menyimpan cadangan juga).
ja72
3
Apakah ada orang lain yang peduli dengan keberhasilan klaim ini ketika jelas tidak melakukan apa yang diminta? Apakah tidak masalah bahwa ini tidak gagal saat meninggalkan jalan persis seperti itu?
Chad Schouggins
Apakah ini masih terpotong pada windows 10?
cowlinator
1
Ya, itu terjadi pada Windows 10
Ivan

Jawaban:

48

Taruhan terbaik Anda adalah mengedit registri secara langsung.

Arahkan ke HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentdan edit Pathnilainya (lalu reboot untuk mengaktifkan nilai baru).

Perhatikan bahwa meskipun Anda dapat memasukkan jalur yang sangat panjang, (hingga panjang variabel lingkungan maksimum; 2.048 atau 32.768 byte tergantung pada sumbernya), tidak semua perangkat lunak akan dapat membaca dan menanganinya dengan benar jika terlalu panjang.

Synetech
sumber
1
Apakah reboot benar-benar diperlukan di sini? Bagaimana setx melakukannya? Setx tidak membutuhkan reboot.
Madhur Ahuja
11
Ya, diperlukan reboot. setxmengedit registri seperti yang saya sebutkan, lalu menyiarkan WM_SETTINGCHANGEpesan. Ini memberi tahu semua jendela tingkat atas bahwa pengaturan sistem telah berubah (dalam hal ini variabel lingkungan). Tanpa itu, Explorer dan program yang Anda buka dengannya tidak akan tahu tentang perubahan itu. Anda dapat menyiarkan pesan itu sendiri secara manual (saya menulis sebuah program untuk melakukan hal itu, dan file batch untuk menggantikan SETXyang membuat mengedit registri diikuti oleh siaran), tetapi sama seperti setxdan dialog Properti Sistem envvar, ia memiliki efek samping yang buat boot ulang lebih disukai.
Synetech
2
Oh dan mengedit env.var. sebenarnya menyebabkan masalah jika Anda tidak me-reboot karena variabel lingkungan apa pun yang berisi variabel lain akan berhenti diperluas. Sebagai contoh, saya hanya menyiarkannya dan sekarang ini jalur saya dan saya mendapatkan kesalahan karena jalur sekarang "rusak" / kosong. Tak satu pun dari vars akan diperluas dengan benar sampai saya reboot. Sayangnya ini "normal". :-|
Synetech
3
Saya menemukan skrip PowerShell kecil yang akan menyiarkan pesan WM_SETTINGCHANGE.
Justin Dearing
10
Anda dapat menggunakan metode registri di atas melalui perintah tambahkan REG dan kemudian menggunakan SETX untuk mengatur beberapa variabel lain untuk dirinya sendiri (yaitu: SETX / M USERNAME% USERNAME%). Ini akan menyebabkan pesan WM_SETTINGCHANGE disetel dan memberi Anda kemampuan untuk mengatur path dari file batch.
Seni
30

jika Anda menggunakan windows vista atau lebih tinggi, Anda dapat membuat symbolic linkke folder. sebagai contoh:

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

akan membuat tautan sehingga c:\pfakan menjadi folder file program Anda. Saya mencukur 300 karakter dari jalur saya dengan menggunakan trik ini.

(Saya tahu ini tidak terkait dengan setx tetapi berguna untuk orang yang mencari overcomming pada batas 1024 char)

Reza
sumber
18

Anda bisa menggunakan skrip PowerShell yang mirip dengan yang berikut:

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

The Environment.SetEnvironmentVariable () panggilan API akan disiarkan WM_SETTINGCHANGEsehingga Anda tidak perlu reboot.

Justin Dearing
sumber
Tidakkah Anda juga memerlukan baris berikut: [Lingkungan] :: SetEnvironmentVariable ('path', "$ newPath", 'Machine');
Fedor Steeman
1
Di baris ke-3, saya tidak yakin apa untungnya membawa tanda dolar tambahan dan tanda kurung. Tidak bisakah kau katakan saja [Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')?
twasbrillig
1
@twasbrillig Saya hanya berhati-hati ketika saya memasukkan variabel dalam sebuah string. dalam hal ini tidak perlu.
Justin Dearing
3
Anda dapat memanggil ini dari Administrator Command Prompt:@"%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

Alat baris perintah SetEnv sumber terbuka ini baik untuk mengedit PATH dan variabel lingkungan lainnya tanpa batasan. Ini menggunakan buffer dinamis sehingga tidak ada batasan statis seperti 1024.

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

Pilihan% sebagai awalan untuk menambahkan ke variabel bisa lebih baik, karena membuat sintaks kadang-kadang sulit jika digunakan dengan variabel lokal batch lain ...

Kharlos Dominguez
sumber
> Alat SetEnv baik untuk mengedit PATH dan variabel lingkungan lainnya tanpa batasan Memang. Bahkan, saya secara pribadi telah bekerja dengan Darka pada halaman itu untuk membantu membuat SetEnv lebih baik sehingga dapat sepenuhnya mendukung perluasan / sub-variabel (bagian Dynamic Variable Expansion), yang sebenarnya membantu mengurangi panjang jalur mentah.
Synetech
4

Alat yang jauh lebih unggul daripada setx untuk manipulasi path adalah pathed.exe . Sayangnya, ini terbatas pada pengeditan jalur.

Selain pengalaman pengguna yang unggul dari setx, Anda tidak memiliki batas 1024 karakter. Tidak seperti manipulasi registri langsung, aplikasi ini menggunakan panggilan API Environment.SetEnvironmentVariable () yang akan disiarkan WM_SETTINGCHANGE.

Justin Dearing
sumber
2
Ada daftar alat lain (termasuk pathed.exe) di superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7
Ehtesh Choudhury
2

Cara favorit saya adalah mengubah nama folder dalam variabel PATH untuk menggunakan nama 8.3. Jawaban StackOverflow ini memiliki skrip yang luar biasa (dijalankan dari file .bat) yang akan menghasilkan versi "minified" dari seluruh variabel PATH, yang kemudian dapat Anda tempelkan ke dialog Edit Variable. Satu-satunya peringatan adalah bahwa Anda perlu membagi bagian SISTEM dan PENGGUNA. Saat skrip berjalan dan mencari tahu versi yang diperkecil untuk setiap folder, skrip akan membuang dan memberi tahu Anda tentang jalur yang tidak valid / tidak ada. Bagus membersihkan bonus.

Andrew Steitz
sumber
Hati-hati jika sudah digunakan fsutil.exe behavior set disable8dot3 1.
Andrew Morton
@AndrewMorton poin bagus tapi bukankah itu akan "ditangani" oleh fakta bahwa skrip tidak "menghasilkan" nama 8.3, itu hanya melaporkan nama 8.3 yang ditugaskan sistem file? Jadi jika folder tidak memiliki nama 8.3, skrip tidak akan mengusulkan pengganti. Namun, menggunakan fsutil 8dot3name stripSETELAH menggunakan skrip pasti akan menyebabkan masalah untuk folder yang terpengaruh.
Andrew Steitz
Sayangnya saya tidak punya drive cadangan atau sistem untuk memeriksanya. Namun, setelah menggunakan beberapa fsutil 8dot3name striphari sebelumnya dan mempertimbangkan bahwa (a) ia memeriksa registri terlebih dahulu dan (b) jalan disimpan dalam registri, kekhawatiran saya sebelumnya mungkin tidak beralasan, selama pengguna tidak menggunakan opsi /f(kekuatan) opsi .
Andrew Morton
2

Anda dapat meletakkan baris ini di BAT Anda:

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

Lihat dobel %%.

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

Aminadav Glickshtein
sumber
Tautan sekarang rusak
Ivan
1
PERINGATAN! Ini mungkin akan merusak beberapa hal, itu akan menulis %path%;c:\...[snip]...\7zke pathvariabel pengguna , menjatuhkan apa pun yang Anda miliki di sana.
Eugene Petrov
Variabel lingkungan PATH yang digunakan oleh program adalah kombinasi dari mesin dan variabel PATH lokal. Selain menghancurkan data saat ini di jalur lokal saya tidak berpikir ini melakukan apa-apa. Memiliki %path%dalam variabel lingkungan jalur lokal seharusnya tidak berpengaruh.
Annan
0

jika tidak diperlukan untuk memisahkan sistem PATH dan pengguna 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
fantastory
sumber
1
Bisakah Anda menjelaskan sedikit lebih banyak tentang apa yang Anda sarankan di sini?
G-Man
Ini hanya perintah siap pakai untuk mengatasi batas setx 1024 karakter. Contoh ditampilkan langsung pada variabel PATH. Meskipun jawaban sebelumnya sangat membantu mereka tidak memiliki solusi akhir.
fantastory
0

Saya pikir cara terbaik adalah yang berikutnya (dengan PowerShell) Dengan cara ini Anda juga menghindari litmit 1024 karakter.

Anda dapat melihat kode di: 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
Drazul
sumber