from http://lizzme.spaces.live.com/blog/cns!93082F2AED057BFF!232.entry
目的: 修改或添加系统path环境变量,如果环境变量中有c:/123,则删除之,如果没有%System32%/qqq则添加该路径.
我在批处理中用regedit /e 或 reg export 导出注册表的HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Session Manager/Environment 项,但导出的path是下列方式的16进制数,且有多行:
"ComSpec"=hex(2):25......
"Path"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,/
00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,3b,00,25,00,/
53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,3b,00,25,/ .........
"FP_NO_HOST_CHECK"="NO"
"OS"="Windows_NT"
"PROCESSOR_ARCHITECTURE"="x86"
........
请教高手:
1.对导出的注册表项如何只保留其中的path项(多行完整保留)
2.如何修改已有路径和添加新的路径
说明:在cmd中用set path方式得到的路径都绝对路径,而不是注册表中的相对路径.我希望得到相对路径,而且绝对路径好象无法导入注册表中更改path值
回复1:
path=%path%;D:/My_Path
dos下运行 set path==%path%;D:/My_Path
然后运行set path可以查看设置后的值。
缺点:运行完批处理后看看系统的path环境变量,添加的路径保存不了,只是在批处理里有效而已。
回复2:
添加系统环境变量:
环境变量值需要手工输入,导入注册表的,应该是永久的。不知道系统环境变量可容纳的字符是多少,如果容纳的比较小,可能导入不成功,呵呵,我也不知道。
@echo off&setlocal enabledelayedexpansion
:begin
cls
set/p path_=请输入你要添加的环境变量的路径:
if not defined path_ goto error
for,/f,"skip=4 tokens=1,2,*",%%a,in,('reg query "HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Session Manager/Environment" /v Path'),do,(
echo 当前的环境变量为:
echo %%c
echo;
set/p yesno=是否确认将"%path_%"添加到系统环境变量中去?[Y]/[N]
if /i "!yesno!"=="y" (
reg add "HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Session Manager/Environment" /v Path /t REG_EXPAND_SZ /d "%%c;%path_%" /f
)
goto :eof
)
pause
goto :Eof
:error
echo 输入错误,请重新输入
pause
goto begin
回复3:
Windows Server 2003 自带一个修改用户、系统环境变量并永久生效的工具: SETX.EXE
注:setx,在XP下可以运行。
这个工具已经强大到你可以指定存在于一个文本文件内的(x,y)座标来直接取文本值并设置到环境变量内,并永久生效。
(备注: 下面 SETX 工具的使用说明
下面是这个 SETX.EXE Windows Server 2003自带的环境变量操纵工具的中文使用技巧~:)SetX 有三种使用方式:
语法 1:
SETX [/S system [/U [domain/]user [/P [password]]]] var value [/M]
语法 2:
SETX [/S system [/U [domain/]user [/P [password]]]] var /K regpath [/M]
语法 3:
SETX [/S system [/U [domain/]user [/P [password]]]]
/F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
描述:
在用户或系统环境创建或修改环境变量。能基于参数、注册表项或文件输
入设置变量。
参数列表:
/S system 指定要连接的远程系统。
/U [domain/]user 指定命令在其下执行的用户上下文。
/P [password] 指定给定用户上下文的密码。如果省略则提示输入。
var 指定要设置的环境变量。
value 指定分配给环境变量的值。
/K regpath 指定变量是基于注册表项的信息而设置的。
路径的格式应该是 hive/key/.../value。例如
HKEY_LOCAL_MACHINE/System/CurrentControlSet/
Control/TimeZoneInformation/StandardName。
/F file 指定要使用的文本文件的文件名。
/A x,y 指定绝对文件坐标(线 X,项目 Y)作为在此文件
里搜索的参数。
/R x,y string 指定有关“字符串”作为搜索参数的相对文件坐标。
/M 指定应该在系统 (HKEY_LOCAL_MACHINE) 环境中设
置此变量。在 HKEY_CURRENT_USER 环境下,默认
将设置此变量。
/X 用 x,y 坐标显示文件内容。
/D delimiters 指定其他限定符,如 "," 或 "/"。
内置分隔符是空格、制表符、回车和换行符。所有
ASCII 字符都可作为限定符。限定符的最大数量,
包括内置分隔符,是 15。
/? 显示帮助消息。
注意: 1) SETX 在注册表中将变量写入主机环境。
2) 在本地系统,用此工具创建或修改的变量将在以后的命令窗口可用,但
在当前的 CMD.exe 命令窗口。
3) 在远程系统,用此工具创建或修改的变量在下次登录会话可用。
4) 有效的注册表项数据类型是 REG_DWORD,REG_EXPAND_SZ,REG_SZ
和 REG_MULTI_SZ。
5) 受支持的配置单元: HKEY_LOCAL_MACHINE (HKLM),
HKEY_CURRENT_USER (HKCU)。
6) 限定符区分大小写。
7) REG_DWORD 的值是从注册表里以十进制格式提取出来的。
示例:
SETX MACHINE COMPAQ
SETX MACHINE "COMPAQ COMPUTER" /M
SETX MYPATH "%PATH%"
SETX MYPATH ~PATH~
SETX /S system /U user /P password MACHINE COMPAQ
SETX /S system /U user /P password MYPATH ^%PATH^%
SETX TZONE /K HKEY_LOCAL_MACHINE/System/CurrentControlSet/
Control/TimeZoneInformation/StandardName
SETX BUILD /K "HKEY_LOCAL_MACHINE/Software/Microsoft/Windows
NT/CurrentVersion/CurrentBuildNumber" /M
SETX /S system /U user /P password TZONE /K HKEY_LOCAL_MACHINE/
System/CurrentControlSet/Control/TimeZoneInformation/
StandardName
SETX /S system /U user /P password BUILD /K
"HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/
CurrentVersion/CurrentBuildNumber" /M
SETX /F ipconfig.out /X
SETX IPADDR /F ipconfig.out /A 5,11
SETX OCTET1 /F ipconfig.out /A 5,3 /D "#$*."
SETX IPGATEWAY /F ipconfig.out /R 0,7 Gateway
SETX /S system /U user /P password /F c:/ipconfig.out /X
这个命令行工具提供了一种批量修改环境变量的方法,同时不需要使用任何编程方法或者是脚本。此外,除了可以获得变量和值之外还可以跟注册表的值挂上关系。在2000中除了setx.exe之外,其他没有任何一种命令行工具可以直接设置系统变量值。只有通过控制面板和注册表编辑器才能够设置。如果有人说可以用set命令的话, 实际上这个CMD的内部命令只能够设置当前控制台窗口的用户环境变量。 setx允许你通过Command Line Mode,Registry Mode,File Mode,这三种模式来设置环境变量。
a. Command-Line
setx variable value -m
variable
要设置的环境变量的名字。
value
要设置的值。
-m
设置计算机环境,默认设置是用户环境。
b. Registry Mode
setx variable -k hive/key/……/value -m
variable
要设置的环境变量的名字。
-k
指定变量设置会基于注册表中的信息。
hive/key/……/value
注册表路径,如:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/TimeZoneInformation/StandardName
-m
同命令行模式。
c. File Mode
setx variable -f filename -a x,y │ -r x,y "string" -d d -x -m
-f filename
指定使用的文件名。
-a x,y
指定要搜索的绝对坐标或者是偏移量。
-r x,y "string"
指定从"string"的相对坐标或者是偏移。
-d d
指定附加的分隔符,后一个d表示,可以是",", "/"等等。系统有四个内建的分隔符是:space, tab,
carriage return, linefeed。附加的可以是任意的ASCII字符。
-x
显示文件坐标,这个时候-a, -r, -d会变忽略。
-m
在同上。 setx将变量写入到在注册表的主环境中去。用setx设置的变量将会在下一次启动的时候生效,这是2000的局限。当访问REG_MULTI_SZ时,只能访问到第一个项目。
目前setx只可以支持HKCU和HKLM两个hives。用Setx增加的值不可以用setx去掉,可以在控制面板里面改,也可以在注册表里面改,这种时候也可以用set把它置空。
但是还是来几个例子吧!
a.Command Line
Setx MACHINE COMPAQ
在用户环境中设置MICHINE为COMPAQ。
setx MYPATH %PATH%
设置MYPATH的值为当前PATH变量的值。
setx MYPATH ~PATH~
设置MYPATH总是和PATH环境的值保持一致。
b. Registry
Setx TZONE -k
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/TimeZoneInformation/StandardName
设置TZONE的值为上面的键。比如:"Central Standard Time"
Setx BUILD -k "HKEY_LOCAL_MACHINE/Software/Microsoft/Windows
NT/CurrentVersion/CurrentBuildNumber"
设置BUILD的值为当前的Windows NT版本号,如:1314。
c. File
在进行这部分之前先运行ipconfig > ipconfig.out,弄一个ipconfig的文本出来。然后就可以进行*作了
Setx var -f ipconfig.out -x
这个命令会显示这个文件的内容的坐标。如:
C:/>SETX VAR -f ipconfig.out -x
(1,0 Windows) (1,1 2000) (1,2 IP) (1,3 Configuration)
(3,0 Ethernet) (3,1 adapter) (3,2 Local) (3,3 Area) (3,4 Connection
(5,0 Connection-specific) (5,1 DNS) (5,2 Suffix) (5,3 .) (5,4
(6,0 IP) (6,1 Address.) (6,2 .) (6,3 .) (6,4 .) (6,5 .) (6,6 .) (6,7 .) (6,8 .)
(6,9 .) (6,10 .) (6,11 .) (6,12 .) (6,13 (6,14 192.168.1.1)
(7,0 Subnet) (7,1 Mask) (7,2 .) (7,3 .) (7,4 .) (7,5 .) (7,6 .) (7,7 .) (7,8 .)
(7,9 .) (7,10 .) (7,11 .) (7,12 .) (7,13 (7,14 255.255.255.0)
(8,0 Default) (8,1 Gateway) (8,2 .) (8,3 .) (8,4 .) (8,5 .) (8,6 .) (8,7 .) (8,8
.) (8,9 .) (8,10 .) (8,11
setx ipaddr -f ipconfig.out -a 5,11
这个命令会寻找绝对偏移为(5,11)的内容,然后设置ipaddr为这个值。如:
C:/>setx ipaddr -f ipconfig.out -a 6,14
Extracted value is: 192.168.1.1
Setx ipgateway -f ipconfig.out -r 0,11 "Gateway"
查找Gateway这个字符串偏移0,11的东东,然后写到ipgateway里面去。
C:/>Setx ipgateway -f ipconfig.out -r 0,11 "Gateway"
Extracted value is: 192.168.1.244
以上所有的修改都会在重起以后看到,可以用set或者是控制面板中的System properties看。