รับขนาดโฟลเดอร์จาก Windows Command Line


128

เป็นไปได้ไหมใน Windows ที่จะรับขนาดของโฟลเดอร์จากบรรทัดคำสั่งโดยไม่ต้องใช้เครื่องมือของบุคคลที่สาม

ฉันต้องการผลลัพธ์เดียวกันกับที่คุณจะได้รับเมื่อคลิกขวาที่โฟลเดอร์ในคุณสมบัติ windows explorer →

คำตอบ:


121

คุณสามารถเพิ่มขนาดซ้ำได้ (ต่อไปนี้เป็นไฟล์แบตช์):

@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes

อย่างไรก็ตามปัญหานี้มีปัญหาหลายประการเนื่องจากcmdจำกัด อยู่ที่การคำนวณเลขคณิตจำนวนเต็ม 32 บิต ดังนั้นมันจะได้รับมีขนาดมากกว่า 2 กิ๊บผิด1 นอกจากนี้ยังมีแนวโน้มที่จะนับลิงก์และทางแยกหลาย ๆ ครั้งดังนั้นจึงเป็นขอบเขตที่ดีที่สุดไม่ใช่ขนาดที่แท้จริง (แม้ว่าคุณจะมีปัญหากับเครื่องมือใด ๆ ก็ตาม)

อีกทางเลือกหนึ่งคือ PowerShell:

Get-ChildItem -Recurse | Measure-Object -Sum Length

หรือสั้นกว่า:

ls -r | measure -sum Length

ถ้าคุณต้องการให้สวยขึ้น:

switch((ls -r|measure -sum Length).Sum) {
  {$_ -gt 1GB} {
    '{0:0.0} GiB' -f ($_/1GB)
    break
  }
  {$_ -gt 1MB} {
    '{0:0.0} MiB' -f ($_/1MB)
    break
  }
  {$_ -gt 1KB} {
    '{0:0.0} KiB' -f ($_/1KB)
    break
  }
  default { "$_ bytes" }
}

คุณสามารถใช้สิ่งนี้ได้โดยตรงจากcmd:

powershell -noprofile -command "ls -r|measure -sum Length"

1ฉันมีไลบรารี bignum ที่สร้างเสร็จแล้วบางส่วนในไฟล์แบตช์บางแห่งซึ่งอย่างน้อยก็จะได้รับสิทธิ์การบวกจำนวนเต็มที่มีความแม่นยำโดยพลการ ฉันควรจะปล่อยมันจริงๆฉันเดา :-)


+1 ฉันแค่หลงเข้าไปในเอาต์พุตขอความช่วยเหลือ * เพื่อค้นหาอะไรทำนองนั้น
Steve

2
สตีฟในสายตาของฉัน PowerShell เป็นวิธีที่ Unix-y มากกว่า Unix ตรงที่คำสั่งหลักส่วนใหญ่ตั้งฉากกันจริงๆ ใน Unix duให้ขนาดไดเร็กทอรี แต่สิ่งที่ทำคือการเดินไปตามต้นไม้และสรุป สิ่งที่สามารถแสดงออกได้อย่างหรูหราในท่อเช่นนี้ :-) ดังนั้นสำหรับ PowerShell ฉันมักจะมองหาวิธีที่คุณสามารถแยกย่อยเป้าหมายระดับสูงให้เป็นการดำเนินการระดับล่างที่เหมาะสม
Joey

3
ฉันเห็นดูเหมือนว่าจะเพิกเฉยต่อโฟลเดอร์ที่ซ่อนอยู่ด้วยวิธีนั้น ls -force -r ใช้งานได้ถ้าฉันต้องการรวมโฟลเดอร์ที่ซ่อนไว้ด้วย
garg

2
folder\*ไม่ได้ผลสำหรับฉันขนาดของโฟลเดอร์ที่ฉันวางไว้ในตำแหน่งที่แสดงเป็น 0 ไบต์มีวิธีแก้ไขหรือไม่?
นักวิจัยด้านไอที

2
เวอร์ชันที่ดูดีกว่าเล็กน้อย: powershell -noprofile -command "'{0: N0}' -f (ls -r | measure -s Length) .um"
zumalifeguard

120

มีเครื่องมือ Windows ในตัวสำหรับสิ่งนั้น:

dir /s 'FolderName'

นี่จะพิมพ์ข้อมูลที่ไม่จำเป็นมากมาย แต่สุดท้ายจะเป็นขนาดโฟลเดอร์ดังนี้:

 Total Files Listed:
       12468 File(s)    182,236,556 bytes

/aหากคุณต้องการที่จะรวมซ่อนโฟลเดอร์เพิ่ม


7
นี่เป็นทางออกที่ดีที่สุดหากคุณไม่ต้องการค่าส่งคืนจำนวนเต็ม หมายเหตุ: สวิตช์ '/ a' จะรวมไฟล์ที่ซ่อนอยู่และไฟล์ระบบในขนาดทั้งหมด
Oran D. Lord

1
ฉันเดาว่าเป็นไปไม่ได้ที่จะพิมพ์ขนาดไฟล์ในหน่วยที่มีประโยชน์มากกว่าเช่น kB หรือ MB ใช่ไหม?
David Ferenczy Rogožan

คำพูดคู่แทนคำพูดเดี่ยว
user2924019

66

ฉันขอแนะนำให้ดาวน์โหลดยูทิลิตี้ DU จาก Sysinternals Suite ที่ Microsoft ให้มาที่ลิงค์นี้ http://technet.microsoft.com/en-us/sysinternals/bb896651

usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory>
   -c     Print output as CSV.
   -l     Specify subdirectory depth of information (default is all levels).
   -n     Do not recurse.
   -q     Quiet (no banner).
   -u     Count each instance of a hardlinked file.
   -v     Show size (in KB) of intermediate directories.


C:\SysInternals>du -n d:\temp

Du v1.4 - report directory disk usage
Copyright (C) 2005-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

Files:        26
Directories:  14
Size:         28.873.005 bytes
Size on disk: 29.024.256 bytes

ในขณะที่คุณอยู่ให้ดูที่ยูทิลิตี้อื่น ๆ สิ่งเหล่านี้เป็นตัวช่วยชีวิตสำหรับ Windows Professional ทุกคน


11
แทบจะไม่ "ไม่มีเครื่องมือของบุคคลที่สาม" เลย
Joey

11
ถูกต้อง แต่คิดว่าครอบครัวไม่ควรถือเป็น 'บุคคลที่สาม'
Steve

1
ได้รับแล้ว แต่ยังคงเป็นการดาวน์โหลดเพิ่มเติม (หรือใช้\\live.sysinternals.comหากยังมีอยู่) ฉันเห็นด้วยอย่างยิ่งยวดว่าควรรวมเครื่องมือ sysinternals ทั้งหมดไว้โดยปริยาย แม้ว่าสำหรับการใช้งานหลาย ๆ PowerShell จะเป็นการทดแทนที่คุ้มค่าทีเดียว
Joey

1
มีคนพูดว่า Powershell? ลองทำดังต่อไปนี้: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .um / 1MB) + "MB"
John Homer

3
ฉันขอแนะนำให้ทุกคนดาวน์โหลดสิ่งที่ Mark Russinovich พัฒนา :) ฉันมักจะเห็นชื่อนี้ทุกครั้งที่ฉันพบเครื่องมือที่ช่วยชีวิตฉัน
dkellner

46

หนึ่งในสายการบิน:

powershell -command "$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName"

เหมือนกัน แต่ Powershell เท่านั้น:

$fso = new-object -com Scripting.FileSystemObject
gci -Directory `
  | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName `
  | sort Size -Descending `
  | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName

สิ่งนี้ควรให้ผลลัพธ์ดังต่อไปนี้:

Size [MB]  FullName
---------  --------
580,08     C:\my\Tools\mongo
434,65     C:\my\Tools\Cmder
421,64     C:\my\Tools\mingw64
247,10     C:\my\Tools\dotnet-rc4
218,12     C:\my\Tools\ResharperCLT
200,44     C:\my\Tools\git
156,07     C:\my\Tools\dotnet
140,67     C:\my\Tools\vscode
97,33      C:\my\Tools\apache-jmeter-3.1
54,39      C:\my\Tools\mongoadmin
47,89      C:\my\Tools\Python27
35,22      C:\my\Tools\robomongo

1
มีวิธีแสดงไฟล์และขนาดทั้งหมดใน Mb ในโฟลเดอร์ฐานด้วยหรือไม่? ในกรณีนี้คือ `C: \ my \ Tools`
Raunak Thomas

2
นอกจากนี้ยังหยุดทำงานเมื่อมีโฟลเดอร์จำนวนมาก (ตัวอย่างเช่นในไดรฟ์ C
:)

0.00 C:\Windowsฉันสามารถปรับให้เหมาะสมกับโฟลเดอร์ทั้งหมดได้หรือไม่ลองรันในฐานะผู้ดูแลระบบแล้ว
Tilo

มันดี แต่มันตัดชื่อโฟลเดอร์คอมโพเนนต์ของฉันให้สั้นลง คำสั่งที่จะแสดงทั้งหมดคืออะไร?
sean.net

@ sean.net คุณหมายถึงลงท้ายด้วย "... " ในกรณีที่โฟลเดอร์ยาวหรือไม่? นั่นคือวิธีการทำงานของft( Format-Table) คุณสามารถลองflแทนได้ ( Format-List)
frizik

16

หากคุณติดตั้งคอมไพล์ในคอมพิวเตอร์ของคุณ (เริ่มมีมากขึ้นเรื่อย ๆ ) เพียงแค่เปิด MINGW32 แล้วพิมพ์: du folder


4
คุณสามารถใช้คำสั่งต่อไปนี้du -h -d 1 folder | sort -hหากคุณต้องการขนาดที่มนุษย์อ่านได้ไดเร็กทอรีย่อยหนึ่งระดับเท่านั้นและจัดเรียงตามขนาด
vard

8

ฉันแนะนำให้ใช้ยูทิลิตี้https://github.com/aleksaan/diskusage ง่ายมากและเป็นประโยชน์ และรวดเร็วมาก

เพียงพิมพ์เชลล์คำสั่ง

diskusage.exe -path 'd:/go; d:/Books'

และรับรายชื่อโฟลเดอร์ที่จัดเรียงตามขนาด

  1. | DIR: d: / go | ขนาด: 325.72 Mb | ความลึก: 1
  2. | DIR: d: / หนังสือ | ขนาด: 14.01 Mb | ความลึก: 1

ตัวอย่างนี้ดำเนินการที่272msบน HDD

คุณสามารถเพิ่มความลึกของโฟลเดอร์ย่อยเพื่อวิเคราะห์ตัวอย่างเช่น:

diskusage.exe -path 'd:/go; d:/Books' -depth 2

และรับขนาดไม่เพียง แต่สำหรับโฟลเดอร์ที่เลือกเท่านั้น แต่ยังรวมถึงโฟลเดอร์ย่อยด้วย

  1. | DIR: d: / go | ขนาด: 325.72 Mb | ความลึก: 1
  2. | DIR: d: / go / pkg | ขนาด: 212.88 Mb | ความลึก: 2
  3. | DIR: d: / go / src | ขนาด: 62.57 Mb | ความลึก: 2
  4. | DIR: d: / go / bin | ขนาด: 30.44 Mb | ความลึก: 2
  5. | DIR: d: / หนังสือ / หมากรุก | ขนาด: 14.01 Mb | ความลึก: 2
  6. | DIR: d: / หนังสือ | ขนาด: 14.01 Mb | ความลึก: 1
  7. | DIR: d: / go / api | ขนาด: 6.41 Mb | ความลึก: 2
  8. | DIR: d: / go / test | ขนาด: 5.11 Mb | ความลึก: 2
  9. | DIR: d: / go / doc | ขนาด: 4.00 Mb | ความลึก: 2
 10. | DIR: d: / go / misc | ขนาด: 3.82 Mb | ความลึก: 2
 11. | DIR: d: / go / lib | ขนาด: 358.25 Kb | ความลึก: 2

* 3.5Tb บนเซิร์ฟเวอร์ได้รับการสแกนเป็นเวลา 3 นาที 12 วินาที


รุ่นใหม่ออกแล้ว! github.com/aleksaan/diskusage Improvments: 1) แก้ไขการทำงานกับขนาดของ symlink 2) ข้อมูล orevall เกี่ยวกับวัตถุที่วิเคราะห์
Alexander Anufriev

เวอร์ชั่น 2.0.2 ออกแล้ว! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - ไฟล์คอนฟิกูเรชันแทนพารามิเตอร์แบบอินไลน์ - โหมดการใช้งานแบบง่าย (คัดลอกดิสก์การใช้งานไปยังโฟลเดอร์ใดก็ได้เรียกใช้และรับผลลัพธ์) - ผลลัพธ์ที่ถูกต้อง (สัญลักษณ์ท้ายบรรทัดที่ถูกต้องชนะ / unix) - บันทึกผลลัพธ์เป็นไฟล์หรือรับในโหมดคอนโซล (ตัวเลือก 'tofile')
Alexander Anufriev

โปรดทราบว่าคุณเป็นผู้เขียน (จากstackoverflow.com/help/promotion : "อย่างไรก็ตามคุณต้องเปิดเผยความเกี่ยวข้องของคุณในคำตอบของคุณ" )
aeracode

7

นี่คือรหัส powershell ที่ฉันเขียนถึงขนาดรายการและจำนวนไฟล์สำหรับโฟลเดอร์ทั้งหมดในไดเรกทอรีปัจจุบัน อย่าลังเลที่จะใช้ซ้ำหรือปรับเปลี่ยนตามความต้องการของคุณ

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    set-location $folder.FullName
    $size = Get-ChildItem -Recurse | Measure-Object -Sum Length
    $info = $folder.FullName + "    FileCount: " + $size.Count.ToString() + "   Size: " + [math]::Round(($size.Sum / 1GB),4).ToString() + " GB"
    write-host $info
}

ใช้ได้ผลสำหรับฉัน มีประโยชน์หากคุณอยู่บนเซิร์ฟเวอร์ที่ไม่มีหัว
andrew pate

เรียบง่ายและสง่างาม! เวอร์ชันของฉัน: $FolderList = Get-ChildItem -Directory -Force; $data = foreach ($folder in $FolderList) { set-location $folder.FullName; $size = Get-ChildItem -Recurse -Force | Measure-Object -Sum Length; $size | select @{n="Path"; e={$folder.Fullname}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} } สิ่งนี้จะให้อ็อบเจ็กต์ (Powershell-ish เพิ่มเติม), 'FileCount' และ 'Size' เป็นจำนวนเต็ม (ดังนั้นคุณสามารถประมวลผลได้ในภายหลังหากจำเป็น) และ 'Size' เป็นไบต์ แต่คุณสามารถแปลงเป็น GB (หรือหน่วยงานที่คุณต้องการ) $Data.Size / 1GBด้วย
curropar

หรือหนึ่งซับ:$Data = dir -Directory -Force | %{ $CurrentPath = $_.FullName; Get-ChildItem $CurrentPath -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum Length | select @{n="Path"; e={$CurrentPath}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} }
curropar

ฉันชอบอันนี้ที่สุด แต่ก็ไม่set-locationจำเป็นเหรอ? คุณสามารถไปได้Get-ChildItem $folder.FullNameโดยที่คุณออกมาอีกด้านหนึ่งโดยที่ไดเรกทอรีปัจจุบันไม่เปลี่ยนแปลงอยู่ข้างใต้คุณ
BenderBoy

2

รหัสนี้ได้รับการทดสอบ คุณสามารถตรวจสอบอีกครั้ง

@ECHO OFF
CLS
SETLOCAL
::Get a number of lines contain "File(s)" to a mytmp file in TEMP location.
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /C "File(s)" >%TEMP%\mytmp
SET /P nline=<%TEMP%\mytmp
SET nline=[%nline%]
::-------------------------------------
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1
SET /P mainline=<%TEMP%\mytmp1
CALL SET size=%mainline:~29,15%
ECHO %size%
ENDLOCAL
PAUSE

ขอบคุณมันใช้งานได้สำหรับฉันกับโฟลเดอร์ที่มีขนาดเล็กกว่า 1GB แต่ตัวอย่างเช่นฉันมีโฟลเดอร์ขนาด 3,976,317,115 ไบต์ (3.70GB) และสคริปต์ส่งคืนสตริงนี้เป็น ") 932" ให้ฉันรู้ไหมว่าทำไม?
รอบ

2

ฉันเดาว่าสิ่งนี้จะใช้ได้ก็ต่อเมื่อไดเร็กทอรีค่อนข้างคงที่และเนื้อหาไม่เปลี่ยนแปลงระหว่างการดำเนินการของคำสั่ง dir สองคำสั่ง อาจเป็นวิธีที่จะรวมสิ่งนี้เป็นคำสั่งเดียวเพื่อหลีกเลี่ยงสิ่งนั้น แต่สิ่งนี้ใช้ได้ผลสำหรับฉัน (ฉันไม่ต้องการรายชื่อแบบเต็มเพียงแค่สรุป)

GetDirSummary.bat สคริปต์:

@echo off
rem  get total number of lines from dir output
FOR /F "delims=" %%i IN ('dir /S %1 ^| find "asdfasdfasdf" /C /V') DO set lineCount=%%i
rem  dir summary is always last 3 lines; calculate starting line of summary info
set /a summaryStart="lineCount-3"
rem  now output just the last 3 lines
dir /S %1 | more +%summaryStart%

การใช้งาน:

GetDirSummary.bat c: \ temp

เอาท์พุท:

 Total Files Listed:
          22 File(s)         63,600 bytes
           8 Dir(s)  104,350,330,880 bytes free

1

ฉันได้รับdu.exeจากการกระจายคอมไพล์ของฉัน สถานที่อื่นอาจจะมีการดังกล่าวข้างต้นของ Microsoft หรือUnxUtils

เมื่อคุณมี du.exe ในเส้นทางของคุณ นี่คือfileSizes.bat:-) ของคุณ

@echo ___________
@echo DIRECTORIES
@for /D %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo FILES
@for %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo TOTAL
@du.exe -sh "%CD%"

___________
DIRECTORIES
37M     Alps-images
12M     testfolder
_____
FILES
765K    Dobbiaco.jpg
1.0K    testfile.txt
_____
TOTAL
58M    D:\pictures\sample

1

ฉันคิดว่าตัวเลือกเดียวของคุณคือ diruse (โซลูชันของบุคคลที่สามที่ได้รับการสนับสนุนอย่างมาก):

รับขนาดไฟล์ / ไดเร็กทอรีจากบรรทัดคำสั่ง

Windows CLI มีข้อ จำกัด ค่อนข้างมากคุณสามารถติดตั้งCygwinซึ่งเป็นความฝันที่จะใช้เมื่อเทียบกับ cmd นั่นจะช่วยให้คุณสามารถเข้าถึงเครื่องมือ Unix ที่พอร์ตซึ่งเป็นพื้นฐานของ diruse บน windows

ขออภัยฉันไม่สามารถตอบคำถามของคุณโดยตรงด้วยคำสั่งที่คุณสามารถเรียกใช้บน cli เนทีฟได้


1
หากคุณต้องการเพียงแค่duCygwin เป็นวิธีที่มากเกินไป เพียงแค่ไปกับGnuWin32
Joey

2
แน่นอนมันเกินความจริง แต่ก็ยอดเยี่ยมเช่นกัน +1 สำหรับโพสต์ของคุณด้านบน @joey (ยังไม่มีตัว
แทนที่จะ

ในความเห็นที่ต่ำต้อยของฉัน Cygwin อาจมีประโยชน์สำหรับบางคน แต่ก็ยังห่างไกลจากความน่ากลัวและค่อนข้างน่ากลัว แต่ฉันเดาว่าผู้ใช้ Unix พูดเหมือนกันเกี่ยวกับ Wine
Joey

1
"ไวน์" - ตัวสั่นฉันใช้ Cygwin กับแล็ปท็อปสำหรับการพัฒนาของฉันเพราะอายุการใช้งานแบตเตอรี่น่ากลัวภายใต้ลินุกซ์และไม่สะดวกที่จะเรียกใช้ VM กับมัน ต้องใช้เวลาในการตั้งค่า แต่ Cygwin นั้นยอดเยี่ยมสำหรับผู้ที่พลาด nix shell ใน Windows โดยส่วนตัวแล้วฉันไม่ชอบ Powershell ฉันอาจต้องตรวจสอบ GnuWin ขอบคุณ @Joey
Illizian

1

:: รับจำนวนบรรทัดที่คำสั่ง Dir ส่งกลับ (/ -c เพื่อกำจัดตัวคั่นตัวเลข:.,) ["Tokens = 3" เพื่อดูเฉพาะคอลัมน์ที่สามของแต่ละบรรทัดใน Dir]

FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1

จำนวนบรรทัดสุดท้ายซึ่งเป็นจำนวนไบต์ของผลรวมของไฟล์:

set /a line=%i%-1

ในที่สุดรับจำนวนไบต์ในบรรทัดสุดท้าย - คอลัมน์ที่ 3:

set i=0
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO (
  set /a i=!i!+1
  set bytes=%%a
  If !i!==%line% goto :size  
)
:size
echo %bytes%

เนื่องจากไม่ใช้การค้นหาคำจึงไม่มีปัญหาเรื่องภาษา

ข้อ จำกัด :

  • ใช้งานได้กับโฟลเดอร์ที่มีขนาดน้อยกว่า 2 GB เท่านั้น (cmd ไม่รองรับตัวเลขที่มากกว่า 32 บิต)
  • ไม่อ่านจำนวนไบต์ของโฟลเดอร์ภายใน

1

ลอง:

SET FOLDERSIZE=0
FOR /F "tokens=3" %A IN ('DIR "C:\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%A

เปลี่ยน C: \ Program Files เป็นโฟลเดอร์ใดก็ได้ที่คุณต้องการและเปลี่ยน% A เป็น %% A หากใช้ในไฟล์แบตช์

ส่งคืนขนาดของโฟลเดอร์ทั้งหมดรวมถึงโฟลเดอร์ย่อยและไฟล์ที่ซ่อนอยู่และไฟล์ระบบและทำงานกับโฟลเดอร์ที่มีขนาดเกิน 2GB

มันเขียนลงบนหน้าจอดังนั้นคุณจะต้องใช้ไฟล์ชั่วคราวหากคุณไม่ต้องการ


1

สามารถใช้สคริปต์ต่อไปนี้เพื่อดึงข้อมูลและสะสมขนาดของแต่ละไฟล์ภายใต้โฟลเดอร์ที่กำหนด
เส้นทางโฟลเดอร์%folder%สามารถกำหนดให้เป็นอาร์กิวเมนต์ของสคริปต์นี้ ( %1)
ในที่สุดผลลัพธ์จะถูกเก็บไว้ในพารามิเตอร์%filesize%

@echo off
SET count=1
SET foldersize=0
FOR /f "tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize "%%F")
echo %filesize%
GOTO :eof

:calcAccSize
 REM echo %count%:%1
 REM set /a count+=1
 set /a foldersize+=%~z1
 GOTO :eof

หมายเหตุ: วิธีcalcAccSizeนี้ยังสามารถพิมพ์เนื้อหาของโฟลเดอร์ได้ (แสดงความคิดเห็นในตัวอย่างด้านบน)


1

ดังนั้นนี่คือวิธีแก้ปัญหาสำหรับทั้งสองคำขอของคุณในลักษณะที่คุณขอในตอนแรก มันจะให้ขนาดไฟล์ที่มนุษย์สามารถอ่านได้โดยไม่ จำกัด ขนาดไฟล์ที่ทุกคนประสบ เข้ากันได้กับ Win Vista หรือใหม่กว่า XP ใช้ได้เฉพาะเมื่อติดตั้ง Robocopy เพียงวางโฟลเดอร์ในไฟล์แบตช์นี้หรือใช้วิธีการที่ดีกว่าที่กล่าวถึงด้านล่าง

@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"

For %%i in (%*) do (
    set "vSearch=Files :"
    For /l %%M in (1,1,2) do ( 
        for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
            if /i "%%M"=="1" (
                set "filecount=%%A"
                set "vSearch=Bytes :"
            ) else (
                set "foldersize=%%A%%B"
            )
        )
    )
    echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!
    REM remove the word "REM" from line below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

เพื่อให้สามารถใช้ไฟล์แบตช์นี้ได้อย่างสะดวกให้วางไว้ในโฟลเดอร์ SendTo ของคุณ ซึ่งจะช่วยให้คุณสามารถคลิกขวาที่โฟลเดอร์หรือเลือกโฟลเดอร์คลิกที่ตัวเลือก SendTo จากนั้นเลือกไฟล์แบตช์นี้

หากต้องการค้นหาโฟลเดอร์ SendTo ในคอมพิวเตอร์ของคุณวิธีที่ง่ายที่สุดคือเปิด cmd จากนั้นคัดลอกในบรรทัดนี้ตามที่เป็นอยู่

explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo


สำหรับใครที่กังวลว่า Robocopy จะย้ายไฟล์ .. อย่าเลย ตัวเลือก / l แสดงรายการเท่านั้น นอกจากนี้ Robocopy ไม่ใช่บุคคลที่สาม Robocopy ได้รับการติดตั้งใน Windows โดยค่าเริ่มต้นจาก Vista ขึ้น XP คุณต้องติดตั้ง
julesverne

ขอบคุณสำหรับการเพิ่ม ดีใจที่เห็นกระทู้นี้ยังคงดึงดูดความสนใจ ;-) อาจต้องการเพิ่มวิธีการติดตั้ง robocopy (เครื่องมือที่ยอดเยี่ยม!)
Eldad Assis

0

ฉันแก้ไขปัญหาที่คล้ายกัน วิธีการบางอย่างในหน้านี้ทำงานช้าและบางส่วนมีปัญหาในสภาพแวดล้อมหลายภาษา (สมมติว่าเป็นภาษาอังกฤษ) ฉันพบวิธีแก้ปัญหาง่ายๆโดยใช้ vbscript ใน cmd ได้รับการทดสอบใน W2012R2 และ W7

>%TEMP%\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (SET "S_=%%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

ตั้งค่าตัวแปรสภาพแวดล้อม S_ แน่นอนคุณสามารถเปลี่ยนบรรทัดสุดท้ายเพื่อแสดงผลโดยตรงเป็นเช่น

FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

คุณสามารถใช้เป็นรูทีนย่อยหรือเป็น cmd แบบสแตนด์อโลน พารามิเตอร์คือชื่อของโฟลเดอร์ทดสอบที่ปิดด้วยเครื่องหมายคำพูด


-3

วิธีที่ง่ายที่สุดในการรับขนาดทั้งหมดคือ powershell แต่ก็ยังถูก จำกัด ด้วยความจริงที่ว่าชื่อพา ธ ที่ยาวเกิน 260 อักขระจะไม่รวมอยู่ในทั้งหมด


2
นี่เป็นคำตอบที่แย่และน่าสงสาร บรรทัดคำสั่งหรือรหัสคืออะไร?
Tatarin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.