Setx ile 1024 karakter sınırını aşmak


74

setxAşağıdaki gibi komut kullanarak ortam değişkenleri ayarlamaya çalışıyorum

setx PATH "f: \ ortak araçlar \ git \ bin; f: \ ortak araçlar \ python \ app; f: \ ortak araçlar \ python \ app \ scriptler; f: \ ortak araçlar \ ruby ​​\ bin; f: \ masm32 \ bin; F: \ Borland \ BCC55 \ bin;% PATH%"

Ancak, değerin 1024 karakterden uzun olması durumunda aşağıdaki hatayı alıyorum:

UYARI: Kaydedilen veriler 1024 karaktere kadar kısaltıldı.

BAŞARI: Belirtilen değer kaydedildi.

Ancak sonunda yolların bazıları değişkende kaydedilmez, hatanın önerdiği gibi karakter sınırlaması nedeniyle sanırım.


Düzenlemek için alternatif yollar listesi var %PATH%en superuser.com/questions/297947
Ehtesh Choudhury

1
Tüm ortam değişkenlerini grafiksel olarak düzenlemenizi sağlayan Hızlı Ortam Düzenleyici'ye bakın (ayrıca bir yedeklemeyi de kaydedebilirsiniz).
ja72,

3
Talep edilen şeyi açıkça yapmadığında başkasının bu iddiadaki başarısından rahatsız olduğu var mı? Yolun aynısını olduğu gibi bırakırken bunun başarısız olmaması sorun değil mi?
Chad Schouggins

Bu hala Windows 10'da kesiliyor mu?
cowlinator

1
Evet, Windows 10'da çalışıyor
Ivan

Yanıtlar:


48

En iyi bahis, kayıt defterini doğrudan düzenlemek.

Değere gidin HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentve düzenleyin Path(sonra yeni değeri etkinleştirmek için yeniden başlatın).

Ancak, çok uzun bir yol girebildiğiniz halde ( kaynağa bağlı olarak maksimum ortam değişkeni uzunluğu; 2,048 veya 32,768 bayt), tüm yazılımlar çok uzunsa doğru okuyamaz ve kullanamaz.


1
Yeniden başlatma gerçekten burada gerekli midir? Setx nasıl yapar? Setx yeniden başlatılmasını gerektirmez.
Madhur Ahuja

11
Evet, yeniden başlatma gerekiyor. setxbelirttiğim gibi kayıt defterini düzenler, daha sonra bir WM_SETTINGCHANGEmesaj yayınlar . Bu, tüm sistem pencerelerine bir sistem ayarının değiştiğini söyler (bu durumda bir ortam değişkeni). Bu olmadan, Explorer ve onunla açtığınız programlar değişiklikten haberdar olmaz. Sen olabilir elle mesaj kendiniz yayın (ben sadece bunu yapmak için bir program yazmış ve bir toplu iş dosyası yerine SETXbu yayın ardından bir kayıt defteri düzenleme yapar), fakat tıpkı setxve Sistem Özellikleri envvar iletişim, bu yan etkileri olduğunu vardır yeniden başlatmayı tercih edin.
Synetech

2
Oh ve bir env.var düzenleme. aslında yeniden başlatmazsanız sorun yaratır, çünkü diğer değişkenleri içeren ortam değişkenleri genişlemeyi durduracaktır. Mesela ben sadece yayın yapıyorum ve şimdi bu benim yolum ve bir hata alıyorum çünkü yol şimdi “kırılmış” / boş. Ben yeniden başlatılıncaya kadar değişkenlerin hiçbiri tekrar düzgün şekilde genişlemiyor. Ne yazık ki bu “normal” dir. :-|
Synetech

3
WM_SETTINGCHANGE mesajını yayınlayacak küçük bir PowerShell betiği buldum .
Justin Dearing,

10
Yukarıdaki kayıt defteri yöntemini REG add komutuyla kullanabilir ve ardından SETX'i kullanarak başka bir değişken daha ayarlayabilirsiniz (örneğin: SETX / M USERNAME% USERNAME%). Bu, WM_SETTINGCHANGE mesajının ayarlanmasına ve yolu bir toplu iş dosyasından ayarlayabilmenizi sağlayacaktır.
Sanat

29

Windows Vista veya üstü kullanıyorsanız symbolic link, klasöre bir yapabilirsiniz. Örneğin:

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

bir bağlantı yaparsanız c:\pfprogram dosya klasörünüz olur. Bu numarayı kullanarak yolumdaki 300 karakteri kestim.

(Setx ile ilgili olmadığını biliyorum, ancak 1024 char limitinde fazla arama yapan kişiler için faydalıdır)


18

PowerShell betiğini aşağıdakine benzer şekilde kullanabilirsiniz:

$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 çağrısı yayınlayacak WM_SETTINGCHANGEböylece yeniden gerekmez.


Ayrıca şu satıra da ihtiyacınız yok mu: [Environment] :: SetEnvironmentVariable ('path', "$ newPath", 'Machine');
Fedor Steeman

1
3. satırda, ekstra dolar işaretlerinin ve parantezlerin getirdiği şeyin ne faydası olduğundan emin değilim. Sadece söyleyemez miydin [Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')?
twasbrillig 15:15

1
@twasbrillig Sadece bir dizgede bir değişken eklerken dikkatli oluyorum. Bu durumda gereksiz.
Justin,

3
Bunu bir Yönetici Komut İstemi'nden arayabilirsiniz:@"%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

Bu açık kaynaklı SetEnv komut satırı aracı PATH ve diğer ortam değişkenlerini sınırlama olmadan düzenlemek için iyidir. Dinamik bir tampon kullanır, böylece 1024 gibi statik sınırlamalar olmaz.

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

Bir değişkeni eklemek için ön ek olarak bir% seçimi, diğer toplu yerel değişkenlerle birlikte kullanıldığında bazen sözdizimini zorlaştırdığı için daha iyi olabilirdi ...


> SetEnv aracı PATH ve diğer ortam değişkenlerini sınırlama olmadan düzenlemek için iyidir . Aslında, bu sayfada Darka ile kişisel olarak, SetEnv'i daha iyi hale getirmek için çalıştım, böylece ham yolun uzunluğunu azaltmaya yardımcı olan genişleyen / alt değişkenleri (Dinamik Değişken Genişleme bölümü) tam olarak destekleyebiliyordu .
Synetech

4

Yol manipülasyonu için setx'ten çok daha üstün bir araç pathed.exe'dir . Ne yazık ki, yolu düzenlemekle sınırlıdır.

Setx'ten daha üstün bir kullanıcı deneyimine ek olarak, 1024 karakter sınırınız yoktur. Doğrudan kayıt defteri manipülasyonundan farklı olarak, bu uygulama yayınlanacak Environment.SetEnvironmentVariable () API çağrısını kullanır WM_SETTINGCHANGE.


2
Superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7 adresindeki diğer araçların bir listesi (pathed.exe dahil) vardır
Ehtesh Choudhury


2

En sevdiğim yol, 8.3 adını kullanmak üzere PATH değişkenlerindeki klasör adlarını değiştirmektir. Bu StackOverflow cevabı , tüm PATH değişkeninin "küçültülmüş" versiyonunu oluşturacak, sonra da Değişkenleri Düzenle diyaloglarına / kutularına yapıştırabileceğiniz harika bir betiğe (.bat dosyasından çalıştırın) sahiptir. Sadece uyarı, SİSTEM ve KULLANICI parçalarını ayırmanız gerektiğidir. Komut dosyası ilerledikçe ve her klasör için küçültülmüş sürümü bulduğunda, sizi geçersiz / var olmayan yollardan atar ve uyarır. Güzel küçük temizlik bonusu.


Kullandıysan dikkatli ol fsutil.exe behavior set disable8dot3 1.
Andrew Morton,

@AndrewMorton iyi bir nokta ancak betiğin 8.3 adını "üretmemesi" nedeniyle "ele alınmaz", sadece dosya sisteminin atandığı 8.3 adını mı bildiriyor? Bu nedenle, bir klasörde 8.3 adı yoksa, komut dosyası bir ikame önermez. Ancak, fsutil 8dot3name stripkomut dosyasını kullanarak SONRASI kullanmak, etkilenen klasörler için kesinlikle sorunlara neden olur.
Andrew Steitz

Ne yazık ki kontrol etmek için boş bir sürücü veya sistemim yok. Bununla birlikte, fsutil 8dot3name stripbugün biraz daha erken kullanmış ve (a) önce kayıt defterini kontrol ettiğini ve (b) yol kayıt defterinde saklandığını göz önüne alarak, (endişe /f) seçeneğini kullanmadıkça, daha önceki kaygılarım geçersiz olabilir. .
Andrew Morton,

2

Bu satırı BAT'inize ekleyebilirsiniz:

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

Çifte bakın %%.

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


Bağlantı koptu
Ivan

1
UYARI! Bu muhtemelen bir şeyleri kıracak %path%;c:\...[snip]...\7z, kullanıcı pathdeğişkenine yazıp orada sahip olduğunuz herhangi bir şeyi bırakacaktır .
Eugene Petrov

Programlar tarafından kullanılan PATH ortam değişkeni, makine ve yerel PATH değişkenlerinin bir birleşimidir. Mevcut veriyi yerel yoldan yok etmenin yanı sıra, bunun bir şey yaptığını sanmıyorum. Having %path%yerel yol ortam değişkeninde hiçbir etkisi olmamalıdır.
Annan

0

sistem PATH ve kullanıcı PATH’i ayrı tutmanız gerekmiyorsa:

::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
Burada ne önerdiğini biraz daha anlatabilir misin?
G-Man

Setx 1024 karakter sınırını geçici olarak çözmek için komutu kullanmaya hazırdır. Örnek doğrudan PATH değişkeninde gösterilmektedir. Önceki cevaplar faydalı olmasına rağmen, son bir çözüme sahip değiller.
hayali

0

Bence en iyi yol, bir sonraki adımdır (powershell ile) Bu sayede, 1024 karakterlik küçük harflerden de kaçınırsınız.

Kodu görebilirsiniz: 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.