中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-13 20:37
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]使用脚本设置全局环境变量
楼 主 [讨论]使用脚本设置全局环境变量 发表于 2007-04-02 05:49 ·  中国 山西 运城 联通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
使用脚本设置全局环境变量

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

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:
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:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2 发表于 2007-04-02 06:07 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
沙发!
wil兄终于又发技术贴啦。呵呵
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
3 发表于 2007-04-02 06:28 ·  中国 安徽 芜湖 电信
高级用户
★★
积分 537
发帖 219
注册 2006-10-31 21:08
UID 69036
性别 男
来自 芜湖
状态 离线
"全局环境变量" 难道就是 一个变量在哪个 CMD 窗口 都可以使用???
江湖远
碧空长
路茫茫

一个人漫无目的的奔跑,风,刺骨的冷....
4 发表于 2007-04-02 08:49 ·  中国 广东 广州 黄埔区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
5 发表于 2007-04-02 09:03 ·  中国 浙江 杭州 华数宽带
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
UID 75212
性别 男
状态 离线
先仰慕一下willsort再看贴子
6 发表于 2007-04-02 09:08 ·  中国 浙江 杭州 华数宽带
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
UID 75212
性别 男
状态 离线
我xp sp2 c:\autoexec.bat 内容是空的;

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

因为这阵子刚好看这个
7 发表于 2007-04-02 12:04 ·  中国 四川 成都 教育网
中级用户
★★
积分 346
发帖 103
注册 2004-04-06 00:00
UID 21852
性别 男
状态 离线
Willsort的帖子,来晚了,瞻仰~~
8 发表于 2007-04-02 12:32 ·  中国 北京 朝阳区 联通
初级用户
积分 83
发帖 34
注册 2006-11-24 10:50
UID 71574
性别 男
状态 离线
版主一出手就是实用的东西..
9 发表于 2007-04-03 02:45 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
wmic算不算?
10 发表于 2007-04-09 00:31 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  飞刀,又见飞刀!willsort归隐多日,此番重出江湖,又给大家带来不少惊喜。先顶再说。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
11 发表于 2007-04-09 03:25 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

我也来顶一下。

不过我的XP sp2的Autoexec.bat无法运行,ParseAutoexec的REG_SZ的值也是1,不知道为什么执行不了Autoexec.bat,我的Autoexec.bat里面是有内容的。
12 发表于 2008-01-25 12:31 ·  中国 信天游
初级用户
积分 20
发帖 7
注册 2008-01-22 19:44
UID 109289
性别 男
状态 离线
set sysenv=CreateObject("WScript.Shell").Environment("system") '系统环境变量的数组对象
sysenv.Remove("ztest2") '删除变量
sysenv("ztest3")="test value" '添加变量

这个借用了。多谢
论坛跳转: