无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 2459|回复: 19
打印 上一主题 下一主题

新手求助for用法的问题

[复制链接]
跳转到指定楼层
1#
发表于 2023-11-14 16:30:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一段批处理,用于获取系统生成的bom31_***的文件名,使用了set,但是为什么%%i和%31%显示的字符串不一样呢?
@echo off
for /f "delims=_ tokens=2" %%i in ('dir /b d:\pack\bom31* ^| find "bom31" 2^>nul') do (set 31=%%i
echo %%i
echo %31%)
感谢
2#
发表于 2023-11-14 19:52:50 | 只看该作者
我猜,你应该没有认真看set帮助

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

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

  8. set VAR=before
  9. if "%VAR%" == "before" (
  10. set VAR=after
  11. if "%VAR%" == "after" @echo If you see this, it worked )


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

  18. set LIST=
  19. for% i in (*) do set LIST=%LIST%%i
  20. echo%LIST%

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

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

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

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

  32. set VAR=before
  33. if "%VAR%" == "before" (
  34. set VAR=after
  35. if "!VAR!" == "after" @echo If you see this, it worked
  36. )

  37. set LIST=
  38. for% i in (*) do set LIST=!LIST! %i
  39. echo %LIST%

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

点评

学习了,但还是不明白正确的该怎么写,在这个例子中,我如果想把%%i获取的文件名赋值给变量31,正确的写法是什么?谢谢。  详情 回复 发表于 2023-11-15 07:44
回复

使用道具 举报

3#
发表于 2023-11-14 20:42:36 | 只看该作者
学习了
回复

使用道具 举报

4#
发表于 2023-11-14 21:14:11 | 只看该作者
学习学习
回复

使用道具 举报

5#
 楼主| 发表于 2023-11-15 07:44:49 | 只看该作者
nttwqz 发表于 2023-11-14 19:52
我猜,你应该没有认真看set帮助

学习了,但还是不明白正确的该怎么写,在这个例子中,我如果想把%%i获取的文件名赋值给变量31,正确的写法是什么?谢谢。

点评

需要开启变量延迟 setlocal /? %31%改成!31! 另外,不建议使用纯数字和数字开头的变量名  详情 回复 发表于 2023-11-15 19:07
你的运行结果没有截屏上来啊。 echo %31% 这句放在)下面一行试试。  详情 回复 发表于 2023-11-15 08:21
回复

使用道具 举报

6#
发表于 2023-11-15 08:21:45 | 只看该作者
winlong102 发表于 2023-11-15 07:44
学习了,但还是不明白正确的该怎么写,在这个例子中,我如果想把%%i获取的文件名赋值给变量31,正确的写 ...

你的运行结果没有截屏上来啊。
echo %31%
这句放在)下面一行试试。

点评

我能说我昨天怎么试都不行,放在下面echo %31%显示的结果是1. 但是今天就行了,文件名显示正确了。代码我都没改,我都不知道问题出在哪。  详情 回复 发表于 2023-11-15 08:59
回复

使用道具 举报

7#
发表于 2023-11-15 08:36:08 | 只看该作者
虽然批处理可以使用数字作为变量,还是尽量少用数字作为变量,除了不易理解外,有计算的时候还容易弄错

点评

好的感谢  详情 回复 发表于 2023-11-15 08:56
回复

使用道具 举报

8#
 楼主| 发表于 2023-11-15 08:56:05 | 只看该作者
9zhmke 发表于 2023-11-15 08:36
虽然批处理可以使用数字作为变量,还是尽量少用数字作为变量,除了不易理解外,有计算的时候还容易弄错

好的感谢

点评

谢了!!!  发表于 2023-11-15 10:02
回复

使用道具 举报

9#
 楼主| 发表于 2023-11-15 08:59:46 | 只看该作者
本帖最后由 winlong102 于 2023-11-15 09:04 编辑
szwp 发表于 2023-11-15 08:21
你的运行结果没有截屏上来啊。
echo %31%
这句放在)下面一行试试。

我能说我昨天怎么试都不行,放在下面echo %31%显示的结果是1. 但是今天就行了,文件名显示正确了。代码我都没改,我都不知道问题出在哪。也可能是数字的关系,我把变量31改成了bom31.谢谢

点评

为什么%%i和%31%显示的字符串不一样 这个不一样在哪里,要截屏出来看的  详情 回复 发表于 2023-11-15 09:13
回复

使用道具 举报

10#
发表于 2023-11-15 09:13:03 | 只看该作者
winlong102 发表于 2023-11-15 08:59
我能说我昨天怎么试都不行,放在下面echo %31%显示的结果是1. 但是今天就行了,文件名显示正确 ...

为什么%%i和%31%显示的字符串不一样

这个不一样在哪里,要截屏出来看的
回复

使用道具 举报

11#
发表于 2023-11-15 10:02:01 | 只看该作者
看帮助,很详细
回复

使用道具 举报

12#
发表于 2023-11-15 13:57:33 | 只看该作者
windows批处理不支持数字打头的变量。
回复

使用道具 举报

13#
发表于 2023-11-15 19:07:29 来自手机 | 只看该作者
winlong102 发表于 2023-11-15 07:44
学习了,但还是不明白正确的该怎么写,在这个例子中,我如果想把%%i获取的文件名赋值给变量31,正确的写 ...

需要开启变量延迟

setlocal /?

%31%改成!31!

另外,不建议使用纯数字和数字开头的变量名
回复

使用道具 举报

14#
发表于 2024-2-12 09:29:28 | 只看该作者
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-15 08:50

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表