中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 17:42
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 不用变量延迟[setlocal enableDelayedExpansion]也可以计算
楼 主 不用变量延迟[setlocal enableDelayedExpansion]也可以计算 发表于 2008-06-24 22:20 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
UID 59307
状态 离线
可能大家都知道,供还不知道的人学习下吧。

也可以用在其他地方。
::不用变量延迟[setlocal enableDelayedExpansion]也可以计算
@echo off
for /f %%a in ('dir/b') do call :num_add file_num
echo 目录下有%file_num%个文件(夹)。
pause
goto :eof

:num_add
 set/a %1+=1
 goto :eof
┌───────┐
├→学习→实践→┤
└───────┘
2 发表于 2008-06-24 22:36 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
UID 89899
性别 男
状态 离线
不知道,学习。
3 发表于 2008-06-24 22:55 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
Originally posted by HAT at 2008-6-24 22:36:
不知道,学习。

Orz ……
4 发表于 2008-06-24 22:56 ·  法国
高级用户
★★
积分 783
发帖 268
注册 2006-12-26 17:18
UID 74627
性别 男
状态 离线
这也是call的作用所在

(for /f %i in ('dir /b') do set /a n+=1 >nul)&call echo 目录下有%n%个文件(夹)
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃.
5 发表于 2008-06-25 18:59 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
UID 59307
状态 离线
4楼的又是我见的一种新用法。
┌───────┐
├→学习→实践→┤
└───────┘
6 发表于 2008-06-25 19:03 ·  法国
高级用户
★★
积分 783
发帖 268
注册 2006-12-26 17:18
UID 74627
性别 男
状态 离线
这跟楼主的没有什么区别 只是简化了一下
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃.
7 发表于 2008-06-25 19:07 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
UID 59307
状态 离线
不过我是新手,对这样的用法觉得有点奇怪,也不是很习惯。

还是要多与各位学习阿。
┌───────┐
├→学习→实践→┤
└───────┘
8 发表于 2008-06-25 19:07 ·  中国 广东 韶关 电信
高级用户
★★★
CMD感染者
积分 691
发帖 383
注册 2008-05-23 00:38
UID 119451
性别 男
状态 离线
我也要学。
9 发表于 2008-06-25 19:22 ·  中国 江苏 苏州 电信
初级用户
★★
积分 195
发帖 93
注册 2006-10-28 08:20
UID 68626
性别 男
状态 离线
这种都不能代替延迟变量。都是在完全结束一个for+set循环后显示最终效果,根本不能使用中间环节,而延迟变量的作用就是使用set的中间结果
@echo off
for /f %%a in ('dir/b') do (
call :num_add file_num
echo %file_num%
)
echo 目录下有%file_num%个文件(夹)。
pause
goto :eof

:num_add
 set/a %1+=1
 goto :eof

@echo off
for /f %%i in ('dir /b') do (
set /a n+=1 >nul
echo %n%
)
echo 目录下有%n%个文件(夹)
pause



上边两个和楼主和上面ppdos的代码效果是一样的不能使用中间结果

@echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir /b') do (
set /a n+=1 >nul
echo !n!
)
echo %n%
pause


可以比较一下结果

[ Last edited by metoo on 2008-6-25 at 07:26 PM ]
10 发表于 2008-06-25 19:51 ·  法国
高级用户
★★
积分 783
发帖 268
注册 2006-12-26 17:18
UID 74627
性别 男
状态 离线
如果想用中间的结果 也是可以的

(for /f "tokens=*" %i in ('dir /b') do set /a n+=1 >nul&call set _%n%=%i >nul)&call echo 目录下有%n%个文件(夹)



echo %_9%


[ Last edited by PPdos on 2008-6-25 at 01:01 PM ]
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃.
11 发表于 2008-06-25 20:40 ·  中国 江苏 苏州 电信
初级用户
★★
积分 195
发帖 93
注册 2006-10-28 08:20
UID 68626
性别 男
状态 离线
这个是一个取巧的办法了,是用连续多变量分别赋值达到获得其中某个中间变量的值,而不是真正的连续赋值/中间环节直接获取。是定义了n个变量来把整个for循环分步化,而这些分布结果是必须在整个循环结束后才能使用的。

[ Last edited by metoo on 2008-6-25 at 08:42 PM ]
12 发表于 2008-06-25 20:49 ·  法国
高级用户
★★
积分 783
发帖 268
注册 2006-12-26 17:18
UID 74627
性别 男
状态 离线
Originally posted by metoo at 2008-6-25 01:40 PM:
这个是一个取巧的办法了,是用连续多变量分别赋值达到获得其中某个中间变量的值,而不是真正的连续赋值/中间环节直接获取。是定义了n个变量来 ...


大侠能否举个例子?
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃.
13 发表于 2008-06-25 21:09 ·  中国 山西 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
UID 19350
性别 男
状态 离线
大家说了半天
都没觉得是在围着一个很不典型的例子在讨论问题吗?
难道没人知道set /a是缺省具有延迟效果的吗?

楼主的那个例子完全用不着变量延迟或者“中间结果”云云


@echo off
for /f %%a in ('dir/b') do set /a file_num+=1
echo 目录%cd%下有%file_num%个文件(夹)。
14 发表于 2008-06-25 21:12 ·  中国 江苏 苏州 电信
初级用户
★★
积分 195
发帖 93
注册 2006-10-28 08:20
UID 68626
性别 男
状态 离线
- - 菜鸟而已
你的办法是想通过“变变量”的方式来获得各个步骤的,是一次性的生成n个不同的变量,这些变量需要在for命令完全执行完以后才能使用,这就是我说的取巧,而延迟变量是在for命令执行过程中就可以使用。。

@echo off
for /f "tokens=*" %%i in ('dir /b') do (
set /a n+=1 >nul
call set _%n%=%%i >nul
rem 这句其实是有问题的在for未执行完之前%n%为空,所以都是在设置 _ 这个变量的值
echo %n%
echo %_%
echo %_1%
rem 上面这3句是来验证下循环中的变量是不是能使用(我自己加出来的)
)
echo\
echo\
echo\
::换行
::到这儿整个循环结束 %n% %_% 这两个个变量生效
echo %_%
echo %n%
echo %_1%
::验证到%_1%变量不存在
echo\
echo\
echo\
::换行
::上面这3句是来验证下循环中的变量是不是能使用(我自己加出来的)
call echo 目录下有%n%个文件(夹)
pause


[ Last edited by metoo on 2008-6-25 at 09:14 PM ]
15 发表于 2008-06-25 21:15 ·  中国 山西 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
UID 19350
性别 男
状态 离线
metoo老兄9楼的言论有欠思量啊

在没有变量延迟的dos时代
也是可以“连续赋值/中间环节直接获取”的

这只需要对被call的:num_add一节做些小小的改动就可以了
而使用for+call代替for+延迟的方案
通常都会把所有的循环体代码移植到被call的子程序中
而在子程序内部是可以想怎么用就怎么用
没有什么限制的
论坛跳转: