A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-7-10 22:22 编辑

设置path路径是有执行顺序的,也就是说最左边的先执行,然后依次查找。
但是set path=d:\;%path%时是如何执行的?
如果按从左往右执行,那么path已经等于D盘了,无法取到原有的path值。但是这么写却确实可以执行到。也就是说,设置和查找时顺序是不同的。
那么这个path的设置到底需不需要一定的顺序呢?
我有点绕圈子了,求点明
再明确下我的问题
set path=   是给path赋值,“新的路径;%path%”相当于在原有path值上添加新的路径,且与新路径位置无关
但是,如果按照给变量赋值的思想来考虑,比如x=5,那么此时x值已经是5了,再取x的话只能取到5.要取原值的话应该先取
但事实已经证明,path不能用这种思想思考。
所以我想问,path的set有没有什么规则

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

5 个回复

正序浏览
toShareBeauty 发表于 2013-7-10 00:39
set path=d:/;%path%如果非要拿 java 作比喻,可以等效于 s = "d:/;" + s;  其中 s 是字符串类型变量。
这 ...

这个真心太清楚了,非常感激
回复 使用道具 举报
本帖最后由 toShareBeauty 于 2013-7-10 01:28 编辑

set path=d:/;%path%如果非要拿 java 作比喻,可以等效于 s = "d:/;" + s;  其中 s 是字符串类型变量。
这是 dos  命令啊,你有木有用过 bash shell 呢,其实格式差不多啦,他们都算作是脚本语言啦。这个也和 java 差不多嘛。path 可以看做 dos 这个程序的字符串类型变量,给变量赋值用语句  set 变量名=字符串  ,使用变量的值是 %变量名% 这种格式(使用变量的值在 javascript 中还是 $变量名 这种格式呢),set path=d:/;%path% ,这条语句里面,dos 先把 %path% 的值取出来,就是 path 以前的值嘛假设是字符串"xxx",然后把 d:/; 拼接在刚刚得到的字符串前面就得到"d:/;xxx",再把“d:/;xxx”这个字符串赋值给 path 变量。如果这样写  set path=%path%;d:/;  那么 path 最后的值就是“xxx;d:/;”(我在d前面加个 ; 是怕 path 前一个值结尾不是 ; 号,那样的话,我设置的路径和前面一个路径就连一起了,到时候 dos 解析 path 这个路径的时候最后一个用不了。)

关于你说的 set 的规则,我建议你可以在命令行里面输入 help set 查看 set 这个命令的帮助,它会详细告诉你 set 这个名了有哪些用法,不过我一般不看啦,记住主要的就行嘛,那么多命令记不完啦,特别是外置命令,外置命令用 命令名 -help 格式来查看,比如 java -help ,一个应用程序就可以是一个命令,不同程序的命令的参数格式还不同,这些参数格式都是写程序的人自己定义的,所以记不完嘛,用的时候 help 一下啦。

path 变量是 dos 要使用的特殊的变量,dos 要执行某个命令的时候,先是查找内部命令,也就是 dos 自带的命令(比如刚刚的 set 就是 dos 自带的命令,除了这个 dos 还有分支语句、循环语句呢),没有的话再按照 path 里面的路径从左到右查找,最先被找到这个命令对应的可执行文件,也就是 xxx.exe 就执行这个 xxx.exe 啦,说得专业一点就是给这个应用程序创建一个子进程来执行这个程序。

下面是我用 help set 得到的结果:
  1. C:\Users\vivianZhao>help set
  2. 显示、设置或删除 cmd.exe 环境变量。

  3. SET [variable=[string]]

  4.   variable  指定环境变量名。
  5.   string    指定要指派给变量的一系列字符串。

  6. 要显示当前环境变量,键入不带参数的 SET。

  7. 如果命令扩展被启用,SET 会如下改变:

  8. 可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
  9. SET 命令已使用的名称的所有变量的值。例如:

  10.     SET P

  11. 会显示所有以字母 P 打头的变量

  12. 如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
  13. 设置成 1。

  14. SET 命令不允许变量名含有等号。

  15. 在 SET 命令中添加了两个新命令行开关:

  16.     SET /A expression
  17.     SET /P variable=[promptString]

  18. /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
  19. 评估器很简单并以递减的优先权顺序支持下列操作:

  20.     ()                  - 分组
  21.     ! ~ -               - 一元运算符
  22.     * / %               - 算数运算符
  23.     + -                 - 算数运算符
  24.     << >>               - 逻辑移位
  25.                        - 按位“与”
  26.     ^                   - 按位“异”
  27.     |                   - 按位“或”
  28.     = *= /= %= += -=    - 赋值
  29.       &= ^= |= <<= >>=
  30.     ,                   - 表达式分隔符

  31. 如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
  32. 引号扩起来。在表达式中的任何非数字字符串键作为环境变量
  33. 名称,这些环境变量名称的值已在使用前转换成数字。如果指定
  34. 了一个环境变量名称,但未在当前环境中定义,那么值将被定为
  35. 零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
  36. 来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
  37. 那么它显示该表达式的最后值。该分配的操作符在分配的操作符
  38. 左边需要一个环境变量名称。除十六进制有 0x 前缀,八进制
  39. 有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022
  40. 相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
  41. 因为 8 和 9 不是有效的八进制位数。(& )

  42. /P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
  43. 行之前,显示指定的 promptString。promptString 可以是空的。

  44. 环境变量替换已如下增强:

  45.     %PATH:str1=str2%

  46. 会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
  47. 要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
  48. "str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
  49. 开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

  50. 也可以为扩展名指定子字符串。

  51.     %PATH:~10,5%

  52. 会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
  53. 移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
  54. 值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
  55. 使用的数字则是环境变量数值长度加上指定的偏移量或长度。

  56.     %PATH:~-10%

  57. 会提取 PATH 变量的最后十个字符。

  58.     %PATH:~0,-2%

  59. 会提取 PATH 变量的所有字符,除了最后两个。

  60. 终于添加了延迟环境变量扩充的支持。该支持总是按默认值被
  61. 停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
  62. 请参阅 CMD /?

  63. 考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
  64. 变量扩充是很有用的,而不是执行的时候。以下例子说明直接
  65. 变量扩充的问题:

  66.     set VAR=before
  67.     if "%VAR%" == "before" (
  68.         set VAR=after
  69.         if "%VAR%" == "after" @echo If you see this, it worked
  70.     )

  71. 不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
  72. 的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
  73. 复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和
  74. "after",这两者永远不会相等。同样,以下这个例子也不会达到
  75. 预期效果:

  76.     set LIST=
  77.     for %i in (*) do set LIST=%LIST% %i
  78.     echo %LIST%

  79. 原因是,它不会在目前的目录中建立一个文件列表,而只是将
  80. LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
  81. FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
  82. 是空的。因此,我们真正执行的 FOR 循环是:

  83.     for %i in (*) do set LIST= %i

  84. 这个循环继续将 LIST 设成找到的最后一个文件。

  85. 延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
  86. 时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
  87. 例子写成以下所示,以达到预期效果:

  88.     set VAR=before
  89.     if "%VAR%" == "before" (
  90.         set VAR=after
  91.         if "!VAR!" == "after" @echo If you see this, it worked
  92.     )

  93.     set LIST=
  94.     for %i in (*) do set LIST=!LIST! %i
  95.     echo %LIST%

  96. 如果命令扩展被启用,有几个动态环境变量可以被扩展,但
  97. 不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,
  98. 这些变量数值都会被动态计算。如果用户用这些名称中任何
  99. 一个定义变量,那个定义会替代下面描述的动态定义:

  100. %CD% - 扩展到当前目录字符串。

  101. %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

  102. %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

  103. %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

  104. %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

  105. %CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。

  106. %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。

  107. C:\Users\vivianZhao>
复制代码

评分

参与人数 1技术分 +2 收起 理由
杨兴庭 + 2 很给力!

查看全部评分

回复 使用道具 举报
疑问:path的set有没有什么规则
分析:你用JAVA的思想去考虑window环境变量设置的问题,有些格格不入
至于规则,你的疑问应该是前后执行的顺序

解决办法:

path的设置,就是设置window应用程序(JAVA)的路径
按照指定的路径规则设置就OK
路径1;路径2;路径3(多程序累加设置方法)
注意一点:%path%系统变量名,不要用path (因为系统默认路径变量名 是path)

设置 set path=d:\;%Aa%
说多我也迷糊了,总之吧 环境变量名,不能能系统默认值.另起名.方便调用
如果设置成我这个样子

就不会出现你的先后 赋值 等同 等等的问题

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
set path=d:\;%path%的意思是说path相当于d:\在加上原有path的路径,查找顺序是从左往右的。这个貌似在毕老师的视频里面有讲的,在前面后面都是一样的、只是在后面他会先找前面的再找后面的而已。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
path 路径,是java编译时需要调用的程序(如java,javac等)所在的地方。set path=d:\;%path%时,为path增加的新值是d:\,原有值是%path%,增加的新值放在原有值的前面,用分号隔开。Path执行时先在当前目录找,没有找到再去path环境变量找,在环境变量path中找时是从左向右找。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马