使用setx克服1024个字符的限制


67

我正在尝试使用。设置环境变量 setx 命令,如下

setx PATH“f:\ common tools \ git \ bin; f:\ common   tools \ python \ app; f:\ common tools \ python \ app \ scripts; f:\ common   工具\红宝石\ BIN; F:\ MASM32 \ BIN; F:\ Borland的\ BCC55 \ BIN;%PATH%”

但是,如果值超过1024个字符,则会出现以下错误:

警告:正在保存的数据被截断为1024个字符。

成功:保存了指定的值。

但是最后的一些路径并没有保存在变量中,我想由于错误暗示的字符限制。


有一个编辑的替代方法列表 %PATH% superuser.com/questions/297947
Ehtesh Choudhury

调查 快速环境编辑 它允许您以图形方式编辑所有环境变量(您也可以保存备份)。
ja72

2
当显然没有按要求做的时候,还有其他人为这个声称成功而烦恼吗?在离开路径到底是怎么回事时,这不会令人不安吗?
Chad Schouggins

这仍然会在Windows 10上截断吗?
cowlinator

是的,它在Windows 10上运行
Ivan

Answers:


44

您最好的选择是直接编辑注册表。

导航 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 并编辑 Path 值(然后重新启动以激活新值)。

但请注意,虽然您可以输入很长的路径,(最大环境变量长度; 2048 要么 32,768 字节取决于源),如果它太长,并非所有软件都能正确读取和处理它。


9
是的,需要重新启动。 setx 按照我的指示编辑注册表,然后广播一个 WM_SETTINGCHANGE 信息。这告诉所有顶级窗口系统设置已更改(在本例中为环境变量)。没有它,您使用它打开的资源管理器和程序将无法了解更改。您 可以 手动广播消息(我编写了一个程序来做这个,以及一个要替换的批处理文件 SETX 这使得注册表编辑后跟广播),但就像 setx 和系统属性envvar对话框,它有副作用,使重新启动更可取。
Synetech

2
哦,编辑一个env.var。如果不重启,实际上会导致问题,因为包含其他变量的任何环境变量都将停止扩展。例如,我现在只播放它 这个 是我的路径,我得到一个错误,因为路径现在“破碎”/空。在重新启动之前,所有变量都不会再次正常扩展。不幸的是,这是“正常的”。 :-|
Synetech

1
我发现了一个 小型PowerShell脚本 这将播放WM_SETTINGCHANGE消息。
Justin Dearing

6
您可以通过REG add命令使用上述注册表方法,然后使用SETX将一些其他变量设置为自身(即:SETX / M USERNAME%USERNAME%)。这将导致设置WM_SETTINGCHANGE消息,并使您能够从批处理文件设置路径。
Art

1
对于当前用户,请使用HKEY_CURRENT_USER \ Environment
Shital Shah

26

如果您使用的是Windows Vista或更高版本,则可以制作一个 symbolic link 到文件夹。例如:

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

会这样做一个链接 c:\pf 将是您的程序文件文件夹。我通过使用这个技巧削减了300个字符。

(我知道它与setx无关,但它对于在1024个字符限制上搜索过度命令的人很有用)


15

您可以使用类似于以下内容的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

2
您可以从管理员命令提示符调用此方法: @"%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-there-a-convenient-way-to-edit-path-in-windows-7上有其他工具列表(包括pathed.exe)
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 strip 使用该脚本后肯定会导致受影响的文件夹出现问题。
Andrew Steitz

不幸的是,我没有备用驱动器或系统来检查它。但是,已经使用了一些 fsutil 8dot3name strip 今天早些时候,并考虑到(a)它首先检查注册表和(b)路径存储在注册表中,我的早期关注可能是没有根据的,只要用户不使用 /f (强制)选项。
Andrew Morton

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变量上。虽然以前的答案很有帮助,但他们缺乏最终解决方案。
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.