标题: [文件操作] 批处理获取子文件夹大小并添加到文件夹名前 [打印本页]
作者: gflrlm 时间: 2014-4-19 14:42 标题: 批处理获取子文件夹大小并添加到文件夹名前
本帖最后由 pcl_test 于 2016-7-27 22:25 编辑
写此代码的初衷: 本人是电影爱好者,有上千部电影在同一个目录movie下。 每部电影都单独存在于一个文件夹内,如 "钢铁侠" "极品飞车" "玩具总动员" 等, 每部电影大小不一,有的几百兆,有的几个G,所以我想在每个文件夹名字的前面加上该部电影的大小,以G为单位取小数点后2位。
如下所示:
f:\01movie\1.21GB---决斗犹马镇\决斗犹马镇.srt
f:\01movie\0.35GB---科学怪人.mkv
f:\01movie\0.98GB---尼古拉斯·凯奇-狂暴飞车\狂暴飞车.mkv
f:\01movie\4.37GB---杰森·斯坦森-暂告安全\暂告安全.mkv
f:\01movie\7.93GB---我们曾是战士\我们曾是战士.mkv
本程序功能:
1,在每个文件夹的前面,添加该文件夹大小,以GB为单位
2,本程序可以正确处理文件路径中存在的任意类型特殊字符,包括感叹号,& ,空格等字符。
3,其实贴目的也是记录一下自己的bat学习历程。对变量嵌套和变量扩展有了更进一步的认识。尤其是对setlocal enabledelayedexpansion 和 setlocal disabledelayedexpansion有了更深入的认识。后者是我第一次在代码里面用上,解决了变量延迟开启后感叹号丢失的问题。
再加一句,里面的除法是调用vbs实现的,用bat做除法比较麻烦,尤其是GB TB这么大的字节数,所以就没有写那段代码。复制代码
作者: PowerShell 时间: 2014-4-19 19:34
杰森·斯坦森-暂告安全\[暂告安全].mkv
我们曾是战士\我们%曾是战士.mkv
请问,这样的文件名灵么?
作者: gflrlm 时间: 2014-4-20 10:07
回复 2# PowerShell
是可以的, 刚才试了下如下的文件名,也是ok的
目录名字: 123%&&--!dir_t{ot[]al_size!!dir_%total_s$%^&!@ize!000GB---[啊啊啊啊啊].Am%997).xvid]
作者: apang 时间: 2014-4-21 19:07
目测 可以不用开启变量延迟,把!z!换成 %%j
目测 第6行 set /a 溢出
作者: gflrlm 时间: 2014-4-22 11:07
回复 4# apang
第六行没用到,哈哈。
可以不用!z! 而直接使用%%j,前提是那段if else要放在第二层for 循环里面。
另外在英文版的windows操作系统里, 需要把82行替换成下面的代码:
for /f "usebackq tokens=3 delims= " %%j in (`dir /s /a /-c "%%i" ^|findstr File^(s^)`) do (
作者: CrLf 时间: 2014-4-22 23:18
vbs 可以直接获取 subfolder.Size
http://bbs.bathome.net/viewthread.php?tid=25682
作者: gflrlm 时间: 2014-4-23 00:23
还是VBS强大,批处理只能用dir获取大小。。
作者: gflrlm 时间: 2014-4-23 00:36
回复 6# apang
这代码写的。。。 批处理调用vbs本身,跟shell调perl脚本有异曲同工之妙 /usr/bin/sh a.pl
a.pl- : #-Perl-*
- 'exec perl -w -S $0 ${1+ $@ }'
- if 0
- ...
- ...
复制代码
作者: apang 时间: 2014-4-23 11:38
回复 8# gflrlm
好吧,发现不应该在lz的帖子里贴代码,呵呵,已删除
作者: terse 时间: 2014-4-24 19:29
我来贴个 即使纯p也不用这么复杂吧- @echo off
- set /p p="请选择要计算的目录类型,1是只取第一层目录,2是递归当前目录,默认是第一层目录"
- if %p% equ 2 (set "_dir=dir /ad/b/s^|sort /r") else set "_dir=dir /ad/b"
- setlocal enabledelayedexpansion
- set l=00000000&for /l %%i in (1 1 2) do set "l=!l!!l!"
- endlocal&set l=%l%
- set "var=64 32 16"
- set /amd=1048576,w=32,len=0
- set "mdl=%l:~9%%md%00"
- for /f "delims=" %%a in ('%_dir%') do (
- set "fullname=%%a"&set "name=%%~nxa"
- setlocal enabledelayedexpansion
- for %%i in ("!fullname!\*") do set "size=%%~zi00"
- set "s=!l!!size!"
- if "!s:~-%w%!" geq "!mdl!" (
- set "s=!size!"
- if "!s:~16!" neq "" set len=16&set "S=!S:~16!"
- set s=!s!FEDCBA9876543210&set/a "Len+=0x!s:~16,1!"
- set/a "remainder=!Size:~,8!%%Md,GKB=!Size:~,8!/Md"
- for /l %%i in (8 1 !Len!) do (
- set/a "quotient=!remainder!!Size:~%%i,1!/Md,remainder=!remainder!!size:~%%i,1!%%Md"
- set "GKB=!GKB!!quotient!"
- )
- if !GKB! geq 102400 (
- set /a GKB/=1024
- IF !GKB! GEQ 102400 (
- set /a GKB=!GKB!/1024
- set GKB=!GKB:~,-2!.!GKB:~-2! TB--
- ) else set GKB=!GKB:~,-2!.!GKB:~-2! GB--
- )else set GKB=!GKB:~,-2!.!GKB:~-2! MB--
- ) else if !size! geq 102400 (
- set /a GKB=!size!/1024
- set GKB=!GKB:~,-2!.!!GKB:~-2! KB--
- ) else if !size! geq 1024 (
- set /a GKB=!size!/1024
- set GKB=0.!GKB! KB--
- ) else set GKB=!size:~,-2! Byte--
- ren "!fullname!" "!GKB!!name!"
- endlocal
- )
- pause
复制代码
作者: gflrlm 时间: 2014-4-25 02:41
回复 10# terse
这个代码应该是没有测试 直接贴上来的吧。。
作者: PowerShell 时间: 2014-4-25 16:14
我也来pk了,哈哈。 http://www.bathome.net/thread-25678-1-1.html
不论性能还是代码简洁度,包赢bat,不输vbs!
还是那个结论:
学一年powershell等于学3年vbs,学5年bat。
bat=库简陋=代码复杂
自己学bat,不学powershell=坑自己
向他人传授bat,不向他人传授powershell=告诉他人公交坐法,不告诉人地铁坐法=坑人!
作者: terse 时间: 2014-4-25 20:10
回复 11# gflrlm
这是我这边情况 你那边情况不清楚了
作者: techon 时间: 2014-10-22 22:30
错误处理的想法不错,
判断变量保存的当前目录是否存在,
如果不存在,那肯定是路径中含有叹号被变量延迟给丢掉了。。。
作者: CrLf 时间: 2014-10-22 23:05
卧勒个槽,撸主的字幕真大...
f:\01movie\1.21GB---决斗犹马镇\决斗犹马镇.srt
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |