批处理文件,用于计算特定目录中的所有文件夹和子文件夹

时间:2015-02-19 09:51:53

标签: windows batch-file scripting cmd

我是脚本中的菜鸟,但我需要批处理文件,它可以从用户获取特殊的文件夹方式并计算该目录中的所有文件夹和子文件夹。我现在有类似的东西:

@echo off
set /a allcount=0
for /f %%a in ('dir /b /s /ad %folder%^|find /c /v "" ') do set count=%%a
echo %count%

但它仅在当前文件夹中计数并打印很多行,例如“文件夹名称太长”。有人可以帮我完成我的剧本吗?

3 个答案:

答案 0 :(得分:1)

列出文件夹的大小。它来自我在MS站点的磁盘清理文章。

查看文件占用空间的位置

这将列出驱动器上文件夹的文件数和大小。每个命令都有一个子集,因此您可以更好地管理它。

开始 - 所有程序 - 附件 - 右键单击​​“命令提示符”,然后选择“以管理员身份运行”。键入(或通过右键单击“命令提示符”窗口并选择“粘贴”进行复制和粘贴)。

然后配置命令提示符。右键单击命令提示符的标题栏 - 属性 - 布局选项卡 - 并为屏幕缓冲区大小高度输入1000,为窗口大小高度输入43(或50)。如果需要,可以更改颜色(颜色选项卡)和字体(字体选项卡)。

查看文档中文件夹的大小,不包括音乐,视频或图片文件夹。

for /f "skip=2 tokens=3" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Personal"') do set doc=%A

for /f "usebackq tokens=2* delims= " %i IN (`dir "%doc%" /a /s ^|findstr /i /v "\/"^|findstr /l /v "Pictures Music Video"`) DO @echo %j&echo.

查看音乐中文件夹的大小。

for /f "skip=2 tokens=4" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "My Music"') do set Doc=%A

for /f "usebackq tokens=2* delims= " %i IN (`dir "%doc%" /a /s ^|findstr /i /v "\/"`) DO @echo %j&echo.

查看图片中文件夹的大小。

for /f "skip=2 tokens=4" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "My Pictures"') do set Doc=%A

for /f "usebackq tokens=2* delims= " %i IN (`dir "%doc%" /a /s ^|findstr /i /v "\/"`) DO @echo %j&echo.

在视频中查看文件夹的大小。

for /f "skip=2 tokens=4" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "My Video"') do set Doc=%A

for /f "usebackq tokens=2* delims= " %i IN (`dir "%doc%" /a /s ^|findstr /i /v "\/"`) DO @echo %j&echo.

查看桌面上文件夹的大小。

for /f "skip=2 tokens=3" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop"') do set doc=%A

for /f "usebackq tokens=2* delims= " %i IN (`dir "%doc%" /a /s ^|findstr /i /v "\/"`) DO @echo %j&echo.

查看Windows文件夹中文件夹的大小。

for /f "usebackq tokens=2* delims= " %i IN (`dir "%windir%" /a /s ^|findstr /i /v "\/"`) DO @echo %j&echo.

查看Program Files文件夹的文件夹大小。

for /f "usebackq tokens=2* delims= " %i IN (`dir "%ProgramFiles%" /a /s ^|findstr /i /v "\/"`) DO @echo %j&echo.

要计算行数,这个vbscript就可以了。

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout

        Do Until Inp.AtEndOfStream
            Line=Inp.readline
            outp.writeline Line
            Count = Count +1
        Loop
        outp.writeline Count

使用管道将要计数的内容用于vbscript。

YourCommand.exe | cscript //nologo <path to vbscript>\count.vbs 

答案 1 :(得分:0)

DIR命令始终显示错误数量的子目录

这是DIR命令的固有行为,因为它始终将.(当前目录)和..(祖先目录)作为其枚举的每个目录的子目录。

这意味着:

  • 以非递归方式列出(即,列出根文件夹中的目录)

目录报告N+2目录(其中N =正确的值)

  • 递归列出(即所有目录和子目录)

目录报告3N+2目录(其中N =正确的值)

重要说明:以我的示例为例,我发现DIR CMD存在一个违反此规则的问题。因此,我建议仅使用“计数”方法)

要更正报告的值:

任何一个

A)自己计算目录。

B)捕获报告的值形式的DIR(例如,使用FOR /F循环)

计数是更通用的解决方案(它可以递归或非递归地工作,并且可能会更快一些。)

REM Recursive = DIR /S /B /A:D "Some path" | FIND /I /C /V ""
REM Recursive (Ignore Links)= DIR /S /B /A:D-L "Some path" | FIND /I /C /V ""
REM Non-Recursive = DIR /B /A:D "Some path" | FIND /I /C /V ""

Y:\> DIR /S /B /A:D "C:\Windows\System32\" | FIND /I /C /V ""
1498

Y:\>DIR /S /B /A:D-L "C:\Windows\System32\" | FIND /I /C /V ""
1497

Y:\> DIR /B /A:D "C:\Windows\System32\" | FIND /I /C /V ""
1

但是,您也可以使用“数学示例”来找到正确的值:

注意:与计数方法相比,显示的结果存在差异,我将在下面对此进行扩展。

Y:\>FOR /F %A IN ('dir /s /A:D "c:\windows\system32" ^| Find "Dir(s)"') DO @( SET /a ( %~A - 2 ^) / 3 )
1496

Y:\>FOR /F %A IN ('dir /s /A:D-L "c:\windows\system32" ^| Find "Dir(s)"') DO @( SET /a %~A - 2 )
1

注意:

当对文件夹,Junction或Symlink配置了阻止任何人访问该文件夹的权限时-大多数情况是默认的Windows Junctions设置可以防止操作系统循环文件结构-DIR不会计数这些都正确,最后我们得到3N-2。

我已经进行了一些测试,DIR肯定是为Junction文件夹添加了一个条目,(没有添加两个...文件夹)最初的假设,但随后又将总数减少了2。

似乎另外2滴来自DIR,它试图忽略较大目录集上根目录的...文件夹,但是我将需要验证这是否是情况,或者在无法访问的目录中运行时DIR CMD总是加1减4。

无论如何,使用Count A:DL或Count A:D进行计数的方法仍与目录或目录和联结的总数一致(分别为*),应采用-方法。

答案 2 :(得分:-1)

这也有效

dir /s c:\windows\system32 | Findstr /c:"Dir(s)"