标题: [文件操作] [已解决]批处理如何以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 编辑
- ::最大文件大小不超过2G的可以这样
- @echo off
- (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"
- 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的作用- ::适用最大文件大小不超过2G的
- @echo off
- (for /f "delims=" %%a in ('dir /a-d /b /os^|find /i /v "%~nx0"') do (
- if %%~za lss 1024 (
- echo;%%a %%~za字节
- ) else (
- if %%~za lss 1048576 (
- set /a size=%%~za/1024 2>nul&&call echo;%%a %%size%%KB
- ) else (
- set /a size=%%~za/1048576 2>nul&&call echo;%%a %%size%%MB
- ))))>"文件名及大小.txt"
- 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 是按大小 竟然错了 改下- @if(0)==(0) echo off & dir /b /s /on/a-d | CScript -NoLogo -E:JScript %0 >文件名_大小.txt & pause & exit @end
-
- var fso=new ActiveXObject("Scripting.FileSystemObject");
- var k=1024, m=1048576, g=1073741824;
-
- while (!WScript.StdIn.AtEndOfStream){
- var name = WScript.StdIn.ReadLine();
- var f =fso.GetFile(name)
- WSH.Echo(f.name,filesize(f.size))
- };
-
- function filesize(size) {
- switch(true){
- case size>g :
- size = (size/g).toFixed(2) + ' GB';
- break;
- case size>m :
- size = (size/m).toFixed(2) + ' MB';
- break;
- case size>k :
- size = (size/k).toFixed(2) + ' KB';
- break;
- default :
- size = size + ' 字节';
- };
- return size;
- }
复制代码
下面是文件大小排序- @if(0)==(0) echo off & CScript -NoLogo -E:JScript %0 >文件名_大小.txt & pause & exit @end
- var fso=new ActiveXObject("Scripting.FileSystemObject");
- var Folder = fso.GetFolder(WScript.Arguments.Count()?WScript.Arguments.Item(0):".");
- var arr=[], i=0, k=1024, m=1048576, g=1073741824;
- for(var e = new Enumerator(Folder.Files);!e.atEnd();e.moveNext()){
- var f = e.item();
- arr.push([f.Name, f.Size]);
- }
- arr = arr.sort(function(a,b){ return a[1] - b[1]});
- for (i = 0,len = arr.length; i < len; i++) {
- var size = arr[i][1];
- switch(true){
- case size<k :
- WSH.Echo(arr[i][0],'\t' + size,' Byte');
- break;
- case size<m :
- WSH.Echo(arr[i][0],'\t' + (size/k).toFixed(2),' KB');
- break;
- case size<g :
- WSH.Echo(arr[i][0],'\t' + (size/m).toFixed(2),' MB');
- break;
- default :
- WSH.Echo(arr[i][0],'\t' + (size/g).toFixed(2),' GB');
- }
- }
复制代码
作者: 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
修改第九行为- arr = arr.sort(function(a,b){ return a[0] - b[0]});
复制代码
作者: CrLf 时间: 2015-6-3 16:24
使用第三方命令,hash 以及 gnu 的 sort 和 sed- @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 编辑
用脚本库来一个- <!-- :
- @echo off
- mshta "%~f0" | more
- pause
- -->
-
- <script src=http://www.bathome.net/lib/diy/hide.js></script>
- <script src=http://www.bathome.net/lib/Prototype.js></script>
- <script src=http://www.bathome.net/lib/diy/WSH.js></script>
- <script src=http://www.bathome.net/lib/diy/Function.js></script>
-
- <script>
- array(getfolder('.').Files)
- .sort(function(a,b){return a.Size - b.Size})
- ._each(function($_){
- WSH.Echo($_.Name + ' ' + ($_.Size / 1024 / 1024) + 'MB')
- })
- </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 工具来一个- @hash /z:mb /format:"%10.2fMB %s\n"|sort
复制代码
作者: WHY 时间: 2016-7-18 01:18
PowerShell 可以这样- function formatSize($n){
- if($n -ge 1gb){
- return ($n/1gb).ToString('0.00') + 'GB';
- }elseif($n -ge 1mb){
- return ($n/1mb).ToString('0.00') + 'MB';
- }elseif($n -ge 1kb){
- return ($n/1kb).ToString('0.00') + 'KB';
- }else {return '' + $n + 'B'}
- }
- 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为单位提取文件大小及文件名,以名称为排序方式的批处理。- ::最大文件大小不超过2G的可以这样
- @echo off
- (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"
- 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
修改第一排- @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复制代码
作者: ww0000 时间: 2023-4-2 12:42
回复 31# terse
是这个意思,但只能获取当前路径,不能获取子目录的路径
作者: terse 时间: 2023-4-2 14:07
回复 32# ww0000
修改了一下,看行不,这个是能显示子目录的,- @if(0)==(0) echo off & dir /b /s /os/a-d "c:\test" | CScript -NoLogo -E:JScript %0 >文件名_大小.txt & pause & exit @end
- var fso=new ActiveXObject("Scripting.FileSystemObject");
- var arr=[], k=1024, m=1048576, g=1073741824;
- while (!WScript.StdIn.AtEndOfStream){
- var name = WScript.StdIn.ReadLine();
- var f =fso.GetFile(name)
- arr.push([name,f.size]);
- };
- arr = arr.sort(function(a,b){ return a[1] - b[1]});
- for (i = 0,len = arr.length; i < len; i++) {
- WSH.Echo(arr[i][0],filesize(arr[i][1]))
- }
- function filesize(size) {
- switch(true){
- case size>g :
- size = (size/g).toFixed(2) + ' GB';
- break;
- case size>m :
- size = (size/m).toFixed(2) + ' MB';
- break;
- case size>k :
- size = (size/k).toFixed(2) + ' KB';
- break;
- default :
- size = size + ' 字节';
- };
- return size;
- }
复制代码
作者: 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 |