中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何控制从for语句中读取每个变量?
« [1] [2] »
作者:
标题: 如何控制从for语句中读取每个变量? 上一主题 | 下一主题
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『楼 主』:  如何控制从for语句中读取每个变量?

D:\> dy -e
Build date: Nov 17 2006 13:20:41

Network device list:

   rpcap://\Device\NPF_{4EE23166-981C-4E56-B425-40A6E65FA56E} : Network adapter 'VMware Virtual Ethernet Adapter' on local host
   rpcap://\Device\NPF_{6EFA89AD-F6B3-4B65-9D3A-60859B5125FD} : Network adapter 'VMware Virtual Ethernet Adapter' on local host
   rpcap://\Device\NPF_{99FFCEE6-638B-4739-8963-3E64C031A4B7} : Network adapter 'Realtek RTL8139 Family Fast Ethernet Adapter' on local host


通过dy -e我能获取如上的信息.现在的需求是将,将每一行中''内的内容指定给name变量如:name3=Realtek RTL8139 Family Fast Ethernet Adapter,而将同一行中//后,:前的部分指定给card变量即:card3=\Device\NPF_{99FFCEE6-638B-4739-8963-3E64C031A4B7}.同时能够显示一共使用了name变量如这里一共会有3个name变量

2006-12-4 08:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 2 楼』:  

for /f "skip=4 delims=" %%i in (1.txt) do echo %%i
可以读出每一行
然后用
set var=!var:rpcap://=!
把三个网卡替换成
\Device\NPF_{4EE23166-981C-4E56-B425-40A6E65FA56E} : Network adapter 'VMware Virtual Ethernet Adapter' on local host
   \Device\NPF_{6EFA89AD-F6B3-4B65-9D3A-60859B5125FD} : Network adapter 'VMware Virtual Ethernet Adapter' on local host
   \Device\NPF_{99FFCEE6-638B-4739-8963-3E64C031A4B7} : Network adapter 'Realtek RTL8139 Family Fast Ethernet Adapter' on local host


最后用for :为分隔符 设置每一个变量,

今天要回家了,就先帮你分析下

[ Last edited by a9319751 on 2006-12-4 at 08:24 AM ]

2006-12-4 08:19
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 3 楼』:  

最好还是不要临时文件,生成临时文件,最后还要删除.会被杀软误杀的

2006-12-4 08:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  


  楼主的dy是三方工具么?
  可否上传一个?
  要不生成临时文件,就要用这个工具进行测试啊,不然怎么测试?


2006-12-4 09:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 5 楼』:  

其实,我觉得只要能将读取的每一行内容赋给一个不同的变量(如:第一行赋给name1,第二行赋给name2,第三行赋给name3...)然后再从name1,name2...中提取所需内容就可以了.只是我想不到如何才能实现:将每一行内容赋给一个不同的变量.因为for语句是循环的,而且覆盖式的,后面会覆盖前面的值.

[ Last edited by yardian on 2006-12-4 at 10:07 AM ]

2006-12-4 09:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 6 楼』:  

看看这个是不是你要的:

@echo off
for /f "skip=4 delims=/: tokens=2,3" %%i in ('dy -e') do (
    set /a a+=1
    call set card%%a%%=%%i
    call set name%%a%%=%%j)
set card
echo.
set name
echo.
echo 共有%a%个name变量
pause>nul

2006-12-4 10:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
seyeskcn
新手上路





积分 12
发帖 6
注册 2006-12-4
来自 河南洛阳
状态 离线
『第 7 楼』:  

顶了,支持一下吧!

2006-12-4 11:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 8 楼』:  

感谢,基本上是我所希望的效果!!!!!!!!!!
唯一就是name变量不是引号内的内容

[ Last edited by yardian on 2006-12-4 at 12:16 PM ]

2006-12-4 11:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 9 楼』:  

呵呵,没看清LZ的要求:
试试以下代码(稍微做了修改):
@echo off
for /f "skip=4 delims=/:' tokens=2,4" %%i in (test.txt) do (
    set /a a+=1
    call set card%%a%%=%%i
    call set name%%a%%=%%j)
set card
echo.
set name
echo.
echo 共有%a%个name变量
pause>nul


2006-12-5 01:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 10 楼』:  

谢谢!我后来也搞出来了。不过我发现你用set代替echo显示的确比较高,但是却给我的应用带来了麻烦。偶太菜,别介意啊!
对于name和card的变量,我如何调用呢?
我试了:%name%a%%,%name^%a^%%,%name\%A\%%,%(name%a%)%都不行啊?

2006-12-6 08:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 11 楼』:  

看来这个问题实在太菜了啊。但我实在想不出如何调用,大家帮帮忙吧

2006-12-8 00:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 12 楼』:  

你在for循环外面调用就没问题了:
echo %name1% %name2% %name3%

要么就在for循环里面:
call echo %%name1%% %%name1%% %%name1%%

2006-12-8 00:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
9527
银牌会员

努力做坏人


积分 1185
发帖 438
注册 2006-8-28
来自 北京
状态 离线
『第 13 楼』:  

@echo off&setlocal
for /f "delims='' tokens=1,2" %%a in (test.txt) do set/a i+=1&call :pp "%%a" "%%b"
echo %name1%     %name2%     %name3%
echo %card1:~2%     %card2:~2%     %card3:~2%
pause>nul
:pp
set name%i%=%~2
for /f "delims=: tokens=2" %%x in (%1) do set card%i%=%%x
goto :eof



我今后在论坛的目标就是做个超级坏人!!!
2006-12-8 00:34
查看资料  发短消息 网志  OICQ (329429)  编辑帖子  回复  引用回复
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『第 14 楼』:  

感谢两位。两位好像理解我的意思。
由于我在顶楼给出示例导致这里a等于3,如果a不确定,那怎么知道name后面的数字究竟是多少呢?不知道我说的大家有没明白

2006-12-8 01:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 15 楼』:  

在9楼的代码不是有个%a%吗?这个就可以控制变量数目的啊!
所以,可以使用:
对应代码:
1、
setlocal enabledelayedexpansion
for /l %%i in (1 1 %a%) do  echo !name%%i! !card%%i!
pause>nul
2、
for /l %%i in (1 1 %a%) do  call echo %%name%%i%% %%card%%i%%
pause>nul


2006-12-8 01:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: