Cmd 通过批处理脚本构建目录列表。需要排除一些目录。怎样

Cmd 通过批处理脚本构建目录列表。需要排除一些目录。怎样,cmd,dir,Cmd,Dir,我处理数十万个文件夹/文件,其中大多数都有特定的日志文件。手动浏览文件夹以获取日志需要很多时间,因此我一直在使用脚本来完成这项工作 它有两个部分。第一部分通宵运行以解析所有目录(它们每天都在更改,并且经常添加新日志,所以我每晚都索引所有内容以保持索引的最新状态) 第一部分是自动的,我从不碰它,它只是每晚运行。输出转到一个txt文件,在执行第二个脚本时使用该文件 第二个脚本是我输入我要查找的日志的关键字的地方。此脚本依赖于第一个脚本的txt输出来快速定位文件并将其下拉 (我这样做的原因是,解析30

我处理数十万个文件夹/文件,其中大多数都有特定的日志文件。手动浏览文件夹以获取日志需要很多时间,因此我一直在使用脚本来完成这项工作

它有两个部分。第一部分通宵运行以解析所有目录(它们每天都在更改,并且经常添加新日志,所以我每晚都索引所有内容以保持索引的最新状态)

第一部分是自动的,我从不碰它,它只是每晚运行。输出转到一个txt文件,在执行第二个脚本时使用该文件

第二个脚本是我输入我要查找的日志的关键字的地方。此脚本依赖于第一个脚本的txt输出来快速定位文件并将其下拉

(我这样做的原因是,解析300000行文本文件查找文件需要5秒的时间,搜索(索引所有网络共享)需要15-30分钟。这样,我可以在5秒内获得日志,而不是30分钟以上)

上周之前,日志目录由大约5000个文件和文件夹组成。上周末,它切换到了一个新系统,现在它由超过500000个文件和文件夹组成。他们扔掉了档案,还有一堆我不需要的文件

第一个脚本用于在大约10-15分钟内对其进行索引(它是一个网络共享,实际上是4个网络共享),一夜之间没有问题。而现在这是一个4个多小时的壮举。我需要能够在索引期间排除某些目录,从而将500000个文件/文件夹的计数减少到5000以下

我一直在使用这个命令索引:

dir /b /-d /-p /s /A:-D > C:\output.txt
我需要让索引跳过任何包含单词“Common”或“Old”的目录,也可能跳过其他目录。目标是通过根本不进入这些目录来节省时间

我试着调查PowerShell来做这件事,但我对此一无所知

我需要输出为以下格式:

C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\dbInstaller.exe
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\DisplayDriver.nvi
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\DisplayDriverExt.dll
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\license.txt
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\mcu.ex_
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\nvae.inf
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\nvak.inf
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\nvapi.dl_
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\nvapi64.dl_
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\nvcompiler.dl_
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\nvcompiler32.dl_
C:\NVIDIA\DisplayDriver\GeForce332.21Driver\Display.Driver\nvcplsetupeng.exe
谢谢

@ECHO关闭
SETLOCAL
设置“sourcedir=”
(
对于/f“delims=”%%a IN(
'dir/b/s/ad”%sourcedir%\*“^ findstr/v/i/l/g:q22903564.txt'
)DO(对于/f“delims=“%%b IN('dir/b/a-d“%%a”2^>nul”)DO ECHO(%%a\%%b
)
)>newfile.txt
后藤:EOF
我使用了一个名为
q22903564.txt
的文件,其中包含用于测试的排除词。 生成newfile.txt

当然,您可以选择
sourcedir
q2293564.txt
newfile.txt

@ECHO关闭
SETLOCAL
::制作一个临时文件
:maketemp
设置“tempfile=%temp%\%random%”
如果存在“%tempfile%*”(转到maketemp)ELSE(ECHO.>%tempfile%a)
设置“sourcedir=”
::从根目录获取目录列表
(
对于/f“delims=”%%a IN(
'dir/b/ad”%sourcedir%\*“^ findstr/v/i/l/g:q22903564.txt'
)DO(回声(“%%~fa”)
)>%tempfile%b
:再一次
(
对于/f“usebackqdelims=“(%tempfile%b”)中的%%a,请执行以下操作(
对于/f“delims=”%%b IN(
'dir/b/ad“%%~a\*”^ | findstr/v/i/l/g:q22903564.txt'
)DO FOR/f“delims=“%%c IN('ECHO(%%a\%%b)^ findstr/x/v/i/l/g:“%tempfile%b”)DO ECHO“%%~c”
)
)>%tempfile%c
对于(“%tempfile%c”)中的%%a,请设置/a sizec=%%~za
如果%sizec%gtr 0键入“%tempfile%c”>>“%tempfile%b”&再次转到
(
对于/f“usebackqdelims=“(%tempfile%b”)中的%%a,请执行以下操作(
对于/f“delims=”%%b IN(
“dir/b/a-d”%%~a\*“2^>nul”
)做回显(%%~a\%%b)
)
)>newfile.txt
删除“%tempfile%*”
后藤:eof
嗯,根据一些人的说法,做不可能的事情需要额外收费


@ECHO关闭
SETLOCAL
::制作一个临时文件
:maketemp
设置“tempfile=%temp%\%random%”
如果存在“%tempfile%*”(转到maketemp)ELSE(ECHO.>%tempfile%a)
设置“sourcedir=”
::从根目录获取目录列表
(
对于/f“delims=”%%a IN(
'dir/b/ad”%sourcedir%\*“^ findstr/v/i/l/g:q22903564.txt'
)DO(回声(“%%~fa”)
)>%tempfile%b
设置/a sizec=0
:再一次
设置“skipnt=usebackq”
如果%sizec%gtr 0(
对于('type”%tempfile%b“^ | find/c/v“')中的/f%%a,请设置“skipnt=usebackqskip=%a”
键入“%tempfile%c”>>%tempfile%b
)
(
对于/f“%skipnt%delims=”(“%tempfile%b”)中的%%a,请执行以下操作(
对于/f“delims=”%%b IN(
'dir/b/ad“%%~a\*”^ | findstr/v/i/l/g:q22903564.txt'
)DO FOR/f“delims=“%%c IN('ECHO(%%a\%%b)^ findstr/x/v/i/l/g:“%tempfile%b”)DO ECHO“%%~c”
)
)>%tempfile%c
对于(“%tempfile%c”)中的%%a,请设置/a sizec=%%~za
如果%sizec%gtr 0再次转到
(
对于/f“usebackqdelims=“(%tempfile%b”)中的%%a,请执行以下操作(
对于/f“delims=”%%b IN(
“dir/b/a-d”%%~a\*“2^>nul”
)做回显(%%~a\%%b)
)
)>newfile.txt
删除“%tempfile%*”
后藤:eof
第三次是一个魅力。这个版本计算出它已经处理了多少行目录,并在重新处理连接的列表b和c时跳过这些行。瞧,它只处理添加的内容

在输入这封信的过程中,我意识到还有一个小小的简化……不过,我得等早茶了


@ECHO关闭
SETLOCAL
::制作一个临时文件
:maketemp
设置“tempfile=%temp%\%random%”
如果存在“%tempfile%*”(转到maketemp)ELSE(ECHO.>%tempfile%a)
设置“sourcedir=”
::从根目录获取目录列表
(
对于/f“delims=”%%a IN(
'dir/b/ad”%sourcedir%\*“^ findstr/v/i/l/g:q22903564.txt'
)DO回声(%)~fa
)>%tempfile%c
设置/a sizec=0
:再一次
设置“skipnt=usebackq”
如果('type”%tempfile%b“^ find/c/v“')中的/f%%a的%sizec%neq 0设置为“skipnt=usebackqskip=%a”
键入“%tempfile%c”>>%tempfile%b
(
对于/f“%skipnt%delims=”(“%tempfile%b”)中的%%a,请执行以下操作(
对于/f“delims=”%%b IN(
'dir/b/ad“%%a\*”^ | findstr/v/i/l/g:q22903564.txt'
)做回显(%%a\%%b)
)
)>%tempfile%c
对于(“%tempfile%c”)中的%%a,请设置/a sizec=%%~za
如果%sizec%gtr 0再次转到
(
对于/f“usebackqdelims=“(%tempfile%b”)中的%%a,请执行以下操作(
对于/f“delims=”%%b IN(
“目录/b/a-d”%%a\*“2^>nul”
)做回显(%%a\%%b)
)
)>newfile.txt
删除“%tempfile%*”
后藤:EOF
这一次是肯定的!(没有狮子吼的想法)

我意识到重新过滤aga
@echo off
dir /b /ad /s /-p > "C:\output.txt"
findstr /v /i "Common Old" "C:\output.txt" >"C:\output2.txt"
del "C:\output.txt"

for /f "usebackq delims=" %%a in ("C:\output2.txt") do (
   pushd "%%a"
      for /f "delims=" %%b in ('dir *.log *.txt /b /-p /a-d') do >>"C:\output.txt" echo(%%a\%%b
   popd
)