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

Mad*_*uja 89 windows-7 environment-variables windows-server-2008-r2

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

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%"

但是,如果值超过 1024 个字符,我会收到以下错误:

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

成功:指定的值已保存。

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

Syn*_*ech 57

最好的办法是直接编辑注册表。

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

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

  • 您可以通过 REG add 命令使用上述注册表方法,然后使用 SETX 为其自身设置一些其他变量(即:SETX /M USERNAME %USERNAME%)。这将导致设置 WM_SETTINGCHANGE 消息并使您能够从批处理文件设置路径。 (12认同)
  • 是的,需要重新启动。`setx` 按照我的指示编辑注册表,然后广播一条 `WM_SETTINGCHANGE` 消息。这会告诉所有顶级窗口系统设置已更改(在本例中为环境变量)。没有它,您使用它打开的资源管理器和程序将不会知道更改。您*可以*自己手动广播消息(我编写了一个程序来做到这一点,并用一个批处理文件来替换“SETX”,该文件在广播之后进行注册表编辑),但就像“setx”和系统属性envvar对话框,它有副作用,使重新启动更可取。 (11认同)
  • 我找到了一个 [小 PowerShell 脚本](http://poshcode.org/2049),它将广播 WM_SETTINGCHANGE 消息。 (3认同)
  • 这里真的需要重启吗?setx 是怎么做的?Setx 不需要重新启动。 (2认同)
  • 哦,编辑一个 env.var。如果您不重新启动,实际上会导致问题,因为任何包含其他变量的环境变量都将停止扩展。例如,我只是广播它,现在 [this](http://i.stack.imgur.com/GUOda.png) 是我的路径,我收到一个错误,因为路径现在“已损坏”/空。在我重新启动之前,所有变量都不会再次正确扩展。不幸的是,这是“正常的”。`:-|` (2认同)
  • @EkremDıNÇEL,它[存档在 Wayback Machine 中](http://web.archive.org/web/20170516120430/http://poshcode.org/2049)。 (2认同)

Rez*_*eza 36

如果您使用的是 windows vista 或更高版本,您可以创建一个symbolic link文件夹。例如:

mklink /d C:\pf "C:\Program Files"
mklink /d C:\pf86 "C:\Program Files (x86)"
Run Code Online (Sandbox Code Playgroud)

将制作一个链接,因此c:\pf将是您的程序文件文件夹。通过使用这个技巧,我从我的路径中删除了 300 个字符。

(我知道它与 setx 无关,但它对于正在搜索克服 1024 个字符限制的人很有用)


Jus*_*ing 24

您可以使用类似于以下内容的 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('PATH', "$newPath;$oldPath",'Machine');
Run Code Online (Sandbox Code Playgroud)

Environment.SetEnvironmentVariable()API调用将播出WM_SETTINGCHANGE,所以你不需要重新启动。

  • 您可以从管理员命令提示符调用它:`@"%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');"` (4认同)

Kha*_*uez 7

这个开源的 SetEnv 命令行工具可以无限制地编辑 PATH 和其他环境变量。它使用动态缓冲区,因此没有像 1024 这样的静态限制。

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

不过,选择 % 作为前缀来附加到变量可能会更好,因为如果与其他批处理局部变量一起使用,有时会使语法变得困难......