批处理,查找哪些目录下的文件中含有相应的字符串

昨晚提问过,不知道为什么问题失效了。再问一遍,和第一次的需求有点变化,求高手写个能执行的bat文件。谢谢!
我尝试写了一个bat如下:
for /f "delims= " %%i in (source.txt) do (echo %%i && findstr /S /M "%%i" *.stk) >>./results.txt
pause

但是没有达到我的要求,我想在取source.txt中的每一行,然后在当前目录下的子目录中(可能有多级子目录)查找哪个stk文件中含有这一行,我只需要把子目录的名字记录下来,并输入到result.txt中。但是我自己写的命令是把所有含有这个字符串的stk文件都找到了,其实我不需要文件,只要他所在的目录就行。请高手帮忙写个批处理谢谢!

这是source.txt的内容:
bsgap_r1.nrm
ranap951.nrm

运行我的命令后,得到:
bsgap_r1.nrm
12.2\stacks\ip\ip_appl_1090.stk
12.2\stacks\ip\ip_appl_isa.stk
12.2\stacks\ip\ip_appl_isa_1059.stk
12.2\stacks\ip\ip_appl_isa_1090.stk
13.1\stacks\ip\ip_appl.stk
13.1\stacks\ip\ip_appl_1090.stk
13.1\stacks\ip\ip_appl_isa.stk
13.1\stacks\ip\ip_appl_isa_1059.stk
ranap951.nrm
11.3\stacks\ip\ip_appl.stk
11.3\stacks\ip\ip_appl_1059.stk
11.3\stacks\ip\ip_appl_1090.stk
11.3\stacks\ip\ip_appl_1264.stk
11.3\stacks\ip\ip_appl_1293.stk

其实我只想要:
bsgap_r1.nrm :
12.2\stacks\ip
13.1\stacks\ip

ranap951.nrm:
11.3\stacks\ip

两txt文件路径是照你原代码写的,自己注意路径是否对
@echo off
(for /r %%i in (*.stk)do (
findstr/g:"source.txt" "%%~i">nul&&echo %%~dpi)
)>"\results.txt"
pause
我猜还是需要文件名的,那就把代码中的%%~dpi改成%%i 如果确实只要目录,按上面代码如果找到多文件在同一目录就会有重复,需要的话再追问追问

结果不对!
我只要目录,不要重复的!只需要列出该字符串在哪些目录下出现过,就行了,就是下面的效果。你的命令输出了上千行,都是我不需要的东西。

bsgap_r1.nrm:
12.2\stacks\ip
13.1\stacks\ip

ranap951.nrm:
11.3\stacks\ip

追答

应该只是多显示了些( 从根目录起显示出来,且有重复),不至于都是没用的吧
好了给你重写一个去掉了重复的,屏幕上显示了文件名,而记录到文件的应该满足你的要求
@echo off&setlocal enabledelayedexpansion
set "f1=source.txt"
set "f2=results.txt"
set "cp=%~p0"
(for /f "usebackq delims=" %%i in ("%f1%")do (
if defined s echo/
echo %%i:
for /f "delims=" %%j in ('findstr/smc:"%%i" *.stk')do (
>con echo %%j
set "s=%%~pj"
set "s=!s:%cp%=!"
if defined s (set "s=!s:~,-1!")else set "s= 当前目录"
if not defined #!s! set #!s!=y&echo !s!
)))>"%f2%"
pause

追问

多谢!!!!
基本差不多了,但是还有点小bug。
有些屏幕上看到输出了,但是生成的results.txt里却没有记录?
如下,屏幕上有显示:
stacks_13.1_170\stacks\UMTS_COMMON\UMTS_RRC_R9_NSN_ANSI_NSN_RU30.stk
stacks_13.1_170\stacks\UMTS_COMMON\UMTS_RRC_R9_NSN_NSN_RU30.stk
Press any key to continue . . .
但是:stacks_13.1_170\stacks\UMTS_COMMON 确在results.txt里面没有。
请帮忙再改一下,多谢多谢!!!

追答

你这说的把我给难住了,要我说呢是不可能的,别的能正确记录下了,只这个不行,而它这里也没含任何特殊字符, 该不是内容太多看漏了吧...
如果 公子七哥 网友答的只要写入文本的格式认可的话,倒是省些事,你就采纳他的吧 我与他的代码本质上是一样的,只是我写的代码为了去掉文件目录上当前目录之前的部分才多费了周折

追问

仔细对照了一下,不只少了这一个,丢失了好几个目录。但是这些目录和文件的信息都在运行窗口里显示了,就是没有写入results.txt里。我也找不出问题在哪里。我水平很差,没有理解你的脚本:-)
最好你能帮忙看一下,无论怎样,都非常感谢你。会把分给你的。
公子七哥的脚本不能运行。

追答

又看了两次还是看不出什么原因
至于公子七哥代码 应该是变量名带有冒号符出错,前两%%~dpa改为%%~pa

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-06

    @echo off

    for /f  "delims= " %%i in (source.txt) do  (

    echo %%i : >> ./results.txt

    for /f "delims=" %%a in ('findstr /S /M  "%%i" *.stk) do if not defined %%i%%~dpa set %%i%%~dpa=1&&echo %%~dpa>>./results.txt

    )

    pause


只要你的source.txt中的内容没有空格,且子目录名也没有空格就可以。

追问

谢谢,但是只输出了source.txt中的内容,如下:
bsgap_r1.nrm :
ranap951.nrm :
901-24011cp.upd1 :

执行第二个for时,出现了错误:The system cannot find the file 'findstr /S /M "bsgap_r1.nrm" *.stk.

追答

@echo off
for /f "delims= " %%i in (source.txt) do (
echo %%i : >> ./results.txt
for /f "delims=" %%a in ('findstr /S /M "%%i" *.stk') do if not defined %%i%%~dpa set %%i%%~dpa=1&&echo %%~dpa>>./results.txt
)
pause

追问

运行不了啊?闪了一下,啥都没有???

追答

    for /f  "delims=" %%i in ("source.txt") do  (

    echo %%i : >> ./results.txt

    for /f "delims=" %%a in ('findstr /S /M  "%%i" *.stk') do if not defined %%i%%~pa set %%i%%~pa=1&&echo,%%~dpa>>./results.txt

    )

    pause


复制之后检查下换行,有些浏览器和百度知道网页兼容不好,复制下来后可能会不一样。

相似回答
大家正在搜