批处理findtr到子文件夹的某个深度

时间:2014-05-13 22:23:51

标签: batch-file

我有以下代码在子目录中搜索2个exe文件:

@echo off & setLocal EnableDELAYedeXpansion
for %%d in (c) do if exist %%d: (
for /f "delims=" %%a in ('dir/b/s/x %%d:\autolog.exe %%d:\autorun.exe 2^>nul ^| findstr /V /C:".*\.*\.*\.*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\.*\.*" /C:".*\.*\.*\.*\*"') do (
set var=%%a;!var!
))
echo %1,!var!, >>C:\test.txt
exit

虽然它可以搜索所有子文件夹(通过使用/ s),但我希望只有在 4 子文件夹级别内才能返回结果(例如c:\ sf1 \ sf2 \ sf3 \ autorun.exe应该是一个有效的结果,而c:\ sf1 \ sf2 \ sf3 \ sf4 \ autorun.exe和树下的任何发现都应该选择退出而不返回结果)。

我使用所有通配符组合(* |。|。*)和“\ V”来尝试实现它但失败了。为什么它不起作用或者有其他更聪明的方法呢?

提前致谢

2 个答案:

答案 0 :(得分:1)

Heres是一个限制到第四个文件夹级别的示例,使用findstr术语中的正则表达式:

@echo off
for /f "delims=" %%a in ('dir /ad /b /s ^| findstr \\.*\\.*\\.*\\ ^| findstr /v \\.*\\.*\\.*\\.*\\') do echo %%a
pause

答案 1 :(得分:1)

我受到this答案的启发。 ROBOCOPY自Vista开始提供,它是一个强大的实用程序,除复制文件外,还提供更多功能。
例如/L开关可防止复制;而/LEV仅允许您复制前N个根级别,从而消除了一个FINDSTR

打高尔夫球

@echo off
SETLOCAL EnableDelayedExpansion

FOR /F "tokens=*" %%F in ('
ROBOCOPY "C:\." "C:\." autolog.exe autorun.exe /S /LEV:4 /IS /L /NS /NC /NDL /NJH /NJS^|FINDSTR \\.*\\.*\\.*\\
') do set "var=%%~fF;!var!"
echo %1,!var!,>>C:\test.txt

格式化

@echo off
====SETLOCAL EnableDelayedExpansion EnableExtensions


set "list="
set ^"FORCMD=^
 %__APPDIR__%ROBOCOPY.EXE C:\. C:\. autolog.exe autorun.exe^
     /S %=non-empty Subdirectories=%^
 /LEV:4 %=MAX 4 LEVels=%^
    /IS %=Include Same files=%^
     /L %=List only (don't copy)=%^
    /NS %=No Size=%^
    /NC %=No Class=%^
   /NDL %=No Directory List=%^
   /NJH %=No Job Header=%^
   /NJS %=No Job Summary=%^
|%__APPDIR__%FINDSTR.EXE \\.*\\.*\\.*\\%=MIN 4 LEVels=%" It's convenient to use delayed expansion


FOR /F "tokens=*" %%F in ('!FORCMD!') do set "var=%%~fF;!var!"
::Due to weird expansion rules
::if VAR was undefined, it is set to '~,-1'
if DEFINED var set "var=!var:~,-1!" Remove trailing ;


>>"C:\test.txt" echo(%1,!var!,