38

我对此很陌生。请帮我

我正在尝试编写一个批处理文件程序来计算文件夹中的文件数并将其分配给一个变量并显示它以验证它是否已存储请帮助我使用语法,

提前谢谢你-VK

4

10 回答 10

60

我将假设您不想计算隐藏文件或系统文件。

有很多方法可以做到这一点。我将展示的所有方法都涉及某种形式的 FOR 命令。FOR 命令有许多看起来几乎相同的变体,但它们的行为却大不相同。初学者可能会感到困惑。

您可以通过键入HELP FORFOR /?从命令行获得帮助。但是,如果您不习惯阅读它,那么这种帮助就有点神秘了。

1) DIR 命令列出目录中的文件数。您可以将 DIR 的结果通过管道传输到 FIND 以获取相关行,然后使用 FOR /F 从该行解析所需的值。这种技术的问题是您搜索的字符串必须根据操作系统使用的语言而改变。

@echo off
for /f %%A in ('dir ^| find "File(s)"') do set cnt=%%A
echo File count = %cnt%

2)您可以使用DIR /B /A-D-H-S列出没有其他信息的非隐藏/非系统文件,将结果传递给 FIND 以计算文件数,并使用 FOR /F 读取结果。

@echo off
for /f %%A in ('dir /a-d-s-h /b ^| find /v /c ""') do set cnt=%%A
echo File count = %cnt%

3)您可以使用简单的 FOR 枚举所有文件,并使用 SET /A 为找到的每个文件增加一个计数器。

@echo off
set cnt=0
for %%A in (*) do set /a cnt+=1
echo File count = %cnt%
于 2012-06-12T21:41:43.960 回答
13
@echo off
setlocal enableextensions
set count=0
for %%x in (*.txt) do set /a count+=1
echo %count%
endlocal
pause

这是最好的....您的变量是: %count%

注意:您可以将 ( *.txt) 更改为任何其他文件扩展名以计算其他文件.....

于 2015-04-02T20:42:31.567 回答
8

mugume david 回答在空文件夹上失败;查找模式而不是所有文件时,计数为 1 而不是 0。例如 *.xml

这对我有用:

attrib.exe /s ./*.xml | find /v "File not found - " | find /c /v ""

于 2014-04-15T15:40:23.687 回答
7

计算文件夹%FOLDER%及其子文件夹中具有 ANY 属性的文件的最快代码如下。该代码用于命令脚本(批处理)文件中的脚本。

@for /f %%a in ('2^>nul dir "%FOLDER%" /a-d/b/-o/-p/s^|find /v /c ""') do set n=%%a
@echo Total files: %n%.
于 2016-10-25T03:08:22.157 回答
6

这可能会快一点:

dir /A:-D /B *.* 2>nul | find /c /v ""
`/A:-D` - filters out only non directory items (files)
`/B`    - prints only file names (no need a full path request)
`*.*`   - can filters out specific file names (currently - all)
`2>nul` - suppresses all error lines output to does not count them
于 2020-01-11T08:58:52.900 回答
2

切换到目录和;

attrib.exe /s ./*.* |find /c /v ""

编辑

我认为这很容易发现。利用

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "batchfile.bat";
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();

我运行这个并且变量output持有这个

D:\VSS\USSD V3.0\WTU.USSD\USSDConsole\bin\Debug>attrib.exe /s ./*.*   | find /c /v "" 13

其中 13 是文件数。它应该可以解决问题

于 2013-03-18T19:50:20.700 回答
1

for /F "tokens=1" %a in ('dir ^| findstr "File(s)"') do echo %a

结果:

C:\MyDir> for /F "tokens=1" %a in ('dir ^| findstr "File(s)"') do @set FILE_COUNT=%a

C:\MyDir> echo %FILE_COUNT%
4   // <== There's your answer
于 2015-04-02T20:52:28.913 回答
1

我过去曾使用过一个临时文件来执行此操作,如下所示。

DIR /B *.DAT | FIND.EXE /C /V "" > COUNT.TXT

FOR /F "tokens=1" %%f IN (COUNT.TXT) DO (
IF NOT %%f==6 SET _MSG=File count is %%f, and 6 were expected. & DEL COUNT.TXT & ECHO #### ERROR - FILE COUNT WAS %%f AND 6 WERE EXPECTED. #### >> %_LOGFILE% & GOTO SENDMAIL
)
于 2015-09-13T22:09:45.690 回答
1
FOR /f "delims=" %%i IN ('attrib.exe ./*.* ^| find /v "File not found - " ^| find /c /v ""') DO SET myVar=%%i
ECHO %myVar%

这是基于(很多)较早的帖子指出,如果您使用 DIR 而不是 attrib.exe,则空目录的计数将是错误的。

对于在将命令放入 FOR 循环的语法上遇到困难的其他人,请将命令用单引号括起来(假设它不包含它们)并用 ^ 转义管道。

于 2015-09-07T09:20:41.733 回答
1

有一个for循环:

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i
echo %count%

没有/避免for循环:

(dir /b /a-d ^| find /v /c "?") | (set /p myVar=& cmd /c exit /b %myVar%)
set count=%errorlevel%
echo %count%

在 Win 10 cmd 中测试

于 2021-09-17T20:37:03.550 回答