[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 求批处理统计文件夹内的所有文件的数量和总大小(精确到M)

求统计文件夹内的所有文件的数量和总大小(精确到M) 写到新生成的一个txt汇总文件

例如  文件夹A1里有 12个文件(不管什么类型的文件 全部统计)21M
        文件夹B2里有 24个文件 33M
        文件夹C3里有 39个文件 43M
        文件夹D4里有 54个文件103M  ………………

经过批处理后 写入到一个txt文本里 ——(以下为文本统计格式内容)
A1 12个21M
B2 24个33M
C3 39个43M
D4 54个103M  ………………

回复 18# rogerzhao9


    8楼和11楼的代码有啥问题吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

您能把修改好的程度共享出来看看吗?

TOP

本帖最后由 523066680 于 2015-11-22 23:45 编辑

最近重新学C,
没有测试链接的目录,
风格好渣……
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cwchar>
  4. #include <cstring>
  5. #include <sys/stat.h>
  6. #include <sys/types.h>
  7. #include <dirent.h>
  8. #include <locale.h>
  9. #define NAME_MAX 1024
  10. void func(wchar_t path[]);
  11. static long long int TotalSize = 0;
  12. static long long int FileCount = 0;
  13. static long long int DirCount = 0;
  14. int main(int argc, char *argv[] )
  15. {
  16.     setlocale( LC_ALL, ".936" );
  17.     wchar_t wspath[1024] = L"";
  18.     char ts_str[30] = "";
  19.     if (argc > 1)
  20.     {
  21.         mbstowcs( wspath, argv[1], strlen(argv[1]) );
  22.         _WDIR * a;
  23.         DIR * b;
  24.         if ( (a = _wopendir(wspath)) == NULL )
  25.         {
  26.             fprintf(stderr, "Argument is not correct!");
  27.         }
  28.         else
  29.         {
  30.             func( wspath );
  31.             fprintf(stderr, "%20lld Folders\n", DirCount);
  32.             fprintf(stderr, "%20lld Files\n"  , FileCount);
  33.             fprintf(stderr, "%20lld Bytes\n"   , TotalSize);
  34.             fprintf(stderr, "%20lld MB\n"      , TotalSize/1024/1024);
  35.             fprintf(stderr, "%20lld GB"        , TotalSize/1024/1024/1024);
  36.         }
  37.     }
  38.     else
  39.     {
  40.         fprintf(stderr, "No arguments!");
  41.     }
  42.    
  43.     return 0;
  44. }
  45. void func(wchar_t path[])
  46. {
  47.     _WDIR * a = _wopendir(path);
  48.     _wdirent * dp;
  49.     _WDIR * aa;
  50.     struct _stati64 stbuf;
  51.     wchar_t fullpath[NAME_MAX] = L"";
  52.     while (dp = _wreaddir(a))
  53.     {
  54.         if (
  55.                wcscmp(dp->d_name, L".") == 0
  56.             || wcscmp(dp->d_name, L"..") == 0  
  57.         )
  58.         {
  59.             continue;
  60.         }
  61.         swprintf(fullpath, L"%ls\\%ls", path, dp->d_name);
  62.         _wstati64(fullpath, &stbuf);
  63.         if ( (stbuf.st_mode & S_IFMT) == S_IFDIR )
  64.         {
  65.             DirCount ++;
  66.             func( fullpath );
  67.         }
  68.         else
  69.         {
  70.             TotalSize +=  (long long int)stbuf.st_size;
  71.             FileCount ++;
  72.         }
  73.     }
  74.     _wclosedir(a);
  75. }
复制代码
                1962 Folders
               17329 Files
         76636660679 Bytes
               73086 MB
                  71 GB
1

评分人数

    • 依山居: 看你的骨骼精奇,是万中无一的武学奇才,维 ...技术 + 1

TOP

以上几位修改的都不行呢 最后还是我那哥们儿搞定了 毕竟是他写的程序所以还是他自己比较熟悉 麻烦大家了 不好意思啊

TOP

本帖最后由 wankoilz 于 2015-11-22 22:03 编辑

用纯批处理在数字计算上受限制,这个问题用批处理结合awk倒是简单:
需拖拽执行
  1. # & cls & (for /f "delims=" %%a in ('dir/a-d/b/s %1') do @echo %%~za) | gawk -v path=%~n1 -f %0 >con & pause & exit
  2. {sum+=$0}
  3. END{
  4. printf "%s文件夹总大小为: \n%.2f byte\n%.2f MB\n%.2f GB\n",path,sum,sum/1024/1024,sum/1024/1024/1024
  5. }
复制代码
gawk 4.1.0 下载地址:http://www.bathome.net/viewthread.php?tid=21366&highlight=gawk
1

评分人数

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /s/b/l/ad') do (
  4. set/a n=0,r=0
  5. cd "%%~fsi"
  6. for /f "tokens=3" %%a in ('dir /aa') do (
  7. set n=!a!
  8. set a=%%a
  9. set/a r+=1
  10. )
  11. echo.%%i:文件数量:!r! 总大小:!n!
  12. )
  13. pause
复制代码
钻了空子。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

本帖最后由 慕夜蓝化 于 2015-11-22 18:16 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f “delims=” %%i in ('dir /s/b/l/ad') do (
  4. cd "%%~fsi"
  5. set/a a=0,n=0
  6. for /f "delims=" %%a in ('dir /b/l/aa') do (
  7. set/a a+=1,n+=%%~za 2>nul
  8. )
  9. set/a n/=1048576
  10. echo.%%~fi : !a! : !n!MB
  11. )) >统计结果.txt
  12. pause
复制代码
MB不支持小数位,文件过小会显示为零,可以删除
  1. set/a n/=1048576
复制代码
并删除MB改为字节。

或者使用KB,修改为
  1. set/a n/=1024
  2. echo.%%~fi : !a! : !n!KB
复制代码
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

求改良BAT(统计文件夹内的所有文件的数量和总大小)

求高手修改改良我写的这段BAT命令 (统计文件夹内的所有文件的数量和总大小 然后汇总到一个新txt文本里)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /d %%a in (*) do (
  4.     set/a n=z=0
  5.     pushd "%%a"
  6.     for %%b in (*.*.) do (
  7.         set/a n+=1,z+=%%~zb
  8.     )
  9.     set/a "z>>=20"
  10.     popd
  11.     echo;%%a [!n!个!z!M]
  12. ))>统计结果.txt
  13. pause
复制代码
以上是我哥们写的,但是处理时遇到一个问题,就是执行该命令后只能统计文件夹内的第一层目录的文件情况,但是里面的子文件夹不能一并统计。我哥们现在去外地了
求高手帮个忙修改一下这个bat命令,实现执行后统计文件夹内包含所有文件及所有子文件夹下的文件,以及子文件夹下的子文件夹下的文件,以及子文件夹下的子文件夹下的子文件夹下的文件…………

TOP

本帖最后由 WHY 于 2015-11-7 09:40 编辑
  1. @if (0)==(0) echo off
  2. pushd D:\TEST\
  3. (for /d  %%i in (*) do (
  4.     set /p "=%%i "
  5.     dir /s /-c /a "%%i\" | cscript //nologo //e:jscript "%~0"
  6. ))<nul
  7. pause & exit
  8. @end
  9. var re = /(所列文件总数|Total Files Listed):\r\n\s+(\d+).*?(\d+)/;
  10. var ar = WSH.StdIn.ReadAll().match(re);
  11. WSH.Echo(ar[2] + '个 ' + Math.round(ar[3]*100/1048576)/100 + 'MB')
复制代码
空目录的话, dir /s /-c /a-d 就挂了~
1

评分人数

TOP

回复 9# CrLf


    论坛里的伸手党都同一群人。= =看到直接问让写好完整代码的都想吐槽。

TOP

哈哈,Demon 也是律师
别人我不太清楚,不过管理层大半都不是学电脑的

不过这个需求确实不指望新手自己捯饬捯饬就能解决

TOP

  1. @if(0)==(0) echo off
  2. set "ph=C:\TEST"
  3. if exist "%ph%\" CScript -NoLogo -E:JScript %0 "%ph%" >new_files.txt
  4. pause & exit
  5. @end
  6. var m=1048576,fso=new ActiveXObject("Scripting.FileSystemObject");
  7. var Folder=fso.GetFolder(WSH.Arguments.Count()?WSH.Arguments.Item(0):".");
  8. function folders (F, num){
  9.   for(var e=new Enumerator(F.Files);!e.atEnd();e.moveNext()){
  10.      num++;
  11.   }
  12.   return num;
  13. }
  14. for(var e=new Enumerator(Folder.SubFolders);!e.atEnd();e.moveNext()){
  15.    var F = e.item();
  16.    var n = folders(fso.GetFolder(F.Path),0);
  17.    WSH.Echo(F.Name,"\t", n, "个文件\t", (F.size/m).toFixed(2));
  18. }
复制代码
1

评分人数

TOP

  1. for /f "tokens=1,2,3,4" %%i in ('dir %1^|findstr /c:"个文件"') do (echo %1 %%i%%j %%k%%l)
复制代码
1

评分人数

TOP

回复 5# crownking1983


    别找借口了。即使是程序员里也有有很大比例不是学计算机出身了。

TOP

返回列表