递归目录搜索循环



我对批处理脚本缺乏经验,但我需要执行以下操作:

-递归地循环将路径输入到子目录中

-对于与模式 cls.py 和 ins.py 匹配的文件,执行命令

-通过管道将所有输出传输到文本文件。

首先,我创建了一个批处理文件来尝试显示匹配的文件名。但是,在执行时,它只是多次回显if语句。

set /p searchdir=Enter Path:
FOR /r %%f in (%%searchdir%%) do (
IF %%~nxf =='ins.py' echo %%~p1
IF %%~nxf =='cls.py' echo %%~p1
)
pause

我做错了什么?我敢肯定这是愚蠢的,建设性是欢迎批评来帮助我的学习。

set /p path=Enter Path:

PATH是一个重要的系统环境变量,除非您真正知道自己在做什么,否则您通常不希望在脚本文件中覆盖它。 您有时可能想要修改它,但这里的情况并非如此。

FOR /r %%f in (%%path%%) do (

通常,您会遵循根路径的/r,并且不需要路径变量周围的双百分比。 像这样:

for /r "%_rootPath%" %%f in (*.py) do @echo %%f

但即使这样也不是你想要的。 你的 if 语句真的搞砸了:

IF %%~nxf =='ins.py' echo %%~p1
IF %%~nxf =='cls.py' echo %%~p1

无论 %%~nxf 扩展到什么,由于引号不匹配,都不可能与比较的右侧匹配。 无论如何,整个事情效率低下,因为您遍历每个目录的所有文件以查找匹配项。

一种方法是遍历您要查找的文件,然后让 dir 命令查找它们所在的所有目录:

@setlocal ENABLEEXTENSIONS
@rem @set prompt=$G
@rem Space delimited list of scripts to run, listed in execution order.
@set _scriptsToRun=ins.py cls.py
@set _root=
@set /p _root=Enter Path:
@if not defined _root @set _root=%CD%
@if not exist %_root% @goto :BadPath
@for %%A in (%_scriptsToRun%) do @call :FindAndExecuteThem "%_root%" "%%A"
@exit /b 0
:BadPath
@set _PATH_NOT_FOUND=3
@echo Path not found: %_root%
@exit /b %_PATH_NOT_FOUND%
:FindAndExecuteThem
@rem @echo %%1==%1
@rem @echo %%2==%2
@for /f %%A in ('dir /b /s "%~1%2"') do @call :RunIt "%%A"
@rem @for /f %%A in ('where /r %~1 "%2"') do @call :RunIt "%%A"
@exit /b 0
:RunIt
rem @call python.exe %1
rem @call %1
rem @start python.exe %1

请注意,上面的代码避免使用多行代码块。 使调试工作时的工作更轻松。 此外,您可能需要指向正确版本的 python 可执行文件的路径。 您可以在某些系统上运行start script.py,但这假设扩展已映射到 python.exe 文件。但是你可以只调用python.exe并跳过额外的进程启动。

请注意,我采用了一种约定,即脚本局部变量应始终具有前导下划线。 这样,当脚本在开发过程中由于我犯的一些错误或误用而死亡时,查找并删除所有以下划线开头的变量就很简单了。 我还在开发过程中在脚本中使用set prompt=$g,通常在以后将其取出。这与在每个命令上使用@符号前缀有关,这使我可以通过删除其中的几个来获取针孔诊断,而不必在关闭回声的情况下浏览整个脚本。 此外,避免在脚本中开/关回显使它们更容易与其他脚本一起编写,并且修改用户环境的风险较小。

这是另一个示例,它只是将其结果echo到输出文件中。

@Echo Off
:Ask4Dir
Set "searchDir="
Set /P "searchDir=Enter directory to start in [%CD%]: "
If Not Defined searchDir Set "searchDir=."
CD /D "%searchDir%" 2>Nul || GoTo Ask4Dir
For /F "Delims=" %%A In ('"Where /R . "ins.py" "cls.py" 2>Nul"'
) Do Echo %%~nxA was found in %%~dpA>>"output.txt"
Pause

请结合在命令提示下输入的以下命令中的信息进行研究:Echo /?Set /?If /?CD /?For /?Where /?Pause /?。根据您的目标(从您的问题中不清楚),您可能还想阅读Start /?Call /?的输出。

for /r %A in (c:windowswin.ini c:windowssystem.ini) Do echo %A

CMD完全能够在没有您帮助的情况下查找文件。批量记住%%A并以交互方式%A

你做错的是你的IF将文件名与用单引号括起来的名称进行比较。这是永远无法匹配的。

最新更新