เป็นไปได้ไหมใน Windows ที่จะรับขนาดของโฟลเดอร์จากบรรทัดคำสั่งโดยไม่ต้องใช้เครื่องมือของบุคคลที่สาม
ฉันต้องการผลลัพธ์เดียวกันกับที่คุณจะได้รับเมื่อคลิกขวาที่โฟลเดอร์ในคุณสมบัติ windows explorer →
เป็นไปได้ไหมใน Windows ที่จะรับขนาดของโฟลเดอร์จากบรรทัดคำสั่งโดยไม่ต้องใช้เครื่องมือของบุคคลที่สาม
ฉันต้องการผลลัพธ์เดียวกันกับที่คุณจะได้รับเมื่อคลิกขวาที่โฟลเดอร์ในคุณสมบัติ windows explorer →
คำตอบ:
คุณสามารถเพิ่มขนาดซ้ำได้ (ต่อไปนี้เป็นไฟล์แบตช์):
@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 ที่สร้างเสร็จแล้วบางส่วนในไฟล์แบตช์บางแห่งซึ่งอย่างน้อยก็จะได้รับสิทธิ์การบวกจำนวนเต็มที่มีความแม่นยำโดยพลการ ฉันควรจะปล่อยมันจริงๆฉันเดา :-)
du
ให้ขนาดไดเร็กทอรี แต่สิ่งที่ทำคือการเดินไปตามต้นไม้และสรุป สิ่งที่สามารถแสดงออกได้อย่างหรูหราในท่อเช่นนี้ :-) ดังนั้นสำหรับ PowerShell ฉันมักจะมองหาวิธีที่คุณสามารถแยกย่อยเป้าหมายระดับสูงให้เป็นการดำเนินการระดับล่างที่เหมาะสม
folder\*
ไม่ได้ผลสำหรับฉันขนาดของโฟลเดอร์ที่ฉันวางไว้ในตำแหน่งที่แสดงเป็น 0 ไบต์มีวิธีแก้ไขหรือไม่?
มีเครื่องมือ Windows ในตัวสำหรับสิ่งนั้น:
dir /s 'FolderName'
นี่จะพิมพ์ข้อมูลที่ไม่จำเป็นมากมาย แต่สุดท้ายจะเป็นขนาดโฟลเดอร์ดังนี้:
Total Files Listed:
12468 File(s) 182,236,556 bytes
/a
หากคุณต้องการที่จะรวมซ่อนโฟลเดอร์เพิ่ม
ฉันขอแนะนำให้ดาวน์โหลดยูทิลิตี้ 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 ทุกคน
\\live.sysinternals.com
หากยังมีอยู่) ฉันเห็นด้วยอย่างยิ่งยวดว่าควรรวมเครื่องมือ sysinternals ทั้งหมดไว้โดยปริยาย แม้ว่าสำหรับการใช้งานหลาย ๆ PowerShell จะเป็นการทดแทนที่คุ้มค่าทีเดียว
หนึ่งในสายการบิน:
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
0.00 C:\Windows
ฉันสามารถปรับให้เหมาะสมกับโฟลเดอร์ทั้งหมดได้หรือไม่ลองรันในฐานะผู้ดูแลระบบแล้ว
ft
( Format-Table
) คุณสามารถลองfl
แทนได้ ( Format-List
)
หากคุณติดตั้งคอมไพล์ในคอมพิวเตอร์ของคุณ (เริ่มมีมากขึ้นเรื่อย ๆ ) เพียงแค่เปิด MINGW32 แล้วพิมพ์: du folder
du -h -d 1 folder | sort -h
หากคุณต้องการขนาดที่มนุษย์อ่านได้ไดเร็กทอรีย่อยหนึ่งระดับเท่านั้นและจัดเรียงตามขนาด
ฉันแนะนำให้ใช้ยูทิลิตี้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 วินาที
นี่คือรหัส 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
}
$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
ด้วย
$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}} }
set-location
จำเป็นเหรอ? คุณสามารถไปได้Get-ChildItem $folder.FullName
โดยที่คุณออกมาอีกด้านหนึ่งโดยที่ไดเรกทอรีปัจจุบันไม่เปลี่ยนแปลงอยู่ข้างใต้คุณ
รหัสนี้ได้รับการทดสอบ คุณสามารถตรวจสอบอีกครั้ง
@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
ฉันเดาว่าสิ่งนี้จะใช้ได้ก็ต่อเมื่อไดเร็กทอรีค่อนข้างคงที่และเนื้อหาไม่เปลี่ยนแปลงระหว่างการดำเนินการของคำสั่ง 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
ฉันได้รับ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
ฉันคิดว่าตัวเลือกเดียวของคุณคือ diruse (โซลูชันของบุคคลที่สามที่ได้รับการสนับสนุนอย่างมาก):
รับขนาดไฟล์ / ไดเร็กทอรีจากบรรทัดคำสั่ง
Windows CLI มีข้อ จำกัด ค่อนข้างมากคุณสามารถติดตั้งCygwinซึ่งเป็นความฝันที่จะใช้เมื่อเทียบกับ cmd นั่นจะช่วยให้คุณสามารถเข้าถึงเครื่องมือ Unix ที่พอร์ตซึ่งเป็นพื้นฐานของ diruse บน windows
ขออภัยฉันไม่สามารถตอบคำถามของคุณโดยตรงด้วยคำสั่งที่คุณสามารถเรียกใช้บน cli เนทีฟได้
:: รับจำนวนบรรทัดที่คำสั่ง 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%
เนื่องจากไม่ใช้การค้นหาคำจึงไม่มีปัญหาเรื่องภาษา
ข้อ จำกัด :
ลอง:
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
มันเขียนลงบนหน้าจอดังนั้นคุณจะต้องใช้ไฟล์ชั่วคราวหากคุณไม่ต้องการ
สามารถใช้สคริปต์ต่อไปนี้เพื่อดึงข้อมูลและสะสมขนาดของแต่ละไฟล์ภายใต้โฟลเดอร์ที่กำหนด
เส้นทางโฟลเดอร์%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
นี้ยังสามารถพิมพ์เนื้อหาของโฟลเดอร์ได้ (แสดงความคิดเห็นในตัวอย่างด้านบน)
ดังนั้นนี่คือวิธีแก้ปัญหาสำหรับทั้งสองคำขอของคุณในลักษณะที่คุณขอในตอนแรก มันจะให้ขนาดไฟล์ที่มนุษย์สามารถอ่านได้โดยไม่ จำกัด ขนาดไฟล์ที่ทุกคนประสบ เข้ากันได้กับ 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
ฉันแก้ไขปัญหาที่คล้ายกัน วิธีการบางอย่างในหน้านี้ทำงานช้าและบางส่วนมีปัญหาในสภาพแวดล้อมหลายภาษา (สมมติว่าเป็นภาษาอังกฤษ) ฉันพบวิธีแก้ปัญหาง่ายๆโดยใช้ 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 แบบสแตนด์อโลน พารามิเตอร์คือชื่อของโฟลเดอร์ทดสอบที่ปิดด้วยเครื่องหมายคำพูด
วิธีที่ง่ายที่สุดในการรับขนาดทั้งหมดคือ powershell แต่ก็ยังถูก จำกัด ด้วยความจริงที่ว่าชื่อพา ธ ที่ยาวเกิน 260 อักขระจะไม่รวมอยู่ในทั้งหมด