我在一个文件夹中有一堆文件,它们的名字就像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)
你能看出我做错了什么吗?感谢您的帮助。
答案 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%