我对批处理脚本缺乏经验,但是我需要执行以下操作:
-递归地遍历输入子目录的路径
-对于与模式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] 删除。
我来说两句