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

[文件操作] [已解决]批处理如何以MB为单位批量提取文件大小及文件名?

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

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

希望懂行的热心人能指点一下!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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
复制代码

TOP

本帖最后由 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

这个代码让文件以拼音首字母顺序排列。

TOP

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

回复 3# dragon631

大概你没测试,/os就是以文件大小升序排列,所以没必要再加/o
dir /a-d /b /os

TOP

本帖最后由 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

还有其它地方需要变动了吗?

TOP

回复 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
复制代码

TOP

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

回复 6# pcl_test

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

TOP

本帖最后由 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. }
复制代码
1

评分人数

TOP

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

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


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

TOP

回复 9# dragon631

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

TOP

使用第三方命令,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

TOP

本帖最后由 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>
复制代码

TOP

回复 12# CrLf

为什么有多级子目录的文件夹,读出的大小都是0呢,里面都有很多文件。

TOP

回复 13# yihushang


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

TOP

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

TOP

返回列表