递归目录搜索循环
Recursive directory search loop
我对批处理脚本非常缺乏经验,但我需要执行以下操作:
-递归循环输入到子目录的路径
-对于匹配模式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
我做错了什么?我敢肯定这是愚蠢的,欢迎批评以帮助我学习。
for /r %A in (c:\windows\win.ini c:\windows\system.ini) Do echo %A
CMD 完全可以在没有您帮助的情况下查找文件。批量记住 %%A
,交互记住 %A
。
你做错的是你的 IF
正在比较一个文件名和一个用单引号括起来的名字。那永远不会匹配。
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
并且通常稍后将其删除。这与在每个命令上使用 @
符号前缀相关联,这使我可以通过删除其中的 select 来获得针孔诊断,而不必费力地完成整个脚本关闭回声的喷出。此外,避免在脚本中使用 echo on/off 使它们更容易与其他脚本组合,并且修改用户环境的风险更小。
这是另一个示例,它只是 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 /?
的输出。
我对批处理脚本非常缺乏经验,但我需要执行以下操作:
-递归循环输入到子目录的路径
-对于匹配模式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
我做错了什么?我敢肯定这是愚蠢的,欢迎批评以帮助我学习。
for /r %A in (c:\windows\win.ini c:\windows\system.ini) Do echo %A
CMD 完全可以在没有您帮助的情况下查找文件。批量记住 %%A
,交互记住 %A
。
你做错的是你的 IF
正在比较一个文件名和一个用单引号括起来的名字。那永远不会匹配。
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
并且通常稍后将其删除。这与在每个命令上使用 @
符号前缀相关联,这使我可以通过删除其中的 select 来获得针孔诊断,而不必费力地完成整个脚本关闭回声的喷出。此外,避免在脚本中使用 echo on/off 使它们更容易与其他脚本组合,并且修改用户环境的风险更小。
这是另一个示例,它只是 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 /?
的输出。