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