我在一个文件夹中有一堆文件,它们的名称类似于 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)
你能看到我做错了什么吗?提前感谢您的帮助。
我在一个文件夹中有一堆文件,它们的名称类似于 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)
你能看到我做错了什么吗?提前感谢您的帮助。
您做错的是所有以 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)
(在使您的代码更高效方面,还要听取其他答案。)
你可以在一行中做到这一点
dir /a-d "C:\Users\xyz\desktop\Project\a.*" | find /C "/"
面对一个类似的问题,我更喜欢使用我从 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
你有你的星号在错误的地方。我想你是故意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%
这是一种偷偷摸摸的计算方法:
for /f "tokens=1 usebackq" %a in (`dir a* ^| find ^"File^(s^)^"`) do set count=%a
这可以从命令行完成 - 将批处理文件更改为 double %
有很多转义(使用^
)来阻止以下字符被解释为批处理文件的一部分,而不是传递给命令行
正在执行的命令是dir a* | find "File(s)"
, 但是|
, (
,)
并且"
往往有特殊的含义
@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%