标题: [文件操作] [已解决]批处理如何生成树状目录带文件大小? [打印本页]
作者: DoubleU 时间: 2019-12-16 11:55 标题: [已解决]批处理如何生成树状目录带文件大小?
本帖最后由 DoubleU 于 2019-12-16 17:45 编辑
各位大神好,小弟不是开发人员,平时也没有研究过,很多时候只是简单了解用过批处理,之前用的批处理都比较简单,百度一般都能解决个人需求,这次的需求稍微复杂了一些,从上周末开始搜索测试了蛮久,均未能完美解决,所以在此求助大神抽空帮忙指点一下,先行谢过了。
我的需求是:文件名、大小(mb的显示mb,gb的显示gb)
需求说明:
本地文件夹中有很多子文件夹及文件,想要做清理,需要现有一份清单列表,所以想通过批处理来输出一份文本,最好是树状结构,内容包含文件名称及大小,开始直接用tree /f >>1.txt 可以得到想要的结果,在整理过程中发现,很多时候需要对比文件大小,并不能完全满足需求;
于是开始百度和在论坛中搜寻,目前找了2段代码相对比较贴近,
来自百度的源代码1:优点:有名称、时间、路径、大小。缺点:不能输出为txt、文件大小为字节数,无法换算为MB GB, 这个是比较接近需求的一段代码了。- ' 2>nul 3>nul&cls&@echo off
- '&rem 批处理/bat生成能显示文件大小的树状/树形目录结构
- '&mode con lines=3000
- '&set #=Any question&set @=WX/&set $=Q&set/az=0x53b7e0b4
- '&title %#% +%@%%$%%$% %z%
- '&cd /d "%root%"
- '&cscript -nologo -e:vbscript "%~f0" "."
- '&echo;%#% +%@%%$%%$% %z%
- '&pause&exit
-
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set TreePath = fso.GetFolder(WSH.Arguments(0))
- currentpath = fso.GetFile(WSH.ScriptFullName).ParentFolder.Path
- OutFile = currentpath & "\#OutTree.txt"
- fs = 0
- For Each f In TreePath.Files
- fs = fs+f.size
- Next
- TreeStr = TreePath.path & " [" & TreePath.Size & " 字节]" & vbCrLf
- Tree TreePath.path,""
- WSH.echo TreeStr
- WSH.Quit
-
- Sub Tree(Path,SFSpace)
- Dim i,TempStr,FlSpace,fsize
- FlSpace = SFSpace & " "
- Set CrntFolder = fso.GetFolder(Path)
- i = 0:TempStr = "├─"
- For Each ConFile In CrntFolder.Files
- If ConFile.Path <> WSH.ScriptFullName Then
- i = i + 1
- If i = CrntFolder.Files.Count And CrntFolder.SubFolders.Count = 0 Then TempStr = "└─"
- TreeStr = TreeStr & FlSpace & Tempstr & ConFile.name & " [" & ConFile.size & " 字节]" & vbCrLf
- End If
- Next
- i = 0:TempStr = "├─"
- For Each SubFolder In CrntFolder.SubFolders
- fsize = 0:i = i + 1
- If i = CrntFolder.SubFolders.Count Then
- TempStr = "└─"
- SFSpace = FlSpace & " "
- Else
- SFSpace = FlSpace & "│"
- End If
- For Each f In SubFolder.Files
- If f.Path <> WSH.ScriptFullName Then
- fsize = fsize+f.size
- End If
- Next
- TreeStr = TreeStr & FlSpace & TempStr & SubFolder.name & " [" & SubFolder.size & " 字节]" & vbCrLf
- Tree SubFolder,(SFSpace)
- Next
- End Sub
复制代码
来自论坛中搜索到的源代码2:优点:大小可以换算为MB,GB。缺点:1.不是树状结构,开起来费劲;2.输出结果是在C盘用户下;3.需要用WindowsPowerShell运行。- $Lists = New-Object System.Text.StringBuilder;
- $files = ls 'D:\1\' -r | ?{$_.Directory};
- $m = $files.Count.tostring().Length;
- Foreach ( $i in $files )
- {
- $index++;
- $ref = $i.Length;
- switch ( $ref.tostring().length )
- {
- {$_ -le 3} { $length = "{0:0.000} Byte" -f ($ref);break}
- {$_ -le 6} { $length = "{0:0.000} KB" -f ($ref/1KB);break}
- {$_ -le 9} { $length = "{0:0.000} MB" -f ($ref/1MB);break}
- $_ { $length = "{0:0.000} GB" -f ($ref/1GB)}
- }
- $n = '[' + $index.tostring().padleft($m,' ') + ']';
- [void]$Lists.AppendLine($n+' '+$i.name);
- [void]$Lists.AppendLine(' '*($m+3)+$length);
- [void]$Lists.AppendLine(' '*($m+3)+$i.LastWriteTime);
- [void]$Lists.AppendLine(' '*($m+3)+$i.FullName);
- [void]$Lists.AppendLine('');
- }
- [IO.File]::WriteAllLines("$pwd\输出.log",$Lists,[text.encoding]::Default);
复制代码
这两段代码都是我目前找到的相对比较符合需求的代码,但是都无法完美解决问题,求大神帮忙看下,尽量在代码1的基础上能帮忙调整下,能增加:1.输出txt结果到当前目录;2.树状机构输出;3.大小可以换算为MB,GB。
作者: Batcher 时间: 2019-12-16 12:35
回复 1# DoubleU
代码2的最后一行:
[IO.File]::WriteAllLines("$pwd\输出.log",$Lists,[text.encoding]:efault);
红色字体改成你希望的路径,试试能否解决这个问题【2.输出结果是在C盘用户下】
作者: DoubleU 时间: 2019-12-16 14:17
回复 2# Batcher
嗯嗯 可以了 我修改了标红的部分,可以正常输出到指定目录了,感谢大大。
作者: a20150604 时间: 2019-12-16 15:49
回复 1# DoubleU
我没有完全按你的需求写, 实际是 vbs, 但保存了 bat 直接运行, 结果输出在命令行, 你自己动手加入输出文件, 文件 size 做简单的单位换算处理就能达到你的需求了- Rem^ & @echo off & mode 300,9999
- Rem^ &cscript //NoLogo //E:VBScript "%~f0"
- Rem^ &pause
- Rem^ &goto :eof
-
- Public fso, input_file, output_file
- Public layer
- Public Branch
- call main
- Sub main()
- ReDim Branch(1000)
- layer = 0
- Set fso = CreateObject("Scripting.FileSystemObject")
- ' 脚本对象 和 当前目录
- Set obj_wsc_shell = CreateObject("wscript.shell")
- HostFolder = obj_wsc_shell.CurrentDirectory & "\"
- ' HostFolder = ThisWorkbook.Path & "\"
- Call DoFolder(fso.GetFolder(HostFolder))
- wscript.Quit
- End Sub
- Sub DoFolder(Folder)
- Dim i
- pref_str = ""
- For i = 1 To layer - 1
- pref_str = pref_str & Branch(i)
- Next
- If layer > 0 Then
- If Branch(layer) = " " Then
- pref_str = pref_str & " └─"
- Else
- pref_str = pref_str & " ├─"
- End If
- End If
- wscript.echo pref_str & Folder.Name
- ' Debug.Print pref_str & Folder.Name
- ' 在子目录中递归调用
- Dim SubFolder
- Dim count_SubFolders, cnt_SubFolder_or_file
- count_SubFolders = Folder.SubFolders.Count
- count_files = Folder.Files.Count
- count_SubFolders_and_files = count_SubFolders + count_files
- cnt_SubFolder_or_file = 0
- For Each SubFolder In Folder.SubFolders
- cnt_SubFolder_or_file = cnt_SubFolder_or_file + 1
- layer = layer + 1
- ' Branch 用于子对象
- If (cnt_SubFolder_or_file >= count_SubFolders_and_files) Then
- Branch(layer) = " "
- Else
- Branch(layer) = " │"
- End If
- Call DoFolder(SubFolder)
- layer = layer - 1
- Next
- Dim file
- For Each file In Folder.Files
- cnt_SubFolder_or_file = cnt_SubFolder_or_file + 1
- layer = layer + 1
- If (cnt_SubFolder_or_file >= count_SubFolders_and_files) Then
- Branch(layer) = " "
- Else
- Branch(layer) = " │"
- End If
- Call doFile(file)
- layer = layer - 1
- Next
- End Sub
- Sub doFile(ByRef input_file)
- Dim i
- pref_str = ""
- For i = 1 To layer - 1
- pref_str = pref_str & Branch(i)
- Next
- If layer > 0 Then
- If Branch(layer) = " " Then
- pref_str = pref_str & " └─"
- Else
- pref_str = pref_str & " ├─"
- End If
- End If
- wscript.echo pref_str & input_file.Name & " : " & input_file.Size & " Bytes"
- End Sub
复制代码
作者: DoubleU 时间: 2019-12-16 17:44
回复 DoubleU
我没有完全按你的需求写, 实际是 vbs, 但保存了 bat 直接运行, 结果输出在命令行, 你自己 ...
a20150604 发表于 2019-12-16 15:49
厉害了 大大这个可以正常跑了,太感谢了。
作者: DoubleU 时间: 2019-12-16 17:51
回复 DoubleU
我没有完全按你的需求写, 实际是 vbs, 但保存了 bat 直接运行, 结果输出在命令行, 你自己 ...
a20150604 发表于 2019-12-16 15:49
对于一个有点强迫证的人来说,完美解决真的是太舒心,再次感谢大大的帮忙,不甚感谢。
作者: Ares777 时间: 2020-12-11 18:19
回复 6# DoubleU
请问,在第三个回答得基础上,可以指导一下文件大小转换的代码怎么写吗 (比如转换成Mb),谢谢啦
作者: Ares777 时间: 2020-12-11 18:21
回复 4# a20150604
大佬,我想请教一下,在你这个回答中 文件大小转换的代码怎么写啊 (比如转换成Mb),麻烦啦
作者: newswan 时间: 2020-12-14 14:22
linux命令 tree.exe 可以输出目录树,带 文件大小
作者: 2319375211 时间: 2020-12-29 06:26
本帖最后由 2319375211 于 2021-1-3 10:07 编辑
回复 8# Ares777 - If Round(input_file.size/1099511627776, 3) > 1 Then
- wscript.echo pref_str & input_file.Name & " [" & Round(input_file.size/1099511627776, 3) & " TB]"
- ElseIf Round(input_file.size/1073741824, 3) > 1 Then
- wscript.echo pref_str & input_file.Name & " [" & Round(input_file.size/1073741824, 2) & " GB]"
- ElseIf Round(input_file.size/1048576, 3) > 1 Then
- wscript.echo pref_str & input_file.Name & " [" & Round(input_file.size/1048576, 1) & " MB]"
- ElseIf Round(input_file.size/1024, 3) > 1 Then
- wscript.echo pref_str & input_file.Name & " [" & Round(input_file.size/1024, 1) & " KB]"
- Else
- wscript.echo pref_str & input_file.Name & " [" & input_file.Size & " Byte]"
- End If
复制代码
作者: Ares777 时间: 2021-1-6 19:47
回复 10# 2319375211
非常感谢!
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |