|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『楼 主』:
[讨论]使用脚本设置全局环境变量
使用脚本设置全局环境变量
最近发现有不少人在讨论使用脚本如何设置系统全局长期有效的环境变量的问题,正巧最近也用到了这方面的内容,所以将大家的讨论内容做了一些收集整理,遂成此文。
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 ]
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2007-4-2 05:49 |
|
|
ccwan
金牌会员
积分 2725
发帖 1160
注册 2006-9-23 来自 河北廊坊
状态 离线
|
『第
2 楼』:
沙发!
wil兄终于又发技术贴啦。呵呵
|
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。 |
|
2007-4-2 06:07 |
|
|
huzixuan
高级用户
积分 537
发帖 219
注册 2006-10-31 来自 芜湖
状态 离线
|
『第
3 楼』:
"全局环境变量" 难道就是 一个变量在哪个 CMD 窗口 都可以使用???
|
江湖远
碧空长
路茫茫
一个人漫无目的的奔跑,风,刺骨的冷.... |
|
2007-4-2 06:28 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
|
2007-4-2 08:49 |
|
|
bjsh
银牌会员
积分 2000
发帖 621
注册 2007-1-1
状态 离线
|
『第
5 楼』:
先仰慕一下willsort再看贴子
|
|
2007-4-2 09:03 |
|
|
bjsh
银牌会员
积分 2000
发帖 621
注册 2007-1-1
状态 离线
|
『第
6 楼』:
我xp sp2 c:\autoexec.bat 内容是空的;
似乎wmic用来设置全局变量方便些;
因为这阵子刚好看这个
|
|
2007-4-2 09:08 |
|
|
estar
中级用户
积分 346
发帖 103
注册 2004-4-6
状态 离线
|
『第
7 楼』:
Willsort的帖子,来晚了,瞻仰~~
|
|
2007-4-2 12:04 |
|
|
20080610
初级用户
积分 83
发帖 34
注册 2006-11-24
状态 离线
|
|
2007-4-2 12:32 |
|
|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
|
2007-4-3 02:45 |
|
|
namejm
荣誉版主
batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
『第
10 楼』:
飞刀,又见飞刀!willsort归隐多日,此番重出江湖,又给大家带来不少惊喜。先顶再说。
|
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。 |
|
2007-4-9 00:31 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
11 楼』:
我也来顶一下。
不过我的XP sp2的Autoexec.bat无法运行,ParseAutoexec的REG_SZ的值也是1,不知道为什么执行不了Autoexec.bat,我的Autoexec.bat里面是有内容的。
|
|
2007-4-9 03:25 |
|
|
popfrog
初级用户
积分 20
发帖 7
注册 2008-1-22
状态 离线
|
『第
12 楼』:
set sysenv=CreateObject("WScript.Shell").Environment("system") '系统环境变量的数组对象
sysenv.Remove("ztest2") '删除变量
sysenv("ztest3")="test value" '添加变量
这个借用了。多谢
|
|
2008-1-25 12:31 |
|