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

[数值计算] 批处理启用变量延迟时,Set与echo同行会出现意外结果

问题描述:
启用变量延迟,用&将Set命令与echo命令合并为一行,出现意外结果。
初学,测试很久不得其解。
请各位前辈指点迷津,先行拜谢。

执行出错代码如下:
  1. echo 测试1_结果错误:数值大于100。
  2. setlocal enabledelayedexpansion
  3. set s=100 & echo !s!
  4. if !s! EQU 100 (echo 数值等于100)
  5. if !s! gtr 100 (echo 数值大于100) && echo !s!
  6. pause
复制代码
只要不启用变量延迟,或者启用时把Set命令与echo命令分行写,
执行就没有问题。如以下3个测试:
测试2:启用变量延迟,命令分行写:
  1. echo 测试2_结果正确:数值等于100
  2. setlocal enabledelayedexpansion
  3. set s=100
  4. echo !s!
  5. if !s! EQU 100 (echo 数值等于100)
  6. if !s! gtr 100 (echo 数值大于100)
  7. pause
复制代码
测试3:不启用变量延迟,命令合并写:
  1. echo 测试3_正确:数值等于100
  2. set s=100 & echo %s%
  3. if %s% EQU 100 (echo 数值等于100)
  4. if %s% gtr 100 (echo 数值大于100)
  5. pause
复制代码
测试4:不启用变量延迟,命令分行写:
  1. echo 测试4_正确:数值等于100
  2. set s=100
  3. echo %s%
  4. if %s% EQU 100 (echo 数值等于100)
  5. if %s% gtr 100 (echo 数值大于100)
  6. pause
复制代码

本帖最后由 WHY 于 2021-2-2 09:23 编辑
  1. set "s=100" & echo !s!
复制代码
不加引号的话,变量s的值是 100+空格
启用变量延迟后,空格也参与到 if 比较了。

TOP

  1. set s=100 & echo [!s!]
复制代码
同意楼上,加上括号发现有空格:[100 ]
去掉100与&之间的空格也行
  1. set s=100& echo [!s!]
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

多谢WHY 和cutebe两位前辈指点!
果然是这样的,100后面多了个空格。

以前认为用&连接两个命令时,其前后必须要加空格,
今天才知道原来批处理中“&”的前面不用空格,测试了一下,发现后面也不需要空格。
可以用:【命令1&命令2】的形式。
或者在set语句中,用双引号把赋值语句括起来之后,再加空格,然后接“&下一命令”。

cutebe前辈使用的查错方法也很巧妙。
我刚才用“>”把变量的值输出到txt文件中,也查出了同样的错误。
但是显然用echo [变量] 的方式查错更简洁!

TOP

多谢WHY 和cutebe两位前辈指点!
果然是这样的,100后面多了个空格。

以前认为用&连接两个命令时,其前后必须要加空格,
今天才知道原来批处理中“&”的前面不用空格,测试了一下,发现后面也不需要空格。
可以用:【命令1&命令2】的形式。
或者在set语句中,用双引号把赋值语句括起来之后,再加空格,然后接“&下一命令”。

cutebe前辈使用的查错方法也很巧妙。
我刚才用“>”把变量的值输出到txt文件中,也查出了同样的错误。
但是显然用echo [变量] 的方式查错更简洁!

TOP

刚才回复时没反应,多点了几次,刷新后发现回了两次!

TOP

返回列表