2

我在一个文件夹中有一堆文件,它们的名称类似于 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) 

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

4

6 回答 6

2

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

您正在使用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)

(在使您的代码更高效方面,还要听取其他答案。)

于 2012-08-13T00:43:07.703 回答
2

你可以在一行中做到这一点

dir /a-d "C:\Users\xyz\desktop\Project\a.*" | find /C "/"
于 2013-10-20T02:00:29.097 回答
1

面对一个类似的问题,我更喜欢使用我从 Raymond Chen 那里学到的一个技巧,用来find替代wc -l.

因此,以下脚本将批处理变量设置为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
于 2012-08-13T00:25:42.570 回答
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%
于 2012-08-13T00:44:56.253 回答
0

这是一种偷偷摸摸的计算方法:

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

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

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

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

于 2012-08-13T15:41:13.077 回答
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%
于 2013-10-19T11:23:51.933 回答