递归目录搜索循环

马特·G

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

-递归地遍历输入子目录的路径

-对于与模式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根路径,并且不需要path变量周围的双百分数。就像是:

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在开发过程中,我还会在脚本中使用它,并且通常在以后将其取出。这与@在每个命令上使用符号前缀相关联,这使我可以通过删除一些选择来获取针孔诊断,而不必在关闭回声的情况下浏览整个有价值的脚本。另外,避免在脚本中打开/关闭回显,使它们与其他脚本的组合更容易些,并且修改用户环境的风险较小。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章