找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: qzwqzw

[系统相关] [讨论]环境变量的存储(2011-05-18更新)

[复制链接]
发表于 2011-5-6 12:03:13 | 显示全部楼层
30# ▄︻┻═┳一


重启explorer之后,还需要重启cmd
发表于 2011-5-6 12:37:15 | 显示全部楼层
31# Batcher


这个我当然知道,重启exploer后再重启cmd.exe N*N 也 不会读取环境变量。

至少得注销一次系统才可以“刷新”系统环境变量。
 楼主| 发表于 2011-5-6 17:00:50 | 显示全部楼层
32# ▄︻┻═┳一
我得承认关于explorer.exe环境空间的部分内容
写得是过于随意了些
虽然改过一次
仍然不是很满意

“只是需要重新启动explorer.exe才能刷新到它的环境空间中”
这句话未将问题的本质描述清楚
应用程序的环境空间有继承特性
这句话同样适用于explorer.exe以及其他应用程序
在你使用“任务管理器”结束exploer.exe时
应该知道“任务管理器”的进程位于进程树
System->smss.exe->winlogon.exe->taskmgr.exe
而修改注册表中的环境变量不会对这些进程的环境空间产生影响
那么使用taskmgr.exe启动的explorer.exe自然不会继承到新变量

而注销后重新登录或者系统重启
是由userinit.exe启动的explorer.exe
而userinit.exe的主要作用就是读取计算机和用户配置
包括环境变量
那自然会从注册表中抓取到新的变量
再被它的子进程explorer.exe所继承

我原文中的重启explorer.exe
是在这样的测试条件下成功的
打开cmd.exe
set _newvar=value设置一个新变量
taskkill /im:explorer.exe /f杀掉当前的explorer.exe进程
start explorer.exe启动一个心得explorer.exe进程
这个新进程作为cmd.exe的子进程
自然会继承cmd的环境空间
其中就包括新定义的变量_newvar

不知道这样说你是否清楚了?

评分

参与人数 1技术 +1 收起 理由
zm900612 + 1 绝妙的发现!

查看全部评分

 楼主| 发表于 2011-5-6 17:12:42 | 显示全部楼层
本帖最后由 qzwqzw 于 2011-5-6 17:17 编辑

05-06修订
  • 增加Windows环境变量的注册表存储位置
  • 修改explorer.exe下修改环境变量的说明
发表于 2011-5-6 17:25:36 | 显示全部楼层
33# qzwqzw


将explorer作为cmd的子进程,这个方法我咋没想到呢...
发表于 2011-5-6 17:27:02 | 显示全部楼层
System->smss.exe->winlogon.exe->taskmgr.exe
这条见解很独到,非常深刻,学习了!
发表于 2011-5-6 19:25:13 | 显示全部楼层
33# qzwqzw

谢谢,你很认真。

我只是喜欢严谨
发表于 2011-5-6 20:12:05 | 显示全部楼层
32# ▄︻┻═┳一


往注册表里面写一个环境变量,重启explorer和cmd,新的cmd里面无法识别这个环境变量?你的测试环境是?
发表于 2011-5-6 22:19:26 | 显示全部楼层
38# Batcher

我是用xp sp3 如下测试的:

注册表添加 环境变量 test:
cmd中 执行 “reg add HKCU\Environment\ /v test /d 1234567890”

然后任务管理器结束掉explorer.exe,cmd.exe

关掉任务管理器

ctrl+alt+delete 打开任务管理器, 文件》新建任务(运行),输入explorer,

再在运行中输入cmd

在cmd中输入set test
  1. 显示“环境变量 test 没有定义”
复制代码
发表于 2011-5-16 21:00:33 | 显示全部楼层
1# qzwqzw


很好。。。
发表于 2011-5-16 22:28:57 | 显示全部楼层
没看明白~~~
修改注册表设置我采用.inf文件,执行用
  1. rundll32 setupapi,InstallHinfSection DefaultInstall 132 .\*.inf
复制代码
结束用资源管理器用
  1. taskkill.exe /im explorer.exe /f
复制代码
刷新用
  1. gpupdate /force
复制代码
  1. RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
复制代码
重新新启动资源管理器
  1. start explorer.exe
复制代码
注册表修改生效 (xpsp2 xpsp3 2003通过)

评分

参与人数 1技术 +1 收起 理由
zm900612 + 1 很全面,学习了

查看全部评分

发表于 2011-5-17 01:51:58 | 显示全部楼层
39# ▄︻┻═┳一


不试试41楼的方法?
发表于 2011-5-17 02:21:30 | 显示全部楼层
此文对cmd 环境变量分析总结的比较透彻,谢谢LZ

顺便问下 set,这个是怎么发现的呢? 以前从来没见过


hanyeguxing 斑竹
对NT内核了如指掌啊,佩服
 楼主| 发表于 2011-5-17 21:07:40 | 显示全部楼层
41# temp
测试了一下
因为没有现成的inf文件
直接regedit修改HKEY_CURRENT_USER\Environment下的已有变量
然后杀进程、刷新、启进程
结果无效!

另外印象中有直接刷新当前Explorer.exe环境空间的命令行
似乎也是用的rundll32
可惜找不到了
发表于 2011-5-17 22:32:45 | 显示全部楼层
本帖最后由 caruko 于 2011-5-17 22:34 编辑

一般来说,子进程都会继承父进程的环境变量。
start /I 命令也可以放弃继承,使用新环境,也就是初始环境。

有一次使用bat来做open vpn密码验证程序,发现OPENVPN的登陆密码和用户名是以环境变量的形式存在的,这样方便调用外部程序传递一些数据。
当时还担心过它的安全,后来查了一些资料才了解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:59 , Processed in 0.020747 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表