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

[讨论]双引号、空格、逗号、分号对批处理set命令输出的影响

本文所有示例均在 winxpsp3, 活动代码页 936 环境下运行

一. 半角双引号, 半角空格, 全角空格, 半角逗号 都可能导致变量名不能被 set 正常识别(其中部分原因和下面第二条有关)

二. 以下情形可以显示每个驱动器下的最后工作目录(排在空 set 命令显示的环境变量信息之前):
  1. set 后面是一个或若干个全角空格(或者半角逗号, 或者半角分号)(可以紧跟)
  2. set 后面是一个半角双引号(不能紧跟) 或 一对半角双引号 " (一对半角双引号中间可以含有若干个半角或全角空格)

根据 qzwqzw 补充, set 后面用 半角分号 ";" 也有这种作用, 且输出可能含有 =ExitCode 变量的信息,
也可能会出现变量“=ExitCode=”,代表CMD所调用外部程序的错误返回码(%Errorlevel%)
, =ExitCode 变量的输出形式是 十六进制形式.

以下代码都能输出同样含有 各驱动器下最后工作目录 和 =ExitCode 变量(可能有) 的信息
  1. set 
  2. set  
  3. set  
  4. set,
  5. set;
  6. set "
  7. set ""
  8. set " "
  9. set "  "
复制代码
以下的部分输出信息是 空 set 命令不能输出的
=::=::\
=C:=C:\WINDOWS\Web
=D:=D:\Backup
=E:=E:\downloads
=F:=F:\GHOST


其中 =C: 及相近形式开头的的输出行(除第一个不明)都是我曾用 cd 命令设置过的每个驱动器(C:,D:,E:,F下的 最后一次 的工作目录, 如果没有在某个驱动器下设置过工作目录, 那么对应驱动器的一行也不会输出.

以下是 qzwqzw 在 2 楼给出的 =ExitCode 变量信息输出示例
  1. set /a var=1+
  2. echo %errorlevel%
  3. set,|findstr "ExitCode"
  4. cmd /c set /a var=1a
  5. echo %errorlevel%
  6. set,|findstr "ExitCode"
复制代码
变量识别影响示例:在winxpsp3 936代码页环境, set 输出环境变量没有定义的信息格式是
变量名的前后各有一个半角空格, 前面是 "环境变量" 4个字, 后面是 "没有定义" 4 个字,
注意这个输出格式, 可分辨出 set 对其后的字符串是如何做出的 变量名识别结果.

以下示例假设之前未设置过特别的环境变量名, 将显示 "环境变量 * 没有定义" , * 指代的部分是 set 之后的字符串的一部分, 前部和尾部都有去除, 去除的界限是 直到某个引号 或者 从后部的某个引号或空格开始.

至于精确的识别规则, 本人认为没有必要大费精力弄个一清二楚, 而重要的意义是在编写代码时, 注意避免这些特殊规则带来的 误解 和 差错.
  1. prompt $s$g:
  2. set " "ab"cde
  3. set " "ab"cde"fg
  4. set " "ab"cde"fg"hij
  5. set " "ab"cde"fg"hij kl
  6. set " "ab"cde"fg"hij kl"mn
  7. set " "ab"cde"fg"hij kl"mn opq
  8. set ""abc"de
  9. set "  "ab"cde
  10. 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 编辑 ]

嗯,好帖
在我这里
还看到了名为=ExitCode的变量
与%errorlevel%不同的是
它代表外部调用程序的错误返回码
当前CMD内部目录的错误并不重置该变量
  1. set /a var=1+
  2. echo %errorlevel%
  3. set,|findstr "ExitCode"
  4. cmd /c set /a var=1a
  5. echo %errorlevel%
  6. set,|findstr "ExitCode"
复制代码
至于那个变量=::
想不起来在什么地方见过了
好像指代CMD'和DOS下一个特殊的驱动盘
天的白色影子

TOP

回复 2楼 的帖子

真好, 我认为这个 =ExitCode 很有一定的利用价值

TOP

我想问下

为什么没有

TOP

返回列表