2015-06-17 21 views
6

Czy istnieje sposób, aby uzyskać rozmiar na dysku pliku jak w oknie Właściwości:Czy istnieje sposób na wydrukowanie rozmiaru pliku na dysku w pakiecie?

Próbowałem:

(wewnątrz pliku wsadowego)

echo %~z1 

,

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

,

dir 

Ale zwracają tylko rozmiar pliku (ów).

Czy istnieje sposób na uzyskanie "rozmiaru na dysku", takiego jak ten, który został wyświetlony w oknie właściwości?

Odpowiedz

5

Interesujące pytanie. Nie jestem świadomy rozmiaru na wartości dysku będącego własnością dowolnego skryptowalnego obiektu. Można go obliczyć, pobierając modulo bajtów na klaster, odejmując ten modulo od rozmiaru pliku, a następnie dodając rozmiar klastra. (Edit: lub użyć bardziej wydajne obliczenia Aacini, który ja wciąż staram się zrozumieć.)

@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% 

Wiele stron internetowych twierdzą, że fsutil fsinfo ntfsinfo DRIVE: jest najlepszym sposobem, aby uzyskać bajtów na klaster. Wydaje się, że metoda ta jest pełna zagrożeń, z różnymi etykietami w zależności od ustawień regionalnych i różnej liczby linii dla różnych wersji systemu Windows. Dodatkowo, jak mówi Marged, fsutil wymaga podniesienia. Ta metoda WMI wydaje się bardziej uniwersalna i nie wymaga uprawnień administratora.

Dzięki JosefZ, Marged i Aacini za wszystkie uwagi!

+2

Używaj "bajtów na klaster" (np. 4096) zamiast "bajtów na sektor fizyczny" (np. 512). (Zweryfikowano na moim małym dysku SSD). Następnie 'set/a ondisk = (fs/clus +1) * clus)' – JosefZ

+0

Dzięki Josef! Nie byłem pewien, jaką wartość użyć, ponieważ są one takie same w systemie, w którym teraz działam. – rojo

+0

'findstr/i/C:" bajty na klaster "' zwróć uwagę na znaczenie przełącznika '/ C:'. Edytuj mój poprzedni komentarz: Następnie "set/a ondisk = (fs/clus +1) * clus' bez ciągnięcia') '. – JosefZ

2

To nie ma być odpowiedzią, tylko wartości @rojo zadane przez:

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 

To z niemieckiego systemu Windows 8.1. Myślę, że jeśli konieczne jest, aby partia była niezależna, nie można zastosować metody grepping. Zamiast tego skryptowanie odpowiedniego obiektu systemu plików za pomocą hosta skryptowego będzie jednym rozwiązaniem.

Komenda WMIC ma ten wynik ...

SOMENAME,4096,C:\ 

... plus zaletę, że nie ma potrzeby uruchamiania tego polecenia z uprawnieniami administratora.

+0

Dziękuję Marged. Tak długo, jak chcesz być moim pomocnikiem, możesz uruchomić 'wmic ścieżka win32_volume get name, blocksize/format: csv | findstr/i "c:" 'i powiedz mi, czy zwrócona wartość zawiera 4096? – rojo

+0

@rojo zaktualizował moją odpowiedź i zgodnie z oczekiwaniami działa to również w przypadku niemieckiego systemu Windows. Być może jest możliwe dodanie "where name = C:" lub podobnego do zapytania wmic. Chociaż twój skrypt jest świetny, myślę, że jest to przypadek graniczny, w którym można by pomyśleć o przejściu z partii do ulepszonego skryptowania. – Marged

+0

JosefZ zasugerował to samo. Dodałem sugerowaną zmianę i po prostu odrzuciłem całą metodę 'fsutil'. – rojo