Board logo

标题: [讨论]使用脚本设置全局环境变量 [打印本页]

作者: willsort     时间: 2007-4-2 05:49    标题: [讨论]使用脚本设置全局环境变量

使用脚本设置全局环境变量

      最近发现有不少人在讨论使用脚本如何设置系统全局长期有效的环境变量的问题,正巧最近也用到了这方面的内容,所以将大家的讨论内容做了一些收集整理,遂成此文。

1、内部工具:regedit /s、echo >> & regedit /s、reg add
2、外部工具:setx、setntenvar、winset
3、其他脚本:vbs
4、自动批处理:autoexec.bat、autoexec.nt

===============================================

1、内部工具:regedit /s、echo >> & regedit /s、reg add

1.1 regedit /s - Windows自带工具

优点:在所有Windows系统下均可使用,可同时操作其他注册表项
缺点:不可动态定义变量,需要重启才能生效,需读取额外的注册表文件

:: dsc.reg 已经存在并可用
REGEDIT /S DSC.REG

1.2 echo >> & regedit /s - Windows自带命令和工具

优点:可动态定义变量,在所有Windows系统下均可使用,可同时操作其他注册表项
缺点:需要重启才能生效,需读写额外的注册表文件

:: dsc.reg 已经存在并可用,修改环境变量Driver为cd变量转化值
ECHO "Driver"="%cd:\=\\%\\sqora32.dll">>DSC.REG
REGEDIT /S DSC.REG

1.3 reg add - Windows 2K/XP/03自带工具

优点:可动态定义变量
缺点:需要重启才能生效,缺省不能在9X下使用

SET ENV_POOL=HKLM\SYSTEM\ControlSet001\Control\Session Manager\Environment
REG ADD "%ENV_POOL%" /V PATH /T REG_SZ /D "%cd%;%Path%" /F >nul

2、外部工具:setx、setntenvar、winset

2.1 setx - 来自 2K/XP/03 安装光盘的支持工具包

Version 1.0a (5/31/96)
Gary Milne - Microsoft MCS

优点:可动态定义变量,不需重启立即生效,可动态引用变量,可引用文本内容设置变量
缺点:只能在NTs下使用,不能删除变量而只能置为空值

:: 设置当前用户全局变量
SETX MACHINE COMPAQ
:: 设置系统全局变量
SETX MACHINE "COMPAQ COMPUTER" -m
:: 静态引用其他环境变量(仅引用一次当前会话环境变量)
SETX MYPATH %PATH%
:: 动态引用其他环境变量(总是引用全局环境变量)
SETX MYPATH ~PATH~
:: 使用注册表值设置环境变量
SETX BUILD -k "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber"
:: 使用文件中指定内容设置环境变量(不会立即生效)
SETX IPGATEWAY -f ipconfig.out -r 0,7 "Gateway"

2.2 setntenvar - 来自无忧启动论坛(topic=4197) Lx1638(老九)

SetNTEnVar V06.04

优点:可动态定义变量,可定义光驱盘符为环境变量,不需重启立即生效
缺点:只能在NTs下使用

:: 修改变量
SETNTENVAR PATH=%PATH_BAK%
:: 删除变量
SETNTENVAR BAK_PATH=
:: 定义光驱盘符为环境变量CDROM\CDROM0\CDROM1等
SETNTENVAR /FindCDROM

2.3 winset - 来自9x安装盘支持工具包

优点:可动态定义变量,不需重启立即生效
缺点:只能在9X下使用,在NTs下运行出错

:: 修改变量
WINSET PATH=%PATH_BAK%
:: 删除变量
WINSET BAK_PATH=

3、其他脚本:vbs

3.1 vbs - 来自中国DOS联盟论坛(tid=27952) electronixtar

set sysenv=CreateObject("WScript.Shell").Environment("system") '系统环境变量的数组对象
sysenv.Remove("ztest2")                        '删除变量
sysenv("ztest3")="test value"                '添加变量

优点:可动态定义变量,不需重启立即生效
缺点:需要修改系统配置文件,仅对使用command创建的命令行有效

4、自动批处理:autoexec.bat、autoexec.nt

4.1 autoexec.bat - 来自系统盘根目录

优点:可动态定义变量,可在DOS/Windows全系列系统下使用
缺点:需要重启才能生效,需要修改系统文件

echo set path=d:\batch;%path%>> c:\autoexec.bat

在2K/XP/03中是否解析autoexec.bat中的变量与以下注册表项相关

User Key: [HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon]
Value Name: ParseAutoexec
Data Type: REG_SZ (String Value)
Value Data: (0 = disabled, 1 = enabled)

4.2 autoexec.nt - 来自2K/XP/03系统的%SystemRoot%\system32

优点:可动态定义变量,不需重启立即生效
缺点:需要修改系统文件,仅对2K/XP/03中使用autoexec.nt文件的命令行有效

echo set path=d:\batch;%path%>> %SystemRoot%\System32\autoexec.nt

===============================================

      总体而言,系统环境变量在NT系列的注册表下有两个地方:

1、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
代表系统环境变量空间的注册表项

2、HKEY_CURRENT_USER\Environment
代表当前用户环境变量空间的注册表项

      这两个键支下的注册表值分别表示相应的环境变量,直接修改系统空间的变量需要重启才会再全局生效,在用户空间修改的只要注销就可以了。

      另外需要注意的是,使用以上方法设置的系统变量,都是无法在批处理或命令行运行的当前会话(窗口)中生效的,所以如果在设置变量后即刻去查询,是不会发生变化的。

      解决这个问题的最简单办法是设置系统级变量的同时,使用set设置会话级变量为相同的内容。另外,也可以使用reg query或regedit /e或者setx -k查询相应的注册表值。

===============================================

关于autoexec.nt文件的问题

      配置文件是否生效与文件名无关,只有且只要它能被命令行程序正确引用时才生效。

      引用配置文件的方法,新建快捷方式,在项目中填写command,按确定后生成程序信息文件(.pif)"MS-DOS 方式",在“属性->程序->高级”中定义初始化文件

      但是因为command.com总是使用%SystemRoot%\_default.pif作为程序信息文件,而_default.pif定义了auotexec.nt和config.nt作为初始化配置文件,所以使用command.com打开命令行,总是能成功引用autoexec.nt中设置的环境变量。

============================

相关链接

1、[环境变量] WinXP SP2支持工具包里提取的setx.exe
http://www.cn-dos.net/forum/viewthread.php?tid=28698

2、[原]setx.vbs重启依然有效的系统环境变量
http://www.cn-dos.net/forum/viewthread.php?tid=27952

3、怎么写一个自动完成系统环境变量添加的脚本
http://www.cn-dos.net/forum/viewthread.php?tid=24114

4、如何用批处理修改系统path环境变量
http://www.cn-dos.net/forum/viewthread.php?tid=25057

5、怎么用批处理设置XP系统的环境变量
http://www.cn-dos.net/forum/viewthread.php?tid=23409

6、[讨论]MSDOS7.10启动过程中各因素的相互影响
http://www.cn-dos.net/forum/viewthread.php?tid=17107

16:56 2007-3-24
14:42 2007-4-1

[ Last edited by willsort on 2007-4-2 at 06:04 AM ]
作者: ccwan     时间: 2007-4-2 06:07
沙发!
wil兄终于又发技术贴啦。呵呵
作者: huzixuan     时间: 2007-4-2 06:28
"全局环境变量" 难道就是 一个变量在哪个 CMD 窗口 都可以使用???
作者: everest79     时间: 2007-4-2 08:49
大胡子,我也写过一个
http://www.cn-dos.net/forum/view ... hlight=%2Beverest79
作者: bjsh     时间: 2007-4-2 09:03
先仰慕一下willsort再看贴子
作者: bjsh     时间: 2007-4-2 09:08
我xp sp2 c:\autoexec.bat 内容是空的;

似乎wmic用来设置全局变量方便些;

因为这阵子刚好看这个
作者: estar     时间: 2007-4-2 12:04
Willsort的帖子,来晚了,瞻仰~~
作者: 20080610     时间: 2007-4-2 12:32
版主一出手就是实用的东西..
作者: vkill     时间: 2007-4-3 02:45
wmic算不算?
作者: namejm     时间: 2007-4-9 00:31
  飞刀,又见飞刀!willsort归隐多日,此番重出江湖,又给大家带来不少惊喜。先顶再说。
作者: lxmxn     时间: 2007-4-9 03:25

我也来顶一下。

不过我的XP sp2的Autoexec.bat无法运行,ParseAutoexec的REG_SZ的值也是1,不知道为什么执行不了Autoexec.bat,我的Autoexec.bat里面是有内容的。

作者: popfrog     时间: 2008-1-25 12:31
set sysenv=CreateObject("WScript.Shell").Environment("system") '系统环境变量的数组对象
sysenv.Remove("ztest2")                        '删除变量
sysenv("ztest3")="test value"                '添加变量

这个借用了。多谢