中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-22 07:07
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理中如何逐行读取文本并非将之设为变量? 查看 3,309 回复 23
楼 主 批处理中如何逐行读取文本并非将之设为变量? 发表于 2006-04-05 05:19 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
各位大哥,我是一名新手,想请教如何在批处理中逐行读取文本文件中的的信息并将之当成变量?例如,文件文件a.txt的内容为三行,分别是“123”、“456”、“789”,如何将它们逐一读出来,并将它赋值到三个变量A、B、C?即A=“123”,B=“456”,C=“789”?
2 发表于 2006-04-05 09:13 ·  中国 北京 顺义区 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
20年会员
UID 43784
来自 北京
状态 离线
for /f "tokens=*" %%i in (a.txt) do (set /a A=123&set /a B=456&set /a C=789)
3 发表于 2006-04-05 10:14 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
如果要完全达到楼主想要的效果的话,个人认为最好是启用扩展环境变量,然后在for里面设置自动递增,从而达到效果;另外可以直接在for里面用if语句来实现,缺点是代码比较冗余,可读性不是很好;另外还可以goto循环,每次用set /p var=<a.txt来读取,然后再把a.txt中已经读过的部分过滤掉,缺点是执行效率非常低,而且容错很差。
这样看来,似乎达到楼主的目的要花一番工夫了,其实不然,如果对各个命令都能了如指掌的话,利用各种命令的特性也可以变通地达到目的,比如findstr命令和find命令有个/n参数,可以在显示的查找结果每行前面加上行号,利用这个行号,也许能达到我们的要求。示例代码如下:

for /f "delims=: tokens=1,2" %i in ('"findstr /n . a.txt"') do set %i=%j

注意如果在批处理中运行上述代码时需先把%i更改为%%i,%j更改为%%j。
要点说明:
1,findstr显示的行号格式为 " 行号:内容 ",find的格式为 "内容",所以在delims中用冒号":"来分隔。
2,findstr后面的英文半角下句号“.”通配a.txt中的所有字符。
3,如果需要把变量定义到a中可以在后面加上一句set a=%1%,依次类推。
4 发表于 2006-04-05 11:31 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
2楼可以注解一下吗?我是新手,看得不太懂。先谢谢啦
5 发表于 2006-04-05 11:32 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
3楼能给出代码吗?我看不懂呀
6 发表于 2006-04-05 11:51 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
问题是我如何才可以引用ABC的值?比如要把ABC的值加到B.TXT中去,如何实现?
7 发表于 2006-04-05 12:00 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
echo %1% >>b.txt
echo %2% >>b.txt
echo %3% >>b.txt
8 发表于 2006-04-05 12:17 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
7楼,你的意思是不是2楼的代码再加上你的代码,即:
for /f "tokens=*" %%i in (a.txt) do (set /a A=123&set /a B=456&set /a C=789)
echo %1% >>b.txt
echo %2% >>b.txt
echo %3% >>b.txt

但出来的结果,在了b.txt中的内容是:
……(这部分是b.txt原先的内容)
ECHO 处于打开状态。
ECHO 处于打开状态。
ECHO 处于打开状态。

但我想要的结果是:
……(这部分是b.txt原先的内容)
123
456
789

怎么办?
9 发表于 2006-04-05 12:23 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
7楼,谢谢啦。我弄明白啦。可以这样:
for /f "tokens=*" %%i in (a.txt) do (echo %%i >> b.txt)

太感谢大家啦
10 发表于 2006-04-05 12:26 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
我虽然可以用这句达到目的,但我对这条命令理解不透彻,哪位可以注解一下给我吗?不胜感激
11 发表于 2006-04-05 12:32 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
我主要是对/F “taken=*"不是很明白,哪位大哥愿意帮帮我
12 发表于 2006-04-05 12:48 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
Originally posted by alfredhou at 2006-4-5 05:19:
各位大哥,我是一名新手,想请教如何在批处理中逐行读取文本文件中的的信息并将之当成变量?例如,文件文件a.txt的内容为三行,分别是“123”、 ...

郁闷得紧,原来只是要追加而已,不是要赋值给变量。。
楼主告诉你一条更简单的:
type a.txt >>b.txt
13 发表于 2006-04-05 14:23 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
是要赋值给变量啊,我的目的是要引用变量啊
14 发表于 2006-04-05 14:42 ·  中国 广东 广州 白云区 电信
初级用户
积分 100
发帖 34
注册 2006-04-05 05:13
20年会员
UID 53340
性别 男
状态 离线
3楼的代码好象运行不了。我在WIN2003上试
15 发表于 2006-04-05 14:48 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
1,你执行了for /f "tokens=*" %%i in (a.txt) do (echo %%i >> b.txt)这一句后你怎么分别引用A,B,C三个变量?
2,我的代码下面写得很清楚了,在批处理中运行时候要最修改,那只是在命令行中运行的,运行完毕后可以通过echo %1% %2% %3%来查看是否正确引用到了变量。
3,代码经过测试,确实可执行。
论坛跳转: