在 Windows 中,我希望有一个可以运行的 cmd 脚本来设置环境变量。脚本执行后仍应设置变量。变量是一种标记,大于 1024 个字符。
set 命令的作用域为当前脚本,并获取其自身所有环境变量的副本。因此,脚本完成后,全局变量不会设置。
我已尝试 setx,但是这会截断为 1024 个字符,并且似乎没有办法解决这个问题 - 我的令牌超过 1024 个字符。
这不是我要设置的 PATH 变量。我见过许多直接更新 Windows 注册表的帖子 - 但它们似乎都明确引用了 PATH 变量和该特定变量的注册表项。我需要一个适用于我机器上所有自定义变量的通用解决方案。我的变量是用于访问代码存储库的,我试图自动设置它,这样我就不必在每次构建代码时都记住这些步骤。我很难相信没有简单的选项可以在不直接编辑注册表的情况下从命令提示符中保留变量。我想如果这是唯一的选择并且它适用于所有环境变量,我会考虑将其作为最后的手段。更新注册表也不那么有利,因为我不能与其他开发人员共享这个脚本,而他们大多不是系统管理员。但我可以自私一点,只为自己解决问题,因为我是系统管理员。
在 GUI 中直接设置的 Windows 变量长度可以超过 1024 个字符。下图是 2000 个字符的变量。
答案1
微软的文档说,Windows 上的环境变量限制为 32,767 个字符(关联),但没有说明如何创建这么长的变量。
这里的问题是 Windows 提供的工具都有其局限性:
set 和 setx 命令将值截断为 1023 个字符。
直接在注册表中设置会
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
失败,因为 regedit 会在 2047 个字符后截断输入的字符串。
因此,您必须使用另一个工具来设置长变量。要使用的工具是 PowerShell。
PowerShell 直接调用 Windows API,因此可以接近环境变量 32,767 个字符的理论限制。
您可以运行如下一次性命令来创建长变量,或者甚至可以从文件中读取长字符串:
[Environment]::SetEnvironmentVariable("Path", $longpath, "User")
有关详细信息,请参阅 Microsoft 的 关于环境变量。
答案2
感谢大家发布选项!我最终编写了一个脚本,通过正则表达式直接更新,然后我在一个虚拟变量上调用 setx 来传播更改(如果没有它,正则表达式更新不会更新变量,直到您注销并重新登录)。如果 setx 适用于更大的值,那就太好了,但我们对微软有什么期望呢 :(