虽然不太擅长 dos 脚本,但用起来很顺手,因此我在这里找到了很多解决我遇到的问题的简单方法。所以最近我在这里复制了一个脚本来计算子目录中的文件数量。我稍微修改了一下,以适应我的目的。它现在如下所示,在我编写它的桌面上运行良好:
FOR /D %%D IN ("*") DO (
FOR /F %%K IN ('DIR /A-D "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
ECHO %%D: %%K
)
)
现在奇怪的是:在我的计算机上(编写脚本的那台电脑),输出符合预期,而在其他电脑上,计数器不计数,结果为零(这绝对是错误的)。
所有机器都运行 Windows 7(其中一台运行专业版,另外两台运行高级版和专业版)。
这里发生了什么?我该如何纠正?
谢谢!
答案1
采用同样的方法
@echo off
setlocal enableextensions disabledelayedexpansion
for /d %%a in (*) do for /f "tokens=1,5" %%b in ('
dir /a-d "%%~fa\*" 2^> nul ^| findstr /b /c:" " ^|^| echo 0
') do if "%%c"=="" echo %%~fa : %%b
这会
- 对于每个文件夹(
for /d
)获取一个引用并将其存储在%%a
可替换参数中 dir
使用文件夹的完整路径运行命令%%~fa
- 使用管道 (
|
) 过滤列表以仅检索以两个空格开头的行(页脚行) - 如果没有找到任何行(即
dir
命令失败)则输出 0 - 生成的行由
dir | findstr
命令处理for /f
。我们将读取第一个标记(行中的文件数)和第五个标记(仅出现在包含目录信息的页脚行中) - 如果第五个元素为空,则此行包含有关文件而非文件夹的信息,因此请回显文件夹路径及其内部的文件
这种方法的问题在于,dir | findstr
对每个子文件夹都执行。为了更快的解决方案
robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
这将简单地调用robocopy
,但不会复制任何内容,我们将要求不复制任何内容,仅返回应处理的内容列表 ( /nocopy /l
)。我们要求从当前文件夹复制到当前文件夹,包括处理中的相同文件 ( /is
),处理空子文件夹(/e
,以包含 0 个文件的文件夹),但仅处理两个级别(/lev:2
当前文件夹和下面的文件夹),不生成文件列表 ( /nfl
),没有作业标题 ( /njh
) 也没有作业摘要 ( /njs
)
结果将是相同的列表,但文件夹名称和文件数在更改的列中
保持原始输出格式
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "tokens=1,*" %%a in ('
robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
') do echo %%~fb : %%a
这将使用 来for /f
处理前一个robocopy
命令,将该行拆分为两个标记,第一个标记将包含文件数并将存储在 中%%a
,第二个标记包含该行的其余部分并将存储在 中%%b
。对于内部命令输出中的每一行robocopy
,将执行子句中的代码do
:只需以相反的顺序回显到控制台上的两个标记即可。
答案2
安装或更改Windows 显示语言。您的脚本依赖于语言。例如,dir
命令在捷克 Windows 上显示统计数据,Soubor(ů)
而不是。File(s)
dir |find "Files(s)"
然后设置%ERRORLEVEL%
为1
:
FIND
将设置%ERRORLEVEL%
如下:
0
至少在其中一个文件中找到字符串;1
未找到字符串;2
如果列表中的任何文件不存在或没有文件与通配符掩码匹配,则给出无效开关。
请注意,“文件”是一个有效的文件夹名称;因此,您的脚本可以显示
==>md "File(s)"
==>D:\bat\SU\935171.bat
a b: 3
File(s): Directory
FooBar: 0
FooFoo: 4