使用批处理来计算文件夹中特定文件的数量

时间:2012-08-12 23:54:04

标签: batch-file

我在一个文件夹中有一堆文件,它们的名字就像a1.txt,a6.txt,a8.txt,..我需要计算它们我试过这个批处理文件,但它不能识别*作为一个如何计算所有数字并且不会返回正确的答案。

set /a count=0
for /F "tokens=* delims= " %%i in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a.*"') do (set /a count=count+1) 

你能看出我做错了什么吗?感谢您的帮助。

6 个答案:

答案 0 :(得分:2)

你所做错的是所有以。开头的文件的通配符。

您正在使用dir a.*并希望它能够找到a6.txt

等文件

另外,要处理带空格的文件名,我建议你删除分隔符。

set /a count=0
for /F "delims=" %%i in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a*"') do (set /a count=count+1)

(还要听取其他答案,以提高您的代码效率。)

答案 1 :(得分:2)

您可以在一行中执行此操作

dir /a-d "C:\Users\xyz\desktop\Project\a.*" | find /C "/"

答案 2 :(得分:1)

面对一个类似的问题,我更喜欢使用我从Raymond Chen那里学到的技巧,而不是use find as a replacement for wc -l

因此,以下scrit将批处理变量count设置为与patttern匹配的文件数。与原始脚本一样,目录也会从计数中排除。

@echo off

setlocal

set count=0
set pattern=a?.txt

use dir /b %pattern% ^| find /c /v ""

for /f %%i in ('dir /b /a-d %pattern_you_are_looking_for% ^| find /c /v ""') do @call set count=%%i

echo %count%

endlocal

答案 3 :(得分:1)

你的星号在错误的地方。我认为你打算a*.txt。但这将匹配任何名称以“a”开头的文本文件。它不会将结果限制为以“a”开头的文本文件,后跟数字。

您可以将DIR命令的结果传递给FINDSTR,并使用正则表达式更具体。 FINDSTR正则表达式支持是原始的,但它通常可以完成工作。

我假设您要匹配“a1.txt”,“a143.txt”等名称,但您不希望匹配“a1b.txt”或“aba1.txt”等文件。如果我错了,那么你需要更改正则表达式以符合你的要求。

此正则表达式\\a[0-9][0-9]*\.txt$的工作原理如下:

  • \\是一个转义反斜杠,匹配文件名前的最后一个反斜杠
  • a当然匹配
  • [0-9]匹配单个数字(必须至少有1个)
  • [0-9]*匹配0个或更多其他数字
  • \.txt$转义点并匹配“.txt”扩展名。 $匹配字符串的结尾 - 如果跟随其他字符,它将不匹配。

最后要做的是将FINDSTR的结果传递给FIND,让它为你计算文件数。 FIND /C /V ""匹配任何行,/ C选项给出匹配行的计数。它比在循环中递增计数器更有效。

@echo off
setlocal
set /a count=0
for /F %%N in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a*.txt"^|findstr /ric:"\\a[0-9][0-9]*\.txt$"^|find /c /v ""') do set count=%%N
echo count=%count%

答案 4 :(得分:0)

这里有一点偷偷摸摸的计算方法:

for /f "tokens=1 usebackq" %a in (`dir a* ^| find ^"File^(s^)^"`) do set count=%a

这可以从命令行完成 - 对批处理文件更改为double%

有很多转义(使用^)来阻止以下字符被解释为批处理文件的一部分,而不是传递给命令行

正在执行的命令是dir a* | find "File(s)",但|()"往往具有特殊含义

答案 5 :(得分:0)

@SetLocal enabledelayedexpansion
@for /F "tokens=1" %%a IN ('Dir "..\*.txt" /-C/S/A:-D') Do @Set number_of_files=!n2! & Set n2=%%a
@echo %number_of_files%