我正在尝试在给定文件中搜索字符串。此文件的名称中可能包含空格,而我在使用批处理文件时遇到了问题。
我可以通过控制台轻松做到这一点并获得正确的结果:
findstr /m /C:tofind "C:/myPath/my file name with white spaces"
但是当我尝试在批处理文件上执行此操作时,它根本没有显示任何结果:
@echo off
for /r "delims:|" %%i in (*) do (
findstr /m /C:tofind "%%i"
)
我究竟做错了什么?
答案1
您只需要以下内容:
findstr /m /c:toFind *
它将搜索当前目录下的每个文件,并打印出包含搜索字符串的文件的名称。
如果要搜索当前目录以外的文件夹,那么:
pushd "c:\yourPath"
findstr /m /c:toFind *
popd
如果您想在输出中包含每个文件的完整路径,那么:
findstr /m /c:toFind "c:\yourPath\*"
使用 FOR 循环迭代文件的正确方法(如您最初打算的那样)是:
for %%F in (*) do findstr /m /c:toFind "%%F"
但是当 FINDSTR 可以自行迭代文件时,无需使用 FOR 来迭代文件。
FOR 命令是批处理中最复杂的命令。它有许多不同的形式,可以执行完全不同的操作。下面仅列举几个:
for %%A in (file list with wildcard support) - iterate files
for /f "options" %%A in (filePath) - read and parse a file
for /f "options" %%A in ("string") - parse a string
for /f "options" %%A in ('someCommand') - parse the output of a command
您应该非常仔细地阅读文档。在命令提示符下键入HELP FOR
或FOR /?
以获取文档。
答案2
我找到了解决方案。
它似乎可以在子句中使用双引号in
,并使用for`/F
代替/R/ for the
:
@echo off
for /f %%i in ("*") do (
findstr /m /C:toFind "%%i"
)