递归目录搜索循环

时间:2018-01-29 22:28:22

标签: batch-file for-loop recursion piping

我对批处理脚本很缺乏经验,但我需要做以下事情:

- 递归循环通过输入到子目录的路径

- 对于匹配模式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

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

3 个答案:

答案 0 :(得分:2)

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 on / off使得它们更容易与其他脚本组合,并且修改用户环境的风险更小。

答案 1 :(得分:2)

这是另一个将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 /?,{{1} },For /?Where /?。根据您的目标,您的问题不明确,您可能还想阅读Pause /?Start /?的输出。

答案 2 :(得分:-1)

for /r %A in (c:\windows\win.ini c:\windows\system.ini) Do echo %A

CMD完全有能力在没有您帮助的情况下查找文件。请谨慎使用%%A和交互式%A

你做错了是你的IF正在将文件名与用单引号括起来的名称进行比较。那永远不会匹配。

相关问题