Board logo

标题: 我的findstr怎么了 [打印本页]

作者: smileseeker     时间: 2006-9-27 01:18    标题: 我的findstr怎么了

D:\scripts>for /F %i in ('dir /ad /s /b') do echo %~ni   | findstr "123"

D:\scripts>echo 123   | findstr "123"
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
^CEnter your code:Enter your code:Enter your code:Enter your code:Enter your cod
e:Enter your code:Enter your code:Enter your code:^C^CEnter your code:Enter your
code:^C^CERROR!!!
作者: namejm     时间: 2006-9-27 01:23
  你的代码有点问题,试试下面这个语句呢:
for /F %i in ('dir /ad /s /b') do (echo %~ni|findstr "123">nul && echo %~ni)

作者: smileseeker     时间: 2006-9-27 01:30
好像还是不行啊

D:\scripts>for /F %i in ('dir /ad /s /b') do (echo %~ni  | findstr "123"   && ec
ho %~ni )

D:\scripts>(echo 123  | findstr "123"   && echo 123 )
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
Enter your code:Enter your code:Enter your code:Enter your code:Enter your code:
作者: namejm     时间: 2006-9-27 02:01
  你干脆把下面的代码放到批处理来执行算了,在CMD窗口里很受干扰的。
@echo off
for /F %%i in ('dir /ad /s /b') do (echo %%~ni|findstr "123">nul && echo %%~ni)
pause

作者: electronixtar     时间: 2006-9-27 02:11
你的bat名字是不是findstr.bat ?
作者: 9527     时间: 2006-9-27 02:34
LZ想要实现什么效果???不明白,是找123命名的文件夹吗?还是???
作者: vkill     时间: 2006-9-27 08:12
没有遇到过
作者: pengfei     时间: 2006-9-27 09:25


  Quote:
Originally posted by smileseeker at 2006-9-27 01:18:
D:\scripts>for /F %i in ('dir /ad /s /b') do echo %~ni   | findstr "123"

D:\scripts>echo 123   | findstr "123"
Enter your code:Enter your code:Enter your code:Enter yo ...

很明显你的代码是错误的. dir /ad /s /b是查找文件夹, 而%~ni为扩展到文件名. 哪里来的文件名吗? 根本就只有路径.

代码修改为:
@echo off
for /F "tokens=*" %%i in ('dir /a-d /s /b *.*') do (
    echo %%~ni  | findstr "123" && echo 找到匹配文件
)
pause

请保存为批处运行.
作者: vkill     时间: 2006-9-27 09:28


  Quote:
Originally posted by pengfei at 2006-9-27 09:25:


很明显你的代码是错误的. dir /ad /s /b是查找文件夹, 而%~ni为扩展到文件名. 哪里来的文件名吗? 根本就只有路径.

代码修改为:
@echo off
for /F "t ...

本来windows就认不出什么是文件什么是路径的,问个问题,有个文件夹a.txt ,你说它是文件夹还是文件???更何况是机器,它怎么认的出
作者: pengfei     时间: 2006-9-27 09:32
刚才测试了一下我的电脑没有出现错误提示.

我是认为%%~ni为扩展到文件名! 如果为路径扩展会出现错误.

[ Last edited by pengfei on 2006-9-27 at 09:40 ]
作者: vkill     时间: 2006-9-27 09:42


  Quote:
Originally posted by pengfei at 2006-9-27 09:32:
刚才测试了一下我的电脑没有出现错误提示.

我是认为%%~ni为扩展到文件名! 如果为路径扩展会出现错误.

[ Last edited by pengfei on 2006-9-27 at 09:40 ]

cd c:\
md test
cd test
md 123
md 123456
for /F %i in ('dir /ad /s /b') do echo %~ni   | findstr "123"

你执行这个看看,看看会不会出错
作者: namejm     时间: 2006-9-27 09:44


  Quote:
Originally posted by he200377 at 2006-9-27 09:28:

本来windows就认不出什么是文件什么是路径的,问个问题,有个文件夹a.txt ,你说它是文件夹还是文件???更何况是机器,它怎么认的出

  此言差矣。CMD下的 dir 是可以区分出某个file到底是文件夹还是文件的,要不然,dir命令还要 /ad 和 /a-d 这两个参数干什么呢?如果按照你的理解,它们岂不成了摆设了吗?你建立一个a.txt的文件夹,分别用 dir /ad 和 dir /a-d 来试试,看dir是不是能正确区分出来。

  只是在for语句的扩展中,%~xi 简单地认为最后一个以点号结束的字符串是后缀名,从而造成把文件夹a.txt的后缀名误认为是.txt的情况。如果据此就认为windows不能正确区分文件和路径的话,那就大错特错了。不过这也证明了for语句的扩展是有bug的,使用的时候千万要小心。
作者: pengfei     时间: 2006-9-27 09:44
是的, 看来是我错了.  没有经过测试, 只是理论推断.
作者: vkill     时间: 2006-9-27 09:52
分别用 dir /ad 和 dir /a-d 来试试

一言指明哈~原来 dir 可以排除目录的,搞的上次为了这个排除目录而想方法,这次回去再 *.exe /? 看看
作者: namejm     时间: 2006-9-27 09:53


  Quote:
Originally posted by he200377 at 2006-9-27 09:42:

cd c:\
md test
cd test
md 123
md 123456
for /F %i in ('dir /ad /s /b') do echo %~ni   | findstr "123"

你执行这个看看,看看会不会出错

  从这段代码来看,你是在CMD窗口下执行的。从你的整体意思来看,你是想先转到 C 盘根目录下之后再创建文件夹,但是你最开始的那一句就没写对,因为它并不能跳转到 C 盘根目录下,请想想这是为什么;并且,你最后的for语句不完整,所以就算你前面的代码都写对了,执行到这里的时候也会发生错误的。

  以上代码我是在批处理中把 %i 替换成 %%i 来执行的,所以导致以上言论出了错,在此更正,并对导致别人的误解表示歉意。

[ Last edited by namejm on 2006-9-27 at 10:16 ]
作者: vkill     时间: 2006-9-27 09:55
楼主的错误到底是怎么回事那?以前看到过那样的错误
作者: vkill     时间: 2006-9-27 09:57


  Quote:
Originally posted by namejm at 2006-9-27 09:53:


  从这段代码来看,你是在CMD窗口下执行的。从你的整体意思来看,你是想先转到 C 盘根目录下之后再创建文件夹,但是你最开始的那一句就没冠...

我怎么执行没有错误那???不解
作者: pengfei     时间: 2006-9-27 09:59
其实for扩充到文件名还是有BUG的:

for语句中执行dir /ad或dir /a-d中用%%~ni扩充到文件名, FOR语句处理机制可能是把最后一个路径"\"符号后面"."号和后面的后缀去掉, 只显示文件名;

而如果/ad只查找文件夹, 最后的路径"/"后面没有"."号, 它会整个显示最后一个目录名.

[ Last edited by pengfei on 2006-9-27 at 12:10 ]
作者: pengfei     时间: 2006-9-27 10:04


  Quote:
Originally posted by he200377 at 2006-9-27 09:57:

我怎么执行没有错误那???不解

你那段代码第一个命令是存在缺陷的, 假设你在D盘运行...

不过for语句的%%~ni扩充的确是有bug的, 当时我也没有测试. 后来才发现他的扩充机制存在问题.

[ Last edited by pengfei on 2006-9-27 at 10:24 ]
作者: smileseeker     时间: 2006-9-28 04:06
感谢各位朋友的热心帮助

小弟的目的是这样的 通过下面代码

echo.>temp.txt
for /f %%i in ('dir /ad /s /b') do (echo %%~ni|findstr "^[0-9]*$" && echo %%i >>temp.txt)
for /f %%i in (temp.txt) do del /q %%i\*.*


解决http://www.cn-dos.net/forum/viewthread.php?tid=23404&fpage=1

但是就是卡在findstr上

[ Last edited by smileseeker on 2006-9-28 at 05:08 ]
作者: smileseeker     时间: 2006-9-28 04:14


  Quote:
Originally posted by namejm at 2006-9-27 09:44 AM:


  此言差矣。CMD下的 dir 是可以区分出某个file到底是文件夹还是文件的,要不然,dir命令还要 /ad 和 /a-d 这两个参数干什么呢?如果按照你的理解 ...

同意

D:\scripts>for /f %i in ("\123.456") do echo %~ni

D:\scripts>echo 123
123
作者: smileseeker     时间: 2006-9-28 04:24
这是我以前在论坛上找的一段批处理脚本

set /p aa=Enter your code:
echo %aa% | findstr "^[a-z][A-Z]*$"||echo ERROR!!!
pause


我记得当时好像是可以执行的    现在居然是这样的执行结果

D:\scripts>set /p aa=Enter your code:
Enter your code:
D:\scripts>echo dfg     | findstr "^[a-z][A-Z]*$"  || echo ERROR!!!

D:\scripts>set /p aa=Enter your code:
Enter your code:
D:\scripts>echo dfg      | findstr "^[a-z][A-Z]*$"  || echo ERROR!!!

D:\scripts>set /p aa=Enter your code:
Enter your code:
D:\scripts>echo dfg       | findstr "^[a-z][A-Z]*$"  || echo ERROR!!!

D:\scripts>set /p aa=Enter your code:
Enter your code:
D:\scripts>echo dfg        | findstr "^[a-z][A-Z]*$"  || echo ERROR!!!

D:\scripts>set /p aa=Enter your code:
Enter your code:
D:\scripts>echo dfg         | findstr "^[a-z][A-Z]*$"  || echo ERROR!!!

D:\scripts>set /p aa=Enter your code:
Enter your code:
D:\scripts>echo dfg          | findstr "^[a-z][A-Z]*$"  || echo ERROR!!!


无语
作者: kgdetg1127     时间: 2007-10-11 21:25
顶啊!!!