Windows có thể lấy kích thước thư mục từ dòng lệnh mà không cần sử dụng bất kỳ công cụ của bên thứ 3 nào không?
Tôi muốn kết quả tương tự như bạn sẽ nhận được khi nhấp chuột phải vào thư mục trong windows explorer → thuộc tính.
Windows có thể lấy kích thước thư mục từ dòng lệnh mà không cần sử dụng bất kỳ công cụ của bên thứ 3 nào không?
Tôi muốn kết quả tương tự như bạn sẽ nhận được khi nhấp chuột phải vào thư mục trong windows explorer → thuộc tính.
Câu trả lời:
Bạn chỉ có thể thêm kích thước đệ quy (sau đây là tệp bó):
@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes
Tuy nhiên, điều này có một số vấn đề vì cmd
bị giới hạn ở số học số nguyên có chữ ký 32 bit. Vì vậy, nó sẽ nhận được kích thước trên 2 GiB sai 1 . Hơn nữa, nó có thể sẽ đếm các liên kết tượng trưng và các mối nối nhiều lần để nó tốt nhất là giới hạn trên, không phải là kích thước thật (mặc dù vậy, bạn sẽ gặp vấn đề với bất kỳ công cụ nào).
Một thay thế là PowerShell:
Get-ChildItem -Recurse | Measure-Object -Sum Length
hoặc ngắn hơn:
ls -r | measure -sum Length
Nếu bạn muốn nó đẹp hơn:
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" }
}
Bạn có thể sử dụng trực tiếp từ cmd
:
powershell -noprofile -command "ls -r|measure -sum Length"
1 Tôi có một thư viện bignum đã hoàn thành một phần trong các tệp bó ở đâu đó mà ít nhất là được thêm số nguyên chính xác tùy ý. Tôi thực sự nên phát hành nó, tôi đoán :-)
du
cung cấp kích thước thư mục nhưng tất cả những gì nó làm là đi trên cây và tóm tắt. Một cái gì đó có thể được thể hiện rất thanh lịch trong một đường ống như ở đây :-). Vì vậy, đối với PowerShell, tôi thường tìm cách bạn có thể phân tách mục tiêu cấp cao thành các hoạt động cấp thấp hơn phù hợp.
folder\*
không làm việc cho tôi kích thước của thư mục mà tôi đặt ở vị trí hiển thị 0 byte, Có giải pháp nào không?
Có một công cụ Windows tích hợp sẵn cho việc đó:
dir /s 'FolderName'
Điều này sẽ in rất nhiều thông tin không cần thiết nhưng cuối cùng sẽ là kích thước thư mục như thế này:
Total Files Listed:
12468 File(s) 182,236,556 bytes
Nếu bạn cần bao gồm các thư mục ẩn thêm /a
.
Tôi đề nghị tải xuống tiện ích DU từ Sysiternals Suite do Microsoft cung cấp tại liên kết này http://technet.microsoft.com/en-us/sysi INTERNals / 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
Trong khi bạn đang ở đó, hãy xem các tiện ích khác. Chúng là một trình bảo vệ cuộc sống cho mọi Windows Professional
\\live.sysinternals.com
nếu vẫn còn tồn tại). Mặc dù vậy, tôi hoàn toàn đồng ý rằng tất cả các công cụ hệ thống phải được bao gồm theo mặc định. Mặc dù đối với nhiều mục đích sử dụng, PowerShell là một sự thay thế khá xứng đáng.
Lót:
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"
Tương tự nhưng chỉ 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
Điều này sẽ tạo ra kết quả sau:
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
Tôi có thể tối ưu hóa điều này cho tất cả thư mục không, đã thử với tư cách quản trị viên
ft
( Format-Table
) hoạt động. Bạn có thể thử fl
thay thế ( Format-List
)
Tôi khuyên bạn nên sử dụng https://github.com/aleksaan/diskusage tiện ích. Rất đơn giản và hữu ích. Và rất nhanh.
Chỉ cần gõ vào một shell lệnh
diskusage.exe -path 'd:/go; d:/Books'
và nhận danh sách các thư mục được sắp xếp theo kích thước
1. | TRỰC TIẾP: d: / đi | KÍCH THƯỚC: 325,72 Mb | SỞ: 1 2. | TRỰC TIẾP: d: / Sách | KÍCH THƯỚC: 14.01 Mb | SỞ: 1
Ví dụ này được thực hiện ở tốc độ 272ms trên ổ cứng.
Bạn có thể tăng độ sâu của các thư mục con để phân tích, ví dụ:
diskusage.exe -path 'd:/go; d:/Books' -depth 2
và nhận kích thước không chỉ cho các thư mục được chọn mà còn cho các thư mục con của nó
1. | TRỰC TIẾP: d: / đi | KÍCH THƯỚC: 325,72 Mb | SỞ: 1 2. | TRỰC TIẾP: d: / đi / pkg | KÍCH THƯỚC: 212,88 Mb | SỞ: 2 3. | TRỰC TIẾP: d: / go / src | KÍCH THƯỚC: 62,57 Mb | SỞ: 2 4. | TRỰC TIẾP: d: / go / bin | KÍCH THƯỚC: 30,44 Mb | SỞ: 2 5. | TRỰC TIẾP: d: / Sách / Cờ vua | KÍCH THƯỚC: 14.01 Mb | SỞ: 2 6. | TRỰC TIẾP: d: / Sách | KÍCH THƯỚC: 14.01 Mb | SỞ: 1 7. | TRỰC TIẾP: d: / go / api | KÍCH THƯỚC: 6,41 Mb | SỞ: 2 8. | TRỰC TIẾP: d: / đi / kiểm tra | KÍCH THƯỚC: 5,11 Mb | SỞ: 2 9. | TRỰC TIẾP: d: / go / doc | KÍCH THƯỚC: 4,00 Mb | SỞ: 2 10. | TRỰC TIẾP: d: / go / misc | KÍCH THƯỚC: 3,82 Mb | SỞ: 2 11. | TRỰC TIẾP: d: / go / lib | KÍCH THƯỚC: 358,25 Kb | SỞ: 2
* 3.5Tb trên máy chủ đã được quét trong 3 triệu giây
Ở đây có một mã powershell tôi viết vào danh sách kích thước và số tập tin cho tất cả các thư mục trong thư mục hiện tại. Hãy sử dụng lại hoặc sửa đổi theo nhu cầu của bạn.
$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}} }
Điều này sẽ cung cấp các đối tượng (nhiều Powershell-ish), 'FileCount' và 'Size' là các số nguyên (để bạn có thể xử lý chúng sau, nếu cần) và 'Kích thước' tính bằng byte, nhưng bạn có thể dễ dàng chuyển đổi nó thành byte GB (hoặc đơn vị bạn muốn) với $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}} }
Mã này đã được thử nghiệm. Bạn có thể kiểm tra lại.
@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
Tôi đoán điều này sẽ chỉ hoạt động nếu thư mục khá tĩnh và nội dung của nó không thay đổi giữa việc thực hiện hai lệnh dir. Có thể một cách để kết hợp điều này thành một lệnh để tránh điều đó, nhưng cách này hiệu quả với mục đích của tôi (tôi không muốn liệt kê đầy đủ; chỉ là tóm tắt).
Tập lệnh 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%
Sử dụng:
GetDirSummary.bat c: \ temp
Đầu ra:
Total Files Listed:
22 File(s) 63,600 bytes
8 Dir(s) 104,350,330,880 bytes free
Tôi đã nhận được du.exe
với phân phối git của tôi. Một nơi khác có thể là Microsoft hoặc Unxutils đã nói ở trên .
Một khi bạn có du.exe trong đường dẫn của bạn. Đây là 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
Tôi nghĩ rằng tùy chọn duy nhất của bạn sẽ là diruse (một giải pháp bên thứ 3 được hỗ trợ cao):
Nhận kích thước tập tin / thư mục từ dòng lệnh
Windows CLI không may bị hạn chế khá nhiều, bạn có thể cài đặt Cygwin một cách mơ ước để sử dụng so với cmd. Điều đó sẽ cung cấp cho bạn quyền truy cập vào công cụ Unix được chuyển sang, đó là nền tảng của diruse trên windows.
Xin lỗi tôi không thể trả lời câu hỏi của bạn trực tiếp bằng lệnh bạn có thể chạy trên cli bản địa.
:: Nhận một số dòng mà lệnh Dir trả về (/ -c để loại bỏ dấu tách số:.,) ["Tokens = 3" để chỉ nhìn vào cột thứ ba của mỗi dòng trong Dir]
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1
Số dòng áp chót, trong đó là số byte của tổng số tệp:
set /a line=%i%-1
Cuối cùng nhận được số byte trong dòng áp chót - cột thứ 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%
Vì nó không sử dụng tìm kiếm từ nên nó sẽ không gặp vấn đề về ngôn ngữ.
Hạn chế:
Thử:
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
Thay đổi C: \ Chương trình tệp thành bất kỳ thư mục nào bạn muốn và thay đổi% A thành %% A nếu sử dụng trong một tệp bó
Nó trả về kích thước của toàn bộ thư mục, bao gồm các thư mục con và các tệp hệ thống và ẩn và hoạt động với các thư mục trên 2GB
Nó ghi vào màn hình, vì vậy bạn sẽ phải sử dụng tệp tạm thời nếu bạn không muốn điều đó.
Tập lệnh sau có thể được sử dụng để tìm nạp và tích lũy kích thước của mỗi tệp trong một thư mục nhất định.
Đường dẫn thư mục %folder%
có thể được cung cấp làm đối số cho tập lệnh này ( %1
).
Cuối cùng, kết quả được giữ trong tham số%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
Lưu ý: Phương pháp calcAccSize
cũng có thể in nội dung của thư mục (nhận xét trong ví dụ trên)
Vì vậy, đây là một giải pháp cho cả hai yêu cầu của bạn theo cách bạn yêu cầu ban đầu. Nó sẽ cung cấp cho con người khả năng đọc tập tin mà không có giới hạn tập tin mọi người đang gặp phải. Tương thích với Win Vista hoặc mới hơn. XP chỉ khả dụng nếu Robocopy được cài đặt. Chỉ cần thả một thư mục trên tệp bó này hoặc sử dụng phương pháp tốt hơn được đề cập dưới đây.
@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
Để có thể sử dụng tệp bó này một cách thuận tiện, hãy đặt nó vào thư mục SendTo của bạn. Điều này sẽ cho phép bạn nhấp chuột phải vào một thư mục hoặc lựa chọn các thư mục, nhấp vào tùy chọn SendTo, sau đó chọn tệp bó này.
Để tìm thư mục SendTo trên máy tính của bạn, cách đơn giản nhất là mở cmd sau đó sao chép trong dòng này.
explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo
Tôi đã giải quyết vấn đề tương tự. Một số phương pháp trong trang này chậm và một số có vấn đề trong môi trường đa ngôn ngữ (tất cả đều giả sử tiếng Anh). Tôi tìm thấy cách giải quyết đơn giản bằng cách sử dụng vbscript trong cmd. Nó được thử nghiệm trong W2012R2 và 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))
Nó đặt biến môi trường S_. Tất nhiên, bạn có thể thay đổi dòng cuối cùng để hiển thị kết quả trực tiếp thành vd
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))
Bạn có thể sử dụng nó như chương trình con hoặc cmd standlone. Tham số là tên của thư mục được kiểm tra đóng trong dấu ngoặc kép.