2015-06-17 14 views
6

Có cách nào để có được kích thước trên đĩa của một tập tin như trong cửa sổ thuộc tính:Có cách nào để xuất kích thước tệp trên đĩa theo lô không?

Tôi đã thử:

(bên trong một tập tin batch)

echo %~z1 

,

for %i in (TestFile.txt) do echo %~zi 

,

dir 

Nhưng chúng chỉ trả về kích thước của tệp.

Có cách nào để có được "kích thước trên đĩa" giống như cái nhìn thấy trong cửa sổ thuộc tính không?

Trả lời

5

Câu hỏi thú vị. Tôi không nhận thức được kích thước trên đĩa giá trị là một tài sản của bất kỳ đối tượng scriptable. Bạn có thể tính toán nó bằng cách nhận được tập tin modulo byte cho mỗi cụm, trừ đi modulo đó từ kích thước tệp, sau đó thêm kích thước cụm. (Edit: hoặc sử dụng tính toán hiệu quả hơn Aacini, mà tôi vẫn đang cố gắng để hiểu được.)

@echo off 
setlocal 

for %%I in (Testfile.txt) do (
    set "fs=%%~zI" 
    for /f %%J in (
     'wmic volume where "driveletter='%%~dI'" get blocksize /value' 
    ) do 2>nul set /a %%J 
) 

echo Size: %fs% 

set /a ondisk = ((fs-1)/blocksize+1) * blocksize 

echo Size on disk: %ondisk% 

Nhiều trang web tuyên bố rằng fsutil fsinfo ntfsinfo DRIVE: là cách tốt nhất để có được những byte cho mỗi cluster. Dường như phương pháp này đầy nguy hiểm, với các nhãn khác nhau tùy thuộc vào miền địa phương và số dòng khác nhau cho các phiên bản Windows khác nhau. Ngoài ra, như Marged nói, fsutil yêu cầu độ cao. Phương pháp WMI này dường như hoạt động phổ biến hơn và không yêu cầu quyền quản trị.

Cảm ơn JosefZ, Marged và Aacini cho tất cả nội dung bạn đã nhập!

+2

Sử dụng 'Byte trên cụm '(ví dụ: 4096) thay vì' Bytes trên mỗi ngành vật lý' (ví dụ: 512). (Đã xác minh trên SSD _tiny_ của tôi). Sau đó, 'set/a ondisk = (fs/clus +1) * clus)' – JosefZ

+0

Cảm ơn Josef! Tôi không chắc chắn nên sử dụng giá trị nào vì chúng đều giống nhau trên hệ thống mà tôi đang sử dụng. – rojo

+0

'findstr/i/C:" byte trên mỗi cụm "' lưu ý tầm quan trọng chuyển đổi '/ C:'. Chỉnh sửa bình luận trước đó của tôi: Sau đó, 'set/a ondisk = (fs/clus +1) * clus' mà không theo đuôi') '. – JosefZ

2

này không có ý định trở thành một câu trả lời, chỉ là giá trị @rojo yêu cầu:

NTFS-Volumeseriennummer    0xacf01e6ef01e3ed0 
NTFS-Version :       3.1 
LFS-Version :     2.0 
Anzahl der Sektoren :    0x000000000ed737ff 
Gesamtzahl Cluster :    0x0000000001dae6ff 
Freie Cluster :      0x00000000008c8d41 
Insgesamt reserviert :    0x0000000000000f70 
Bytes pro Sektor :     512 
Bytes pro physischem Sektor :  512 
Bytes pro Cluster :     4096 
Bytes pro Dateidatensatzsegment : 1024 
Cluster pro Dateidatensatzsegment : 0 
Gültige MFT-Datenlänge :   0x000000001c1c0000 
MFT-Start-LCN :     0x00000000000c0000 
MFT2-Start-LCN :     0x0000000000000002 
MFT-Zonenstart :     0x00000000018a8ee0 
MFT-Zonenende :     0x00000000018b12e0 
Ressourcen-Manager-Bezeichner:  A81246B1-33B0-11E4-A94B-AEB4ABF863CB 

Đây là từ Windows Đức 8.1. Tôi nghĩ rằng nếu nó là cần thiết để làm cho miền địa phương lô độc lập, bạn không thể có cách tiếp cận grepping. Thay vào đó, kịch bản đối tượng hệ thống tập tin thích hợp bằng cách sử dụng máy chủ lưu trữ kịch bản sẽ là một giải pháp.

Lệnh WMIC có kết quả này ...

SOMENAME,4096,C:\ 

... cộng với lợi thế mà tôi không cần phải chạy lệnh này với quyền quản trị.

+0

Cảm ơn bạn Đã kết hôn. Miễn là bạn sẵn sàng trở thành tay sai của tôi, bạn có thể chạy 'wmic path win32_volume lấy tên, blocksize/format: csv | findstr/i "c:" 'và cho tôi biết liệu giá trị trả về có bao gồm 4096 không? – rojo

+0

@rojo đã cập nhật câu trả lời của tôi và như mong đợi, điều này cũng phù hợp với Windows của Đức. Có lẽ nó bằng cách nào đó có thể thêm một 'nơi name = C:' hoặc tương tự như truy vấn wmic. Mặc dù kịch bản của bạn là tuyệt vời Tôi nghĩ rằng đây là một trường hợp biên giới, nơi người ta có thể nghĩ đến việc chuyển đổi từ lô để cải thiện kịch bản. – Marged

+0

JosefZ cũng đề nghị điều tương tự. Tôi đã thêm thay đổi được đề xuất và chỉ xóa toàn bộ phương thức 'fsutil'. – rojo

Các vấn đề liên quan