Board logo

标题: [文件操作] [已解决]批处理如何以MB为单位批量提取文件大小及文件名? [打印本页]

作者: dragon631    时间: 2015-6-2 03:34     标题: [已解决]批处理如何以MB为单位批量提取文件大小及文件名?

“dir >a.txt”可以将目录下文件的修改日期、大小、文件名发送至文本文档a中。

1.里面的文件大小的单位使用的是字节,如果想让它以MB的方式显示,且按文件大小升序排列在文本文档a中,代码该如何写?
2.如果只想在文本文档a显示文件名和文件大小,大小以MB显示,且按文件大小升序排列,代码又该如何写?

希望懂行的热心人能指点一下!
作者: pcl_test    时间: 2015-6-2 18:29

本帖最后由 pcl_test 于 2016-9-25 08:58 编辑
  1. ::最大文件大小不超过2G的可以这样
  2. @echo off
  3. (for /f "delims=" %%a in ('dir /a-d /b /os^|find /i /v "%~nx0"') do set /a size=%%~za/1048576 2>nul&&call echo;%%a %%size%%MB)>"文件名及大小.txt"
  4. pause
复制代码

作者: dragon631    时间: 2015-6-2 22:07

本帖最后由 dragon631 于 2015-6-3 18:00 编辑

回复 2# pcl_test

::最大文件大小不超过2G的可以这样
@echo off & setlocal enabledelayedexpansion
(for /f "delims=" %%a in ('dir /a-d /b /o^|find /i /v "%~nx0"') do set /a size=%%~za/1048576 2>nul&&echo;%%a !size!MB)>"文件名及大小.txt"
pause

这个代码让文件以拼音首字母顺序排列。
作者: pcl_test    时间: 2015-6-2 22:27

本帖最后由 pcl_test 于 2015-6-2 22:30 编辑

回复 3# dragon631

大概你没测试,/os就是以文件大小升序排列,所以没必要再加/o
dir /a-d /b /os
作者: dragon631    时间: 2015-6-2 22:49

本帖最后由 dragon631 于 2015-6-2 23:20 编辑

回复 4# pcl_test

刚在边测试边百度,边修改回复内容,实际上,上面的代码是让它文件首拼音排列的!

原代码对于电影这些个大文件用起来比较顺手,对于图片这些稍小的文件就有点不适用了,所以,原代码的基础上,稍微变动了下,让它以KB显示

::最大文件大小不超过2G的可以这样
@echo off & setlocal enabledelayedexpansion
(for /f "delims=" %%a in ('dir /a-d /b /os^|find /i /v "%~nx0"') do set /a size=%%~za/1024 2>nul&&echo;%%a !size!KB)>"文件名及大小.txt"
pause

还有其它地方需要变动了吗?
作者: pcl_test    时间: 2015-6-3 00:28

回复 5# dragon631

不知你怎么查资料的,自行在命令提示符下输入dir /? ,回车后查看/os的作用
  1. ::适用最大文件大小不超过2G的
  2. @echo off
  3. (for /f "delims=" %%a in ('dir /a-d /b /os^|find /i /v "%~nx0"') do (
  4. if %%~za lss 1024 (
  5. echo;%%a %%~za字节
  6. ) else (
  7. if %%~za lss 1048576 (
  8. set /a size=%%~za/1024 2>nul&&call echo;%%a %%size%%KB
  9. ) else (
  10. set /a size=%%~za/1048576 2>nul&&call echo;%%a %%size%%MB
  11. ))))>"文件名及大小.txt"
  12. pause
复制代码

作者: dragon631    时间: 2015-6-3 01:36

本帖最后由 dragon631 于 2015-6-3 04:37 编辑

回复 6# pcl_test

这个兼顾到了字节、KB、MB,已经很不错了!
能不能再加上超过1GB的,单位使用GB?并且MB和GB单位后面带两位小数点?因为这样子显示出来的话,更符合实际情况!
作者: terse    时间: 2015-6-3 10:30

本帖最后由 terse 于 2015-6-5 18:00 编辑

文件名排序的 你这样试试
dir /on 文件名  /os 是按大小 竟然错了 改下
  1. @if(0)==(0) echo off & dir /b /s /on/a-d | CScript -NoLogo -E:JScript %0 >文件名_大小.txt &  pause & exit @end
  2. var fso=new ActiveXObject("Scripting.FileSystemObject");
  3. var k=1024, m=1048576, g=1073741824;
  4. while (!WScript.StdIn.AtEndOfStream){
  5.     var name = WScript.StdIn.ReadLine();
  6.     var f =fso.GetFile(name)
  7.     WSH.Echo(f.name,filesize(f.size))
  8. };
  9. function filesize(size) {
  10.     switch(true){
  11.         case size>g :
  12.             size = (size/g).toFixed(2) + ' GB';
  13.             break;
  14.         case size>m :
  15.             size = (size/m).toFixed(2) + ' MB';
  16.             break;
  17.         case size>k :
  18.             size = (size/k).toFixed(2) + ' KB';
  19.             break;
  20.         default :
  21.             size = size + ' 字节';
  22.     };
  23.     return size;
  24. }
复制代码
下面是文件大小排序
  1. @if(0)==(0) echo off & CScript -NoLogo -E:JScript %0 >文件名_大小.txt &  pause & exit @end
  2. var fso=new ActiveXObject("Scripting.FileSystemObject");
  3. var Folder = fso.GetFolder(WScript.Arguments.Count()?WScript.Arguments.Item(0):".");
  4. var arr=[], i=0, k=1024, m=1048576, g=1073741824;
  5. for(var e = new Enumerator(Folder.Files);!e.atEnd();e.moveNext()){
  6.   var f = e.item();
  7.   arr.push([f.Name, f.Size]);
  8. }
  9. arr = arr.sort(function(a,b){ return a[1] - b[1]});
  10. for (i = 0,len = arr.length; i < len; i++) {
  11.    var size = arr[i][1];
  12.    switch(true){
  13.         case size<k :
  14.             WSH.Echo(arr[i][0],'\t' + size,' Byte');
  15.             break;
  16.         case size<m :
  17.             WSH.Echo(arr[i][0],'\t' + (size/k).toFixed(2),' KB');
  18.             break;
  19.         case size<g :
  20.             WSH.Echo(arr[i][0],'\t' + (size/m).toFixed(2),' MB');
  21.             break;
  22.         default :
  23.             WSH.Echo(arr[i][0],'\t' + (size/g).toFixed(2),' GB');
  24.     }
  25. }
复制代码

作者: dragon631    时间: 2015-6-3 12:45

本帖最后由 pcl_test 于 2016-8-10 18:16 编辑

回复 8# terse
            WSH.Echo(arr[0],'\t' + size,' 字节');


在你代码的基础上,稍微变动了下,KB在电脑中显示的就是整数,所以,就让它取整数;Byte在电脑中显示的是“字节”,所以,“Byte”改成了“字节”
这个代码,是以文件大小排列的TXT文档中,能让它按首拼音来排序吗?
作者: terse    时间: 2015-6-3 14:18

回复 9# dragon631

修改第九行为
  1. arr = arr.sort(function(a,b){ return a[0] - b[0]});
复制代码

作者: CrLf    时间: 2015-6-3 16:24

使用第三方命令,hash 以及 gnu 的 sort 和 sed
  1. @hash /printf:"%%s :%%f:MB\r\n",name,z:mb | sort -t":" -k2 -n | sed "s/://g" >a.txt
复制代码
把 %%f 改成 %%d 可输出整数 MB
作者: CrLf    时间: 2015-6-3 16:43

本帖最后由 CrLf 于 2015-6-3 16:49 编辑

用脚本库来一个
  1. <!-- :
  2. @echo off
  3. mshta "%~f0" | more
  4. pause
  5. -->
  6. <script src=http://www.bathome.net/lib/diy/hide.js></script>
  7. <script src=http://www.bathome.net/lib/Prototype.js></script>
  8. <script src=http://www.bathome.net/lib/diy/WSH.js></script>
  9. <script src=http://www.bathome.net/lib/diy/Function.js></script>
  10. <script>
  11. array(getfolder('.').Files)
  12. .sort(function(a,b){return a.Size - b.Size})
  13. ._each(function($_){
  14. WSH.Echo($_.Name + ' ' + ($_.Size / 1024 / 1024) + 'MB')
  15. })
  16. </script>
复制代码

作者: yihushang    时间: 2016-7-15 00:42

回复 12# CrLf

为什么有多级子目录的文件夹,读出的大小都是0呢,里面都有很多文件。
作者: CrLf    时间: 2016-7-15 19:45

回复 13# yihushang


可能的原因:
1、没改路径,此脚本默认查询当前路径下的所有子文件夹,请修改 '.' 为你的路径,注意 \ 要写成 \\
2、文件虽然多,但大小为0
3、脚本运行出错
作者: CrLf    时间: 2016-7-17 16:31

用 hash 工具来一个
  1. @hash /z:mb /format:"%10.2fMB %s\n"|sort
复制代码

作者: WHY    时间: 2016-7-18 01:18

PowerShell  可以这样
  1. function formatSize($n){
  2.     if($n -ge 1gb){
  3.         return ($n/1gb).ToString('0.00') + 'GB';
  4.     }elseif($n -ge 1mb){
  5.         return ($n/1mb).ToString('0.00') + 'MB';
  6.     }elseif($n -ge 1kb){
  7.         return ($n/1kb).ToString('0.00') + 'KB';
  8.     }else {return '' + $n + 'B'}
  9. }
  10. dir 'D:\Test\*' -recurse | ?{$_ -is [IO.FileInfo]} | sort length | select Name, @{n='Size';e={formatSize($_.length)}}
复制代码

作者: ahh    时间: 2016-9-24 23:41

本帖最后由 ahh 于 2016-9-25 00:01 编辑
pcl_test 发表于 2015-6-2 18:29


您好,您所发布的批处理会漏掉带"!"符号的文件,麻烦您再修改一下,谢谢。

文件名排序的 你这样试试
dir /on 文件名  /os 是按大小 竟然错了 改下下面是文件大小排序
terse 发表于 2015-6-3 10:30


您好,您所发布的批处理会漏掉带"・"符号的文件,麻烦您再修改一下,谢谢。
作者: ahh    时间: 2016-9-25 00:16

本帖最后由 ahh 于 2016-9-25 00:23 编辑

需要的批处理功能:

1、以MB为单位提取文件名称及大小,并在该文件夹内生成txt文本文件。
2、以名称为排序方式
3、特殊符号提取出来可以是“?”,但不能没有。

望版主看到帮一下忙,谢谢!
作者: pcl_test    时间: 2016-9-25 09:13

回复 17# ahh

已改
作者: ahh    时间: 2016-9-25 17:29

回复 19# pcl_test
谢谢,但是排序完全乱掉了,不好意思,劳烦您再修改一下。
作者: pcl_test    时间: 2016-9-25 18:11

回复 20# ahh

http://www.bathome.net/viewthread.php?tid=40587
作者: ahh    时间: 2016-9-25 18:32

本帖最后由 ahh 于 2016-9-25 18:33 编辑

回复 21# pcl_test
大哥,我没学过这个,是真的看不懂。
您就再帮一下吧,感恩!
顺便说一下,您与terse原先所发布的排序都是正常的。
作者: pcl_test    时间: 2016-9-25 18:43

回复 22# ahh

简单的去掉/os
作者: ahh    时间: 2016-9-25 18:52

本帖最后由 ahh 于 2016-9-25 18:53 编辑

回复 23# pcl_test
太感谢了!好人啊!
最后贴出来,以便别人哪天需要这个批处理时也能找到答案。

以MB为单位提取文件大小及文件名,以名称为排序方式的批处理。
  1. ::最大文件大小不超过2G的可以这样
  2. @echo off
  3. (for /f "delims=" %%a in ('dir /a-d /b^|find /i /v "%~nx0"') do set /a size=%%~za/1048576 2>nul&&call echo;%%a %%size%%MB)>"文件名及大小.txt"
  4. pause
复制代码

作者: 樵夫    时间: 2018-3-29 17:16

回复 8# terse


    怎么可以过滤这个结果中,文件修改时间最新的那条记录呢?
作者: 小二黑    时间: 2021-12-6 09:44

回复  pcl_test
太感谢了!好人啊!
最后贴出来,以便别人哪天需要这个批处理时也能找到答案。

以MB为 ...
ahh 发表于 2016-9-25 18:52





超过2G如何操作?
作者: ww0000    时间: 2023-4-1 20:30

回复 8# terse


    老师,这个能加上路径吗?
作者: terse    时间: 2023-4-1 22:27

回复 27# ww0000
修改第一排
  1. @if(0)==(0) echo off & CScript -NoLogo -E:JScript %0 "c:\test">文件名_大小.txt &  pause & exit @end
复制代码

作者: ww0000    时间: 2023-4-2 09:14

]'\
回复 28# terse

加个    "c:\test"   ?
作者: ww0000    时间: 2023-4-2 09:17

回复 28# terse


    我是说,输出的TXT文本中,除了文件名、大小,文件名前还要带路径
作者: terse    时间: 2023-4-2 11:52

回复 30# ww0000
是这个意思吗
第七行 f.Name前加上路径 Folder
  1.     Folder+'\\'+f.Name   
复制代码

作者: ww0000    时间: 2023-4-2 12:42

回复 31# terse

是这个意思,但只能获取当前路径,不能获取子目录的路径
作者: terse    时间: 2023-4-2 14:07

回复 32# ww0000
修改了一下,看行不,这个是能显示子目录的,
  1. @if(0)==(0) echo off & dir /b /s /os/a-d "c:\test" | CScript -NoLogo -E:JScript %0 >文件名_大小.txt &  pause & exit @end
  2. var fso=new ActiveXObject("Scripting.FileSystemObject");
  3. var arr=[], k=1024, m=1048576, g=1073741824;
  4. while (!WScript.StdIn.AtEndOfStream){
  5.     var name = WScript.StdIn.ReadLine();
  6.     var f =fso.GetFile(name)
  7.     arr.push([name,f.size]);
  8. };
  9. arr = arr.sort(function(a,b){ return a[1] - b[1]});
  10. for (i = 0,len = arr.length; i < len; i++) {
  11.     WSH.Echo(arr[i][0],filesize(arr[i][1]))
  12. }
  13. function filesize(size) {
  14.     switch(true){
  15.         case size>g :
  16.             size = (size/g).toFixed(2) + ' GB';
  17.             break;
  18.         case size>m :
  19.             size = (size/m).toFixed(2) + ' MB';
  20.             break;
  21.         case size>k :
  22.             size = (size/k).toFixed(2) + ' KB';
  23.             break;
  24.         default :
  25.             size = size + ' 字节';
  26.     };
  27.     return size;
  28. }
复制代码

作者: ww0000    时间: 2023-4-2 14:40

回复 33# terse


    谢谢,可以获取子目录的,另外能不能按文件名排序呢?
作者: terse    时间: 2023-4-2 17:05

回复 34# ww0000
dir 参数 /os 换为 /on
作者: terse    时间: 2023-4-2 17:31

本帖最后由 terse 于 2023-4-2 17:33 编辑

回复 34# ww0000
对了 这个是名称排序的
arr = arr.sort(function(a,b){ return a[0] - b[0]});

其实 第一排 dir /b /s /a-d 这个按名称排序的 可以直接输出的
作者: ww0000    时间: 2023-4-2 19:38

回复 36# terse


    谢谢老师的帮助!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2