标题: [讨论]双引号、空格、逗号、分号对批处理set命令输出的影响 [打印本页]
作者: neorobin 时间: 2010-4-20 21:57 标题: [讨论]双引号、空格、逗号、分号对批处理set命令输出的影响
本文所有示例均在 winxpsp3, 活动代码页 936 环境下运行
一. 半角双引号, 半角空格, 全角空格, 半角逗号 都可能导致变量名不能被 set 正常识别(其中部分原因和下面第二条有关)
二. 以下情形可以显示每个驱动器下的最后工作目录(排在空 set 命令显示的环境变量信息之前):
1. set 后面是一个或若干个全角空格(或者半角逗号, 或者半角分号)(可以紧跟)
2. set 后面是一个半角双引号(不能紧跟) 或 一对半角双引号 " (一对半角双引号中间可以含有若干个半角或全角空格)
根据 qzwqzw 补充, set 后面用 半角分号 ";" 也有这种作用, 且输出可能含有 =ExitCode 变量的信息,也可能会出现变量“=ExitCode=”,代表CMD所调用外部程序的错误返回码(%Errorlevel%)
, =ExitCode 变量的输出形式是 十六进制形式.
以下代码都能输出同样含有 各驱动器下最后工作目录 和 =ExitCode 变量(可能有) 的信息- set
- set
- set
- set,
- set;
- set "
- set ""
- set " "
- set " "
复制代码
以下的部分输出信息是 空 set 命令不能输出的
=::=::\
=C:=C:\WINDOWS\Web
=D:=D:\Backup
=E:=E:\downloads
=F:=F:\GHOST
其中 =C: 及相近形式开头的的输出行(除第一个不明)都是我曾用 cd 命令设置过的每个驱动器(C:,D:,E:,F下的 最后一次 的工作目录, 如果没有在某个驱动器下设置过工作目录, 那么对应驱动器的一行也不会输出.
以下是 qzwqzw 在 2 楼给出的 =ExitCode 变量信息输出示例- set /a var=1+
- echo %errorlevel%
- set,|findstr "ExitCode"
- cmd /c set /a var=1a
- echo %errorlevel%
- set,|findstr "ExitCode"
复制代码
变量识别影响示例:在winxpsp3 936代码页环境, set 输出环境变量没有定义的信息格式是
变量名的前后各有一个半角空格, 前面是 "环境变量" 4个字, 后面是 "没有定义" 4 个字,
注意这个输出格式, 可分辨出 set 对其后的字符串是如何做出的 变量名识别结果.
以下示例假设之前未设置过特别的环境变量名, 将显示 "环境变量 * 没有定义" , * 指代的部分是 set 之后的字符串的一部分, 前部和尾部都有去除, 去除的界限是 直到某个引号 或者 从后部的某个引号或空格开始.
至于精确的识别规则, 本人认为没有必要大费精力弄个一清二楚, 而重要的意义是在编写代码时, 注意避免这些特殊规则带来的 误解 和 差错.- prompt $s$g:
- set " "ab"cde
- set " "ab"cde"fg
- set " "ab"cde"fg"hij
- set " "ab"cde"fg"hij kl
- set " "ab"cde"fg"hij kl"mn
- set " "ab"cde"fg"hij kl"mn opq
- set ""abc"de
- set " "ab"cde
- set " "ab"cde"fg
复制代码
输出结果: >:prompt $s$g:
>:set " "ab"cde
环境变量 "ab 没有定义
>:set " "ab"cde"fg
环境变量 "ab"cde 没有定义
>:set " "ab"cde"fg"hij
环境变量 "ab"cde"fg 没有定义
>:set " "ab"cde"fg"hij kl
环境变量 "ab"cde"fg 没有定义
>:set " "ab"cde"fg"hij kl"mn
环境变量 "ab"cde"fg"hij 没有定义
>:set " "ab"cde"fg"hij kl"mn opq
环境变量 "ab"cde"fg"hij 没有定义
>:set ""abc"de
环境变量 "abc 没有定义
>:set " "ab"cde
环境变量 "ab 没有定义
>:set " "ab"cde"fg
环境变量 "ab"cde 没有定义
[ 本帖最后由 neorobin 于 2010-4-21 10:44 编辑 ]
作者: qzwqzw 时间: 2010-4-21 09:26
嗯,好帖
在我这里
还看到了名为=ExitCode的变量
与%errorlevel%不同的是
它代表外部调用程序的错误返回码
当前CMD内部目录的错误并不重置该变量- set /a var=1+
- echo %errorlevel%
- set,|findstr "ExitCode"
- cmd /c set /a var=1a
- echo %errorlevel%
- set,|findstr "ExitCode"
复制代码
至于那个变量=::
想不起来在什么地方见过了
好像指代CMD'和DOS下一个特殊的驱动盘
作者: neorobin 时间: 2010-4-21 10:48 标题: 回复 2楼 的帖子
真好, 我认为这个 =ExitCode 很有一定的利用价值
作者: ithinkican 时间: 2010-12-18 22:16 标题: 我想问下
为什么没有
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |