Batch file 对所有文件进行批计数,但不包括特定文件夹中的文件

Batch file 对所有文件进行批计数,但不包括特定文件夹中的文件,batch-file,Batch File,因此,我将计算一个目录中的文件,包括所有子文件夹,并得到一个输出,即它在该目录中找到了多少文件。问题是我想排除所有名为error的文件夹。我不想统计那个文件夹中的那些文件 简单地… 在folderA下,有很多我正在计算的子文件夹,但也有我不想计算的“错误”文件夹 所以我正在尝试以下… 创建一个名为exclude.txt的临时文件,并在该文件中键入error if not exist "c:\temp" mkdir "c:\temp" 2>nul if not exist c:\temp\e

因此,我将计算一个目录中的文件,包括所有子文件夹,并得到一个输出,即它在该目录中找到了多少文件。问题是我想排除所有名为
error
的文件夹。我不想统计那个文件夹中的那些文件

简单地…

在folderA下,有很多我正在计算的子文件夹,但也有我不想计算的“错误”文件夹

所以我正在尝试以下…

创建一个名为
exclude.txt
的临时文件,并在该文件中键入
error

if not exist "c:\temp" mkdir "c:\temp" 2>nul
if not exist c:\temp\exclude mkdir c:\temp\exclude 2>nul
echo error> %excludefolder%\exclude.txt
现在我想以某种方式将其结合起来。基本上是这样做的

for /r "\\server\share\folderA" %%G in (*.*) EXCLUDE: c:\temp\exclude\exclude.txt do (
set /A count=count + 1
)    

但我知道这是行不通的,我也不知道如何解决。有人知道吗?谢谢

您可以从计数中排除包含字符串“error”的文件夹:


如果您确定只有一个错误文件夹,那么这是一个好方法。如果您有另一个包含字符串“error”的文件夹,它也将从计数中排除。

使用
DIR/S/B/A-D
迭代所有文件。输出包括每个文件的完整路径

将结果传送到
FINDSTR/L/I/V“\\error\\
以筛选出包含
\error\
的路径。这还将排除
error
文件夹中的任何文件夹。可以修改搜索以仅排除“error”,但包括“error”的子文件夹

通过管道将结果传输到
查找/C/V”“
以计算文件数(行)

以上仅显示计数

如果要捕获变量中的计数,请使用FOR/F来解析上述命令的输出。在FOR/F中使用时,像
|
这样的未加引号的有毒字符必须转义

@echo off
for /f %%N in ('dir /s /b /a-d^|findstr /liv "\\error\\"^|find /c /v ""') do set count=%%N
echo count=%count%

感谢@dbenham给出了一个很好的答案。这似乎可以完成任务。为了记录在案,我可以通过使用此设置排除更多文件夹吗?例如,如果我可以添加
“\\error\\\ \ \ \\anotherfolder\\“
/liv
之后?@madsheman-几乎就是这样。您可以将所有排除文件夹放在一个字符串中,用空格分隔:
findstr/liv“\\error\\\\anotherFolder\\\”
。如果文件夹名称中包含空格,则需要多个\C:string选项:
findstr/iv/C:\\错误\\\\\\/C:\\另一个文件夹\\\\”
。使用
help-findstr
findstr/?
阅读内置帮助。此外,您可能有兴趣阅读关于未记录功能的文章,感谢您的输入,非常好。还有这个链接-黄金价值。谢谢你的输入。在较小的文件夹上工作很有魅力,但当我在一个包含10k+文件的文件夹中尝试时,速度非常慢。我不知道为什么,但我确实学到了一些东西。再次感谢!这种方法很慢,因为:1。它使用的管道需要运行两个
cmd.exe
(一个400 KB大小的文件)副本,管道两侧各有一个副本。2.它还运行
find.exe
,这是一个16 KB大小的文件。主要原因是:。它对每个文件名执行前面的步骤一次!更快的方法是只使用内部命令检查名称是否包含搜索词:
set“name=%%~Pa”&if“!name:error=!“eq”%%~Pa”set/A count+=1
。如果要测试此方法,请不要忘记在程序开头包含
setlocal EnableDelayedExpansion
行。@aacini谢谢您的解释,我需要它。我将测试它,看看它是如何工作的。:)
@echo off
set count=0

for /r "\\server\share\folderA" %%a in (*.*) do (
  echo %%~pa | find /i "error" || set /A count+=1
)    
echo %count%
dir /s /b /a-d | findstr /liv "\\error\\" | find /c /v ""
@echo off
for /f %%N in ('dir /s /b /a-d^|findstr /liv "\\error\\"^|find /c /v ""') do set count=%%N
echo count=%count%