winlong102 发表于 2023-11-14 16:30:57

新手求助for用法的问题

我写了一段批处理,用于获取系统生成的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%)
感谢

nttwqz 发表于 2023-11-14 19:52:50

我猜,你应该没有认真看set帮助

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

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

set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked )


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

set LIST=
for% i in (*) do set LIST=%LIST%%i
echo%LIST%

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

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

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

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

set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for% i in (*) do set LIST=!LIST! %i
echo %LIST%

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

tanglf 发表于 2023-11-14 20:42:36

学习了

nathan6498 发表于 2023-11-14 21:14:11

学习学习

winlong102 发表于 2023-11-15 07:44:49

nttwqz 发表于 2023-11-14 19:52
我猜,你应该没有认真看set帮助

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

szwp 发表于 2023-11-15 08:21:45

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

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

9zhmke 发表于 2023-11-15 08:36:08

虽然批处理可以使用数字作为变量,还是尽量少用数字作为变量,除了不易理解外,有计算的时候还容易弄错

winlong102 发表于 2023-11-15 08:56:05

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

好的感谢

winlong102 发表于 2023-11-15 08:59:46

本帖最后由 winlong102 于 2023-11-15 09:04 编辑

szwp 发表于 2023-11-15 08:21
你的运行结果没有截屏上来啊。
echo %31%
这句放在)下面一行试试。
{:1_185:} 我能说我昨天怎么试都不行,放在下面echo %31%显示的结果是1. 但是今天就行了,文件名显示正确了。代码我都没改,我都不知道问题出在哪。也可能是数字的关系,我把变量31改成了bom31.谢谢

szwp 发表于 2023-11-15 09:13:03

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

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

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

rbwrbw 发表于 2023-11-15 10:02:01

看帮助,很详细

liuzhaoyzz 发表于 2023-11-15 13:57:33

windows批处理不支持数字打头的变量。

nttwqz 发表于 2023-11-15 19:07:29

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

需要开启变量延迟

setlocal /?

%31%改成!31!

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

无犹启动 发表于 2024-2-12 09:29:28

学习学习
页: [1]
查看完整版本: 新手求助for用法的问题