批处理文件在FOR循环中搜索多种文件格式

时间:2019-06-07 13:17:53

标签: windows batch-file windows-10

我正在编码一个批处理文件,该文件应在两个文件夹路径中搜索多个文件扩展名,并将它们列出在文本文件中。目前,我正在尝试使用FOR循环以及文件扩展名列表(* .doc,*。docx等)。我认为该文件因“ *”字符而出错,但我不知道如何解决此问题。

我尝试直接列出它们:FOR %%G IN (*.one,*.mht,*.onepkg)。我尝试使用引号:FOR %%G IN ("*.one","*.mht","*.onepkg")。我试过了插入符号:FOR %%G IN (^^*.one,^^*.mht,^^*.onepkg)

这是我的代码:

set outputfilepath=d:\output.txt

FOR %%G IN ("*.one","*.mht","*.onepkg") DO (
echo Searching for %%G files
dir "C:\%%G" /s /b >> "%outputfilepath%"
Rem Add 2 blank lines between next search
echo. >> "%outputfilepath%"
echo. >> "%outputfilepath%" )

没有任何输出到我的文本文件。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

@ECHO Off
SETLOCAL
set "outputfilepath=u:\output.txt"

(
FOR %%G IN (one,mht,onepkg) DO (
 echo Searching for %%G files>con
 dir ".\*.%%G" /s /b |FINDSTR /i /e /L ".%%G"
 Rem Add 2 blank lines between next search
 echo. 
 echo.  
)
)> "%outputfilepath%"

GOTO :EOF

请注意,我已经更改了驱动器名称以适合我的系统。

只需扩展列表中的meta ,然后在*命令中添加dir。使用dir过滤findstr输出,以确保仅显示与文字/e结尾/L末尾的".%%G"匹配的名称。

也可以通过将enitre for命令括在括号中,将所有stdout文本(通常会出现在控制台上)发送到文件。 >自然意味着重新创建文件。 >>(如果您愿意)进行追加。

附加到>con Searching...的{​​{1}}会覆盖重定向,并专门将文本从该echo发送到控制台。

答案 1 :(得分:0)

我真的很喜欢现有的建议,但这是另一种方法。我发现这种样式更像是代码。

这似乎很复杂 但是 ...

  1. 该技术可用于遍历任何参数,以包括通过命令行传递的参数。
  2. 遍历传递的参数的逻辑被隔离到其自己的函数(enumerate_search_types)。
  3. 将要处理的每个参数的逻辑都隔离到其自己的函数(search_for_search_type)中。

这对于某些人来说可能更容易,而对于另一些人来说则太复杂了。

@echo off

:: The parameters we are working with...
set outputfilepath=d:\output.txt
set starting_path=c:\
set search_types="*.one" "*.mht" "*.onepkg"

pushd "%starting_path%"
call :enumerate_search_types %search_types%
popd
goto :EOF

:: ---------------------------------------------------------------
:enumerate_search_types
set "current_param=%~1"
if "%current_param%"=="" goto :EOF
call :search_for_search_type "%current_param%"
shift /1
goto :enumerate_search_types

:: ---------------------------------------------------------------
:search_for_search_type
set "current_search_type=%1"
set "had_output=false"

echo Searching for %current_search_type% files
for /f "delims=" %%f in ('dir /s /b %current_search_type% 2^>NUL') do set had_output=true&& echo %%f >> "%outputfilepath%"

:: If the dir command didn't produce anything, don't add the blank lines
if "false"=="%had_output%" goto :EOF
echo. >> "%outputfilepath%"
echo. >> "%outputfilepath%"
goto :EOF

答案 2 :(得分:0)

如果仅引用文件扩展名,则简短回答。 为了在for循环中使用其他扩展名:

FOR %%G IN (one,mht,onepkg) do [command]