Alex
Alex

Reputation: 1642

batch findstr to certain depth of subfolders

I had the below code for searching through sub directories for 2 exe files:

@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

While it works search for all subfolder (by using /s), I would like to have result returns only if it is within 4 subfolder level (e.g. c:\sf1\sf2\sf3\autorun.exe should be a valid result, while c:\sf1\sf2\sf3\sf4\autorun.exe and any finding further down the tree should be opt out and not returning as a result).

I use all wildcard combination (* | .| .*) along with "\V" in attempt to achieve it but failed. Why does it won't work or if there are other smarter way doing it?

Thanks in advance

Upvotes: 1

Views: 355

Answers (2)

ScriptKidd
ScriptKidd

Reputation: 841

I was inspired by this answer. ROBOCOPY is available since Vista, and it is a robust utility that does more than copying files.
e.g. The /L switch prevents it from copying; while /LEV allows you to copy only the top N levels of root, which eliminates one FINDSTR.

Golfed

@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

Formatted

@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!,

Upvotes: 1

foxidrive
foxidrive

Reputation: 41234

Heres is a sample to limit to fourth folder level, using regular expressions in the findstr terms:

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

Upvotes: 3

Related Questions