C:\>set NEWVAR
Environment variable NEWVAR not defined
C:\>python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system('setx NEWVAR newvalue')
0
>>> os.getenv('NEWVAR')
>>> ^Z
C:\>set NEWVAR
Environment variable NEWVAR not defined
user PATH == u
machine PATH == m
%PATH% == m;u
> setx PATH %PATH%;new
Calling setx sets the USER path by default, hence now:
user PATH == m;u;new
machine PATH == m
%PATH% == m;m;u;new
我试图通过一个程序来改变当前DOS会话的环境,这一定是一千年前的事了。问题是:该程序在自己的DOS shell中运行,因此必须在其父环境中操作。从DOS信息块开始,沿着内存控制块链走一走,就可以找到父环境的位置。一旦我发现了如何做到这一点,我操纵环境变量的需求就消失了。我会给你下面的Turbo-Pascal代码,但我想至少有三种更好的方法可以做到这一点:
创建一个批处理文件,该批处理文件:(a)调用一个Python脚本(或其他脚本),该脚本生成一个包含适当SET命令的temporay批处理文件;(b)调用临时批处理文件(SET命令在当前shell中执行);并且(c)删除临时批处理文件。
创建一个Python脚本,将“VAR1=val1\nVAR2=val2\nVAR3=val3\n”写入STDOUT。在批处理文件中这样使用:
for /f "delims=|" %%X in ('
称为pythonscript') do set %%X
et voil a:变量VAR1、VAR2和VAR3被赋予了一个值。
修改Windows注册表,并按照Alexander Prokofyev的描述here广播设置更改。
下面是一个只报告内存位置的程序的Pascal代码(您可能需要一本荷兰语词典和一本Pascal编程书)。它似乎仍然可以在Windows XP下工作,不管它报告我们运行的是DOS 5.00。这只是第一个开始,有很多低级编程要做,以便操作选定的环境。由于指针结构看起来可能是正确的,我不确定1994年的环境模型现在是否仍然适用。。。
(在ASCII 127之上,本演示文稿中可能存在一些ASCII/ANSI转换问题。)
使用外部Windows
setx
命令可能同样简单:现在打开一个新的命令提示符:
如您所见,
setx
既不为当前会话设置变量,也不为父进程(第一个命令提示符)设置变量。但它确实在注册表中为将来的进程持久地设置了变量。我认为根本没有办法改变父进程的环境(如果有,我很乐意听到)。
使用setx有一些缺点,特别是当您试图附加到环境变量(例如setx PATH%PATH%;C:\ mypath)时,这将在每次运行时重复附加到路径,这可能是一个问题。更糟糕的是,它无法区分机器路径(存储在HKEY_LOCAL_machine中)和用户路径(存储在HKEY_CURRENT_user中)。在命令提示下看到的环境变量由这两个值的串联组成。因此,在调用setx之前:
每次调用setx追加到path时,%path%环境变量中的系统路径不可避免地重复。这些更改是永久性的,不会通过重新启动来重置,因此会在机器的整个生命周期中累积。
我无法在DOS中弥补这一点。所以我转向了Python。我今天提出的解决方案是,通过调整注册表来设置环境变量,包括在不引入重复项的情况下附加到PATH,如下所示:
它不会影响当前进程或父shell,但会影响运行后打开的所有cmd窗口,而无需重新启动,并且可以安全地多次编辑和重新运行,而不会引入任何重复项。
相关问题 更多 >
编程相关推荐