中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 为啥第二次筛选重复行没结果 (高手请进)
« [1] [2] »
作者:
标题: 为啥第二次筛选重复行没结果 (高手请进) 上一主题 | 下一主题
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『楼 主』:  为啥第二次筛选重复行没结果 (高手请进)

为啥第二次筛选重复行没结果?

@echo off
echo 1st check
for /F "tokens=1,2 delims=," %%i in (test.csv) do (
     if not defined %%j set %%j=x & echo %%i %%j)
echo ----------
echo 2nd check
for /F "tokens=1,2 delims=," %%i in (test.csv) do (
     if not defined %%j set %%j=x & echo %%i %%j)


test.csv 内容:
server 1,61.172.201.11
server 2,61.172.201.12
server 3,60.28.178.138
server 4,61.172.201.12
server 5,60.28.178.138
server 6,61.172.201.11
server 7,61.172.201.12
server 8,60.28.178.138

但只返回结果:
1st check
server 1 61.172.201.11
server 2 61.172.201.12
server 3 60.28.178.138
----------
2nd check
Exit code: 0 , 0000h

下面是我想要的,2次结果肯定是相同的。
只不过要要对这些IP 做2次不同的操作。(比如PING,试图连接服务器等。)

1st check
server 1 61.172.201.11
server 2 61.172.201.12
server 3 60.28.178.138
------------
2st check
server 1 61.172.201.11
server 2 61.172.201.12
server 3 60.28.178.138

[ Last edited by uiopuiop on 2007-10-13 at 01:54 PM ]

2007-10-13 12:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 2 楼』:  



  Quote:
Originally posted by uiopuiop at 2007-10-13 12:50:
为啥第二次筛选重复行没结果?

@echo off
echo 1st check
for /F "tokens=1,2 delims=," %%i in (test.txt) do (
     if not defined %%j set %%j=x & echo test 1: %%i)
e ...

给你一个我自己用的删除重复行bat:
@echo off
cd.>good.txt
for /f "delims=, tokens=1,*" %%a in (test.txt) do (
  type good.txt|find "%%b"||echo %%a,%%b>>good.txt
)

pause
不好意思,刚才没有看明白你的意思.
这个呢,是把有重复ip的删除了.

[ Last edited by scriptor on 2007-10-13 at 01:09 PM ]

2007-10-13 12:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by uiopuiop at 2007-10-13 12:50:
为啥第二次筛选重复行没结果?

@echo off
echo 1st check
for /F "tokens=1,2 delims=," %%i in (test.csv) do (
     if not defined %%j set %%j=x & echo %%i %%j)
echo  ...

第一次筛选后,就是没有重复的了
那么进行第二次删除重复行,肯定是没有结果的啊?

你的意思是什么呢?

2007-10-13 13:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 4 楼』:  

我要对不重复的IP地址做2次操作。又不想生成临时文件, 第一次的结果因该已经被释放了呀 !

2007-10-13 13:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 5 楼』:  

不太明白!

你想要的结果是什么样子的呢?

:ps
发现你两次check的代码是一样的

2007-10-13 13:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 6 楼』:  

我没把其余代码贴上来,原理就是这个。

过滤不重复的IP,做操作一。做完后,再过滤一次做操作二。

2007-10-13 13:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 7 楼』:  

我知道了:

第一次check的时候
你发现么? 代码里有一个if not defined %%j set %%j=x .....
当进行第二次时,set的内容没有清空
所以运行时候,第二个if not defined %%j ..... 就起作用了,
使得后面不能判断,运行.

改一下代码:
...
set %%j=
echo 2nd check
......
运行结果是如下:
1st check
server 1 61.172.201.11
server 2 61.172.201.12
server 3 60.28.178.138
----------
2nd check
server 1,61.172.201.11
server 2,61.172.201.12
server 3,60.28.178.138
server 4,61.172.201.12
server 5,60.28.178.138
server 6,61.172.201.11
server 7,61.172.201.12
server 8,60.28.178.138


2007-10-13 13:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 8 楼』:  

这个是不是你要的呢?

2007-10-13 13:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 9 楼』:  多谢帮忙啊!

下面是我想要的,2次结果肯定是相同的。
只不过要要对这些IP 做2次不同的操作。(比如PING,试图连接服务器等。)

1st check
server 1 61.172.201.11
server 2 61.172.201.12
server 3 60.28.178.138
------------
2st check
server 1 61.172.201.11
server 2 61.172.201.12
server 3 60.28.178.138

2007-10-13 13:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 10 楼』:  

o,这个啊
看来我理解错了
我再想想!
:)

2007-10-13 13:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by scriptor at 2007-10-13 13:50:
o,这个啊
看来我理解错了
我再想想!
:)

haha...我终于解决了:
原因是变量没有释放,没有置NULL.
用setlocal和endlocal 改变变量局域
@echo off
echo 1st check
setlocal
for /f "tokens=1,2 delims=," %%i in (test.txt) do (
     if not defined %%j set %%j=x & echo %%i %%j)
echo ----------
echo 2nd check
endlocal

for /f "tokens=1,2 delims=," %%i in (test.txt) do (
     if not defined %%j set %%j=x & echo %%i %%j)
     
     pause


2007-10-13 13:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by scriptor at 2007-10-13 13:56:



haha...我终于解决了:
原因是变量没有释放,没有置NULL.
用setlocal和endlocal 改变变量局域

[code]
@echo off
echo 1st check
setlocal
for /f "tokens=1,2 delim ...

关于变量为什么没有释放的验证
去掉上面的那个endlocal,输出就不对.

看一看看endlocal的help

  Quote:
结束批处理文件中环境改动的本地化操作。在执行ENDLOCAL 之后
所做的环境改动不再仅限于批处理文件。批处理文件结束后,
原先的设置无法还原。

ENDLOCAL

如果命令扩展名被启用,ENDLOCAL 会如下改变:

如果相应的 SETLOCAL 用新的 ENABLEEXTENSIONS 或
DISABLEEXTENSIONS 选项启用或停用了命令扩展名,那么,在
ENDLOCAL 之后,命令扩展名的启用/停用状态会还原到执行
相应的 SETLOCAL 命令前的状态。



   此帖被 +2 点积分    点击查看详情   
评分人:【 uiopuiop 分数: +2  时间:2007-10-13 14:01


2007-10-13 13:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 13 楼』:  

当然,那还和setlocal有关

但是我认为,变量没有清空.不知道这个到底该怎么验证!

2007-10-13 14:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 14 楼』:  

高手! 多谢啊 ~

但是,我把第二段的变量名都改了也试过,也是不来的。

但ENDLOCAL 的确解决了问题。

[ Last edited by uiopuiop on 2007-10-13 at 02:04 PM ]

2007-10-13 14:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 15 楼』:  

hoho....... 有点意思
我有知道一个解决方案了

你的这个删除重复行,让我也长见识了.
哈哈......

我很少来,来了就高一两个问题坐坐,
还满有收获的
哈哈........

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


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



论坛跳转: