标题: [文件操作] 求批处理统计文件夹内的所有文件的数量和总大小(精确到M) [打印本页]
作者: crownking1983 时间: 2015-11-5 00:17 标题: 求批处理统计文件夹内的所有文件的数量和总大小(精确到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 ………………
作者: crownking1983 时间: 2015-11-5 09:58
跪求大神支招 继续在线等
作者: 依山居 时间: 2015-11-5 10:00
有时间等没时间自己学么。
作者: crownking1983 时间: 2015-11-5 10:45
我又不是学电脑的 我只是个律师而已 一点基础都没有的 只是来寻求帮助
作者: crownking1983 时间: 2015-11-5 10:46
回复 3# 依山居
我又不是学电脑的 我只是个律师而已 一点基础都没有的 只是来寻求帮助
作者: 依山居 时间: 2015-11-5 11:02
回复 5# crownking1983
别找借口了。即使是程序员里也有有很大比例不是学计算机出身了。
作者: 会飞的蜗牛丶 时间: 2015-11-5 11:24
- for /f "tokens=1,2,3,4" %%i in ('dir %1^|findstr /c:"个文件"') do (echo %1 %%i%%j %%k%%l)
复制代码
作者: terse 时间: 2015-11-5 12:10
- @if(0)==(0) echo off
- set "ph=C:\TEST"
- if exist "%ph%\" CScript -NoLogo -E:JScript %0 "%ph%" >new_files.txt
- pause & exit
- @end
- var m=1048576,fso=new ActiveXObject("Scripting.FileSystemObject");
- var Folder=fso.GetFolder(WSH.Arguments.Count()?WSH.Arguments.Item(0):".");
-
- function folders (F, num){
- for(var e=new Enumerator(F.Files);!e.atEnd();e.moveNext()){
- num++;
- }
- return num;
- }
-
- for(var e=new Enumerator(Folder.SubFolders);!e.atEnd();e.moveNext()){
- var F = e.item();
- var n = folders(fso.GetFolder(F.Path),0);
- WSH.Echo(F.Name,"\t", n, "个文件\t", (F.size/m).toFixed(2));
- }
复制代码
作者: CrLf 时间: 2015-11-5 13:50
哈哈,Demon 也是律师
别人我不太清楚,不过管理层大半都不是学电脑的
不过这个需求确实不指望新手自己捯饬捯饬就能解决
作者: 依山居 时间: 2015-11-6 04:25
回复 9# CrLf
论坛里的伸手党都同一群人。= =看到直接问让写好完整代码的都想吐槽。
作者: WHY 时间: 2015-11-6 23:30
本帖最后由 WHY 于 2015-11-7 09:40 编辑
- @if (0)==(0) echo off
- pushd D:\TEST\
- (for /d %%i in (*) do (
- set /p "=%%i "
- dir /s /-c /a "%%i\" | cscript //nologo //e:jscript "%~0"
- ))<nul
- pause & exit
- @end
-
- var re = /(所列文件总数|Total Files Listed):\r\n\s+(\d+).*?(\d+)/;
- var ar = WSH.StdIn.ReadAll().match(re);
- WSH.Echo(ar[2] + '个 ' + Math.round(ar[3]*100/1048576)/100 + 'MB')
复制代码
空目录的话, dir /s /-c /a-d 就挂了~
作者: crownking1983 时间: 2015-11-21 23:42 标题: 求改良BAT(统计文件夹内的所有文件的数量和总大小)
求高手修改改良我写的这段BAT命令 (统计文件夹内的所有文件的数量和总大小 然后汇总到一个新txt文本里)- @echo off
- setlocal enabledelayedexpansion
- (for /d %%a in (*) do (
- set/a n=z=0
- pushd "%%a"
- for %%b in (*.*.) do (
- set/a n+=1,z+=%%~zb
- )
- set/a "z>>=20"
- popd
- echo;%%a [!n!个!z!M]
- ))>统计结果.txt
- pause
复制代码
以上是我哥们写的,但是处理时遇到一个问题,就是执行该命令后只能统计文件夹内的第一层目录的文件情况,但是里面的子文件夹不能一并统计。我哥们现在去外地了
求高手帮个忙修改一下这个bat命令,实现执行后统计文件夹内包含所有文件及所有子文件夹下的文件,以及子文件夹下的子文件夹下的文件,以及子文件夹下的子文件夹下的子文件夹下的文件…………
作者: 慕夜蓝化 时间: 2015-11-22 17:15
本帖最后由 慕夜蓝化 于 2015-11-22 18:16 编辑
- @echo off
- setlocal enabledelayedexpansion
- (for /f “delims=” %%i in ('dir /s/b/l/ad') do (
- cd "%%~fsi"
- set/a a=0,n=0
- for /f "delims=" %%a in ('dir /b/l/aa') do (
- set/a a+=1,n+=%%~za 2>nul
- )
- set/a n/=1048576
- echo.%%~fi : !a! : !n!MB
- )) >统计结果.txt
- pause
复制代码
MB不支持小数位,文件过小会显示为零,可以删除复制代码
并删除MB改为字节。
或者使用KB,修改为- set/a n/=1024
- echo.%%~fi : !a! : !n!KB
复制代码
作者: 慕夜蓝化 时间: 2015-11-22 18:24
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s/b/l/ad') do (
- set/a n=0,r=0
- cd "%%~fsi"
- for /f "tokens=3" %%a in ('dir /aa') do (
- set n=!a!
- set a=%%a
- set/a r+=1
- )
- echo.%%i:文件数量:!r! 总大小:!n!
- )
- pause
复制代码
钻了空子。
作者: wankoilz 时间: 2015-11-22 22:01
本帖最后由 wankoilz 于 2015-11-22 22:03 编辑
用纯批处理在数字计算上受限制,这个问题用批处理结合awk倒是简单:
需拖拽执行- # & cls & (for /f "delims=" %%a in ('dir/a-d/b/s %1') do @echo %%~za) | gawk -v path=%~n1 -f %0 >con & pause & exit
- {sum+=$0}
- END{
- printf "%s文件夹总大小为: \n%.2f byte\n%.2f MB\n%.2f GB\n",path,sum,sum/1024/1024,sum/1024/1024/1024
- }
复制代码
gawk 4.1.0 下载地址:http://www.bathome.net/viewthread.php?tid=21366&highlight=gawk
作者: crownking1983 时间: 2015-11-22 23:32
以上几位修改的都不行呢 最后还是我那哥们儿搞定了 毕竟是他写的程序所以还是他自己比较熟悉 麻烦大家了 不好意思啊
作者: 523066680 时间: 2015-11-22 23:38
本帖最后由 523066680 于 2015-11-22 23:45 编辑
最近重新学C,
没有测试链接的目录,
风格好渣……- #include <cstdio>
- #include <cstdlib>
- #include <cwchar>
- #include <cstring>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <dirent.h>
- #include <locale.h>
-
- #define NAME_MAX 1024
-
- void func(wchar_t path[]);
- static long long int TotalSize = 0;
- static long long int FileCount = 0;
- static long long int DirCount = 0;
-
- int main(int argc, char *argv[] )
- {
- setlocale( LC_ALL, ".936" );
- wchar_t wspath[1024] = L"";
- char ts_str[30] = "";
-
- if (argc > 1)
- {
- mbstowcs( wspath, argv[1], strlen(argv[1]) );
-
- _WDIR * a;
- DIR * b;
-
- if ( (a = _wopendir(wspath)) == NULL )
- {
- fprintf(stderr, "Argument is not correct!");
- }
- else
- {
- func( wspath );
- fprintf(stderr, "%20lld Folders\n", DirCount);
- fprintf(stderr, "%20lld Files\n" , FileCount);
- fprintf(stderr, "%20lld Bytes\n" , TotalSize);
- fprintf(stderr, "%20lld MB\n" , TotalSize/1024/1024);
- fprintf(stderr, "%20lld GB" , TotalSize/1024/1024/1024);
- }
- }
- else
- {
- fprintf(stderr, "No arguments!");
- }
-
- return 0;
- }
-
- void func(wchar_t path[])
- {
- _WDIR * a = _wopendir(path);
- _wdirent * dp;
- _WDIR * aa;
- struct _stati64 stbuf;
- wchar_t fullpath[NAME_MAX] = L"";
-
- while (dp = _wreaddir(a))
- {
- if (
- wcscmp(dp->d_name, L".") == 0
- || wcscmp(dp->d_name, L"..") == 0
- )
- {
- continue;
- }
-
- swprintf(fullpath, L"%ls\\%ls", path, dp->d_name);
- _wstati64(fullpath, &stbuf);
-
- if ( (stbuf.st_mode & S_IFMT) == S_IFDIR )
- {
- DirCount ++;
- func( fullpath );
- }
- else
- {
- TotalSize += (long long int)stbuf.st_size;
- FileCount ++;
- }
-
- }
- _wclosedir(a);
- }
复制代码
1962 Folders
17329 Files
76636660679 Bytes
73086 MB
71 GB
作者: rogerzhao9 时间: 2018-3-28 16:06
您能把修改好的程度共享出来看看吗?
作者: Batcher 时间: 2018-3-28 21:30
回复 18# rogerzhao9
8楼和11楼的代码有啥问题吗?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |