我对此很陌生。请帮助我
我试图编写一个批处理文件程序来计算文件夹中的文件数量并将其分配给变量并显示它以验证它是否已存储 请帮我解决语法问题,
提前谢谢你 -VK
我假设您不想计算隐藏文件或系统文件。
有很多方法可以做到这一点。我将展示的所有方法都涉及某种形式的 FOR 命令。 FOR 命令有许多看起来几乎相同的变体,但它们的行为却截然不同。对于初学者来说可能会感到困惑。
您可以通过从命令行输入
HELP FOR
或 FOR /?
来获取帮助。但如果您不习惯阅读该帮助,那么它会有点神秘。
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%
@echo off
setlocal enableextensions
set count=0
for %%x in (*.txt) do set /a count+=1
echo %count%
endlocal
pause
这是最好的......你的变量是:
%count%
注意:您可以将 (
*.txt
) 更改为任何其他文件扩展名来计算其他文件.....
这可能会快一点:
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
要构建
for
声明,您首先应该了解一些细节。
for /F %%i in ('dir /A:-D /B *.* 2^>nul ^| find /c /v ""') do set "COUNT=%%i"
上面的示例可以工作,但如果您想将其复制粘贴到另一个 for 表达式中 - 可能不行。
默认情况下,
for /F ...
表达式使用;
字符作为EOL字符,使用空格+制表符作为行分隔符。
如果您使用文件路径作为 for-表达式中的输入,则可以覆盖这些字符:
for /F "delims="eol^= %%i in (";My file path") do echo.Value: %%i
结尾
eol^=
删除了 EOL 字符搜索。
此处避免的另一个问题是始终在 for 表达式之前重置要使用的变量,以防 for 表达式未执行:
set FILE=undefined
for /F %%i in (";My file path") do set "FILE=%%i"
echo.FILE=%FILE%
mugume david 答案在空文件夹上失败;当查找模式而不是所有文件时,计数为 1 而不是 0。例如*.xml
这对我有用:
attrib.exe /s ./*.xml | find /v "File not found - " | find /c /v ""
计算文件夹
%FOLDER%
及其子文件夹中具有任何属性的文件的最快代码如下。该代码用于命令脚本(批处理)文件中的脚本。
@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%.
更改目录并;
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 是文件计数。应该可以解决问题
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
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 循环的语法感到困惑的人,请将命令用单引号引起来(假设它不包含单引号)并使用 ^ 转义管道。
我过去曾使用临时文件来执行此操作,如下所示。
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
)
带有
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 中测试
directoryToCount
设置为相应的目录SET directoryToCount=C:\Users\
dir %directoryToCount% > contentsOfDir.txt
echo cat contentsOfDir.txt ^| grep File > countFiles.sh
sh countFiles.sh
del countFiles.sh
del contentsOfDir.txt
bash
和 batch
环境中,可以使用 >
运算符将命令的输出重定向到文件。
echo hello world > myFile.txt
将生成一个名为 myFile.txt
的文件,其中文本为 hello world
。bash
环境中,可以 cat
文件的内容以及 grep
文件中包含指定模式的特定行。
cat myFile.txt | grep hello
将返回包含hello
sh
来访问类似 Linux 的环境。dir
获取目录下的文件列表,以及文件数量dir
的输出重定向到文件(可能名为 contentsOfDir.txt
)。.sh
为
grep
创建一个
File
文件到
contentsOfDir.txt
.sh
文件以调用 grep
.sh
文件contentsOfDir.txt