Board logo

标题: 为啥第二次筛选重复行没结果 (高手请进) [打印本页]

作者: uiopuiop     时间: 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 ----------
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 ]
作者: scriptor     时间: 2007-10-13 12:57


  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 ]
作者: scriptor     时间: 2007-10-13 13:10


  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  ...

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

你的意思是什么呢?
作者: uiopuiop     时间: 2007-10-13 13:17
我要对不重复的IP地址做2次操作。又不想生成临时文件, 第一次的结果因该已经被释放了呀 !
作者: scriptor     时间: 2007-10-13 13:32
不太明白!

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

:ps
发现你两次check的代码是一样的
作者: uiopuiop     时间: 2007-10-13 13:38
我没把其余代码贴上来,原理就是这个。

过滤不重复的IP,做操作一。做完后,再过滤一次做操作二。
作者: scriptor     时间: 2007-10-13 13:39
我知道了:

第一次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

作者: scriptor     时间: 2007-10-13 13:39
这个是不是你要的呢?
作者: uiopuiop     时间: 2007-10-13 13:43    标题: 多谢帮忙啊!

下面是我想要的,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
作者: scriptor     时间: 2007-10-13 13:50
o,这个啊
看来我理解错了
我再想想!
:)
作者: scriptor     时间: 2007-10-13 13:56


  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

作者: scriptor     时间: 2007-10-13 13:59


  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 命令前的状态。


作者: scriptor     时间: 2007-10-13 14:00
当然,那还和setlocal有关

但是我认为,变量没有清空.不知道这个到底该怎么验证!
作者: uiopuiop     时间: 2007-10-13 14:02
高手! 多谢啊 ~

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

但ENDLOCAL 的确解决了问题。

[ Last edited by uiopuiop on 2007-10-13 at 02:04 PM ]
作者: scriptor     时间: 2007-10-13 14:05
hoho....... 有点意思
我有知道一个解决方案了

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

我很少来,来了就高一两个问题坐坐,
还满有收获的
哈哈........
作者: scriptor     时间: 2007-10-13 14:09


  Quote:
Originally posted by uiopuiop at 2007-10-13 14:02:
高手! 多谢啊 ~

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

但ENDLOCAL 的确解决了问题。

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

改变量名,我也试过的
但是cmd不会改,他按顺序判断变量的

后来,我也不知道怎么回事,会想到endlocal
加入endlocal后,还是没有效果,第二次check没有输出,你可以自己试一下,
这时候,我就想到, setlocal要和endlocal一起的.
好,我加入setlocal,运行,好了 ,我高兴死了 ....
hahha....

这就是我刚才实验的过程.

[ Last edited by scriptor on 2007-10-13 at 02:11 PM ]