
[已解決]批處理如何生成樹狀目錄帶文件大小最后由 DoubleU 于 -12-16 17:45各位大神好,小弟不是開發(fā)人員,平時也沒有研究過,很多時候只是簡單了解用過批處理,之前用的批處理都比較簡單,百度一般都能解決個人需求,這次的需求稍微復雜了一些,從上周末開始搜索測試了蠻久,均未能完美解決,所以在此求助大神抽空幫忙指點一下,先行謝過了。我的需求是:文件名、大小(mb的顯示mb,gb的顯示gb)需求說明:本地文件夾中有很多子文件夾及文件,想要做清理,需要現(xiàn)有一份清單列表,所以想通過批處理來輸出一份文本,最好是樹狀結構,內容包含文件名稱及大小,開始直接用tree /f >>1.txt 可以得到想要的結果,在整理過程中發(fā)現(xiàn),很多時候需要對比文件大小,并不能完全滿足需求;于是開始百度和在論壇中搜尋,目前找了2段代碼相對比較貼近,來自百度的源代碼1:優(yōu)點:有名稱、時間、路徑、大小。缺點:不能輸出為txt、文件大小為字節(jié)數(shù),無法換算為MBGB,這個是比較接近需求的一段代碼了。
來自論壇中搜索到的源代碼2:優(yōu)點:大小可以換算為MB,GB。缺點:1.不是樹狀結構,開起來費勁;2.輸出結果是在C盤用戶下;3.需要用WindowsPowerShell運行。nclick="copycode($('code0'));">復制代碼
- ' 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 & 字節(jié)] & 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 & 字節(jié)] & 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 & 字節(jié)] & vbCrLf
- Tree SubFolder,(SFSpace)
- Next
- End Sub
這兩段代碼都是我目前找到的相對比較符合需求的代碼,但是都無法完美解決問題,求大神幫忙看下,盡量在代碼1的基礎上能幫忙調整下,能增加:1.輸出txt結果到當前目錄;2.樹狀機構輸出;3.大小可以換算為MB,GB。nclick="copycode($('code1'));">復制代碼
- $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);

