Board logo

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

作者: 练习    时间: 2021-2-2 00:02     标题: 批处理启用变量延迟时,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:21

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

  1. set s=100 & echo [!s!]
复制代码
同意楼上,加上括号发现有空格:[100 ]
去掉100与&之间的空格也行
  1. set s=100& echo [!s!]
复制代码

作者: 练习    时间: 2021-2-2 20:44

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

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

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

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

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

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

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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2