我有以下代码在子目录中搜索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”来尝试实现它但失败了。为什么它不起作用或者有其他更聪明的方法呢?
提前致谢
答案 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!,