[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
关于本次讨论的阶段性结论(个人版):
  
  1、cmd命令解释器在每一次运行时都向内存中重写一次系统变量信息(初始化系统变量),这就说明了为

什么我们无法在cmd中重设系统变量;

  2、cmd命令解释器将每产生的变量按照变量名大写字符的ansi序列机制临时写入内存中,形成一张变量表

并且在变量增加时会重写变量表,而当对已存在的变量进行读写操作时,则是按照ansi序列机制在变量表中进

行搜索比对一直到找到完全匹配的变量,那么当变量表中存在大量变量时,我们读写表前部的变量显然要比表

后部的变量要快,而出于效率上的考虑,我们在编写代码时应该尽量避免出现对大量的变量,同时尽量重复使

用同一变量名,万一要出现大量的变量,应使用setlocal-endlocal开关及时清空这些变量;

  3、对于setlocal-endlocal重写并复原变量的机制暂时没有搞清楚,因为在内存没有找到变量的第二个临时

储存位置。
***共同提高***

TOP

本帖最后由 hanyeguxing 于 2011-4-25 11:34 编辑

对于:setlocal-endlocal
每运行一次setlocal将当前位置(本地环境变量位置,也就是命令解释器PSP中2C、2D字节所标记的环境段地址)的环境变量复制到临时位置,并将新变量继续写到当前位置,变量就是这么继承的...
运行endlocal运行时就清除当前位置所有变量,并将对应临时位置的变量复制回来。
这样,无论set还是其他命令(setlocal-endlocal除外),读写的都是本地环境变量位置里的变量
.............................................以上个人观点,哪天有人发现错了,记得不要拍砖。。。
测试:
  1. @echo off
  2. for /l %%a in (0,1,4) do set #%%a=%%a
  3. setlocal enableDelayedExpansion
  4. for /l %%a in (5,1,9) do set #%%a=%%a
  5. set #
  6. pause
  7. endlocal
复制代码


注意,内存分析时,批处理停在 pause 这条命令上,即没有执行 endlocal 呢......
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

105# hanyeguxing
内存中的地址呢?怎么找不到?
***共同提高***

TOP

本帖最后由 hanyeguxing 于 2011-4-25 11:46 编辑

debug时,只能很容易看到当前环境变量,因为临时的那些位置并不记录在PSP中(所有命令只读写当前环境变量)。。。我们可以换个内存数据工具软件来看嘛
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

各位都是高手,我都看不懂,你们也写个高效率的系统吧,让我们都开心开心

TOP

77# zm900612


从当年MS-DOS开始,这里就标记环境变量的段地址值,到windows下都没变过。。。
hanyeguxing 发表于 2011-4-23 09:32


看来还是从DOS过来的厉害啊

不是庐山真面目,只缘身在此山中

TOP

返回列表