Windows 7 中的奇怪 PATH 问题 - 设置后变为空

Jas*_*nXA 2 windows-7 path command-line environment-variables

我的 PATH 系统变量存在某种问题。由于我使用了很多 cmd 应用程序和脚本,因此我在其中添加了很多内容。但字符串的长度不是问题。我已经解决了这个限制。

高级系统属性是我注意到的唯一一个在编辑后正确初始化 PATH 变量的应用程序。如果我手动编辑注册表,应用程序不会使用 PATH 的更新版本。所以我必须使用它或保持登录和关闭。

但是,最近,在该应用程序中设置了 PATH 的某些值后,它总是以 (null) 结束,即使它是相同的字符串。一旦我按确定,它就会变黑。注册表项仍然存在。我必须注销或重新启动 PATH 才能填充其注册表项中的任何内容。

我什至将它修剪到 %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem 仍然,PATH=(null) 和 %windir% 已经死了。

别管它,它有效。

编辑它,没有。直到我重新启动。

那么,有什么想法吗?...关于为什么高级系统属性在更新系统变量时会出现这种情况。我相信这是问题所在,因为它是一个初始化应用程序,并且在干净重启后一切正常。

Jas*_*nXA 6

经过一些尝试,我设法在使用命令行工具和 PATH 时提出了一些基本的环境变量规则。

第一。A) 长度任何变量不应超过 2047。如果有超过2047的变量,后面的变量不展开,不显示,Path变为空,PATH=(null)。

它不太可能到达这里,但碰巧的是,我处于这种情况,这是主要问题,但是,此限制很棘手,因为它仅在编辑器中编辑环境变量后才生效(高级系统设置/SystemPropertiesAdvanced 。可执行程序)。如果启动后变量不进行编辑,则不会有任何负面影响,但是,如果在单独的进程中执行子资源管理器进行浏览,则从这些资源管理器窗口打开的命令控制台将受到影响。

第一。B) 哪个长度? 没关系。如果在命令控制台中使用变量,则无论是扩展还是声明,它都被限制为 2047 个字符的值。

声明

ex:
x = %variable001%;%variable002%;%variable003%;...;%variable146%;%variable147%

Won't work.
Up to 146, it will because x won't be longer than 2047.
But 147 will kill it. Length of %variable???%; x 147 = 2058.
Run Code Online (Sandbox Code Playgroud)

扩展

ex:
x001 = C:\Program Files
x002 = C:\Program Files
x003 = C:\Program Files
...
x120 = C:\Program Files
x121 = C:\Program Files

z = %x001%;%x002%;%x003%;...;%x120%;%x121%;

Will work but will show only up to x120 and part of x121.
Length of C:\Program Files; x 120 = 2040 + C:\Prog of x121
Run Code Online (Sandbox Code Playgroud)

第二。地方可扩展变量不会递归扩展。在注册表中,它们的类型为 REG_EXPAND_SZ,在环境变量编辑器中,如果输入 % 字符,它们将被设置。如果声明了此类变量,则需要这样做,以便在 PATH 之前对其进行初始化。正常变量没有这个问题。它们可以在 PATH 之后声明并且它们的值仍然会显示。

ex:
a = C:\Windows
b (exp) = %SystemRoot%
c (exp) = %a%;%b%;%x%;%y%
x = C:\Windows
y (exp) = %SystemRoot%
z (exp) = %a%;%b%;%x%;%y%

echo %c% will output C:\Windows;C:\Windows;C:\Windows;%y%
                          a          b          x      y
echo %y% will output C:\Windows
echo %z% will output C:\Windows;C:\Windows;C:\Windows;C:\Windows
                          a          b          x          y
Run Code Online (Sandbox Code Playgroud)

变量 y 没有在 c 内部扩展,因为它是在 c 之后声明的,但是在 c 的克隆 z 中扩展了。

因此,为了让 PATH 保持活跃,在它之前必须没有冗长的变量,并且它可以包含可扩展变量,只要它们在 Path 之前按字母顺序(从 a 到 o)声明。同时保持最终值长度低于 2048。